Diskuze: databáze, SQL, LIKE a písmeno "č"

PHP PHP databáze, SQL, LIKE a písmeno "č" American English version English version

Avatar
Snorlax
Redaktor
Avatar
Snorlax:

Zdravím, mám problém s databází.. mám tento kus kódu:

$sql = "SELECT * FROM `tabulka` WHERE `NAZEV` LIKE '%$search%'";//vyhledej
foreach($db->query($sql) as $data)
{
echo "....";//výpis záznamů
}

A funguje, až na to že, jsem objevil problém u písmene č. Dám příklad. Mám v sloupci podle kterého hledám slovo "počítač" a já dám hledat "poč". SQL tedy vypadá

SELECT * FROM `tabulka` WHERE `NAZEV` LIKE '%poč%'

Pokud tohle SQL zadám do PHPMyAdmin tak to najde, ale PHP ne. Error to nehlásí, prostě jako bych tam zadal něco co není. Ovšem pokud zadám třeba "ta" (počítač) tak to už najde. Tipuju že problém bude někde v kódování. Sloupec má kódování utf8_czech_ci a připojení k db vypadá takhle:

<?php

//připojení na databázi -> PDO

define("dbserver", "127.0.0.1"); // adresa
define("dbuser", "***"); //jméno uživatele
define("dbpass", "***"); // heslo uživatele
define("dbname", "***"); //databáze

$db = new PDO(
                "mysql:host=" .dbserver. ";dbname=" .dbname,dbuser,dbpass,
                array(
                        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                        PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
                )
        );

?>

Pokud na nic nepřijdu tak budu muset udělat funkci, která tyhle podivný znaky (zkusim zjistit jaký všechny to jsou) nahradí "$" ($ nahradí jeden znak zatímco % neurčitý počet... pokud se nepletu :D ). Pak by to SQL vypadalo třeba takhle:

SELECT * FROM `tabulka` WHERE `NAZEV` LIKE '%o$ít%'

Ale radši bych byl za vyřešení jiným způsobem. Předem díky za rady :)

Odpovědět 7.12.2013 17:16
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Snorlax
Kit:

Zkus smazat řádek

PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
Nahoru Odpovědět  +1 7.12.2013 17:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Kit
Snorlax:

Wow ono to funguje! Díky moc! A co že jsem to smazal? :D

Nahoru Odpovědět 7.12.2013 17:57
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Snorlax
Kit:

Tím řádkem sis totiž přepisoval předchozí řádek, který je pro správné kódování podstatný. Všimni si, že oba řádky měly v poli stejný index. Kdybys je měl naopak, tak bys tento problém neřešil.

Nahoru Odpovědět  +1 7.12.2013 18:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Kit
Snorlax:

Aha ok tak dík... Já tušil že bude problém v kódování...

Nahoru Odpovědět 7.12.2013 18:01
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Snorlax
Kit:

Ještě si zkus to pole upravit takto:

array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)

Pokud se v SQL vyskytne chyba, bude ti to vyhazovat výjimky. Docela jsem se natrápil, než jsem na tohle přišel. Teď už nepoužívám to obligátní "or die()", už tam nemusím dávat vůbec nic.

Nahoru Odpovědět  +1 7.12.2013 19:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Snorlax
Redaktor
Avatar
Odpovídá na Kit
Snorlax:

ok to se bude hodit. díky moc

Nahoru Odpovědět 7.12.2013 22:38
Kdo chce pochopit, pochopí. Kdo dělá že chce pochopit, může pouze dělat, že pochopil...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.