18 Maj 2008, 16:21
Staszek27

Drodzy Grupowicze!
Natknąłem się na problem, którego nie jestem w stanie ogarnąć umysłem.
Wydaje się, że wynik z bazy otrzymany w PHP przez PDO jest inny niż
ten widziany w phpmyadmin. Oto opis tego co widzę:

Informacje:
Baza danych: MySQL 5.0.51a
PHP: PHP 5.2.5
Struktura:

`prezydenci` w bazie `iiirp`
imieinazwisko   text    utf8_polish_ci
poczatekkadencji        mediumint(9)

Zawartość bazy:

imieinazwisko   poczatekkadencji
Wojciech Jaruzelski     1989
Lech Wałęsa   1990
Aleksander Kwaśniewski 1995
Aleksander Kwaśniewski 2000
Lech Kaczyński 2005

1) Zapytanie przez phpmyadmin:

SELECT COUNT(*) AS liczba FROM `prezydenci` WHERE 'aleksander-
kwasniewski' =
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REP­LACE(LOWER(`imieinazwisko`),
'ź', 'z'), 'ż', 'z'), 'ś', 's'), 'ó', 'o'), 'ń', 'n'), 'ł', 'l'), 'ę',
'e'), 'ć', 'c'), 'ą', 'a'), ' ', '-')

zwraca:

liczba
2

OBSERWACJE: Wynik jest zgodny z oczekiwanym.
2) Zapytanie przez PHP:

Kod:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

header('Content-Type: text/html; charset=utf-8');
try {
        $PDO = new PDO('mysql:host=localhost;dbname=iiirp', 'root', '');
        $PDO-exec('SET CHARSET utf8');

        $query = $PDO-prepare("SELECT COUNT(*) AS liczba FROM `prezydenci`
WHERE ':imieinazwisko' =
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REP­LACE(LOWER(`imieinazwisko`),
'ź', 'z'), 'ż', 'z'), 'ś', 's'), 'ó', 'o'), 'ń', 'n'), 'ł', 'l'), 'ę',
'e'), 'ć', 'c'), 'ą', 'a'), ' ', '-')");
        $query-bindValue(':imieinazwisko', $_GET['imieinazwisko']);
        $query-execute();
        $result = $query-fetch(PDO::FETCH_ASSOC);
        echo 'START' . $_GET['imieinazwisko'] . "STOP\n";
        print_r($result);

}



catch(PDOException $e) {
        echo $e-getMessage();
}



?

Dla '?imieinazwisko=wojciech-jaruzelski' zwraca:

STARTwojciech-jaruzelskiSTOP Array ( [liczba] =0 )

OBSERWACJE: Wynik jest niezgodny z oczekiwanym, ponadto różni się od
otrzymanego za pomocą phpmyadmin.

Jestem tym szczerze zaskoczony. Dlaczego tak się dzieję i jak temu
zaradzić?
Z góry dziękuję za pomoc,
Stanisław Polański




18 Maj 2008, 18:17
SasQ


SELECT COUNT(*) AS liczba FROM `prezydenci` WHERE
'aleksander-kwasniewski' =
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE



(REPLACE(LOWER(`imieinazwisko`),

'ź', 'z'), 'ż', 'z'), 'ś', 's'), 'ó', 'o'), 'ń', 'n'), 'ł', 'l'), 'ę',
'e'), 'ć', 'c'), 'ą', 'a'), ' ', '-')



Nie wiem jak z PDO, ale czy takie "przygotowywanie danych", jak
to powyżej, nie powinno być raczej sprawą warstwy logicznej [PHP],
a nie bazy? Wogóle to jeśli w bazie trzymasz i tak nazwy z
pliterkami, to chyba lepiej wyszukiwać z nimi? A jeśli użytkownicy
wprowadzają dane w innym kodowaniu, to przecież można je konwertować
po stronie PHP na odpowiednią stronę kodową.


19 Maj 2008, 04:57
mib


1) Zapytanie przez phpmyadmin:

SELECT COUNT(*) AS liczba FROM `prezydenci` WHERE 'aleksander-
kwasniewski' =
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REP­­LACE(LOWER(`imieinazwisko`),
'ź', 'z'), 'ż', 'z'), 'ś', 's'), 'ó', 'o'), 'ń', 'n'), 'ł', 'l'), 'ę',
'e'), 'ć', 'c'), 'ą', 'a'), ' ', '-')

zwraca:

liczba
2
2) Zapytanie przez PHP:
        $query = $PDO-prepare("SELECT COUNT(*) AS liczba FROM `prezydenci`
WHERE ':imieinazwisko' =
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REP­­LACE(LOWER(`imieinazwisko`),
'ź', 'z'), 'ż', 'z'), 'ś', 's'), 'ó', 'o'), 'ń', 'n'), 'ł', 'l'), 'ę',
'e'), 'ć', 'c'), 'ą', 'a'), ' ', '-')");



W zapytaniu z kodu PHP masz wstawiony dwukropek - czy jest konieczny?

WHERE ':imieinazwisko' =



Pozdrawiam


19 Maj 2008, 05:04
kamyk


W zapytaniu z kodu PHP masz wstawiony dwukropek - czy jest konieczny?

WHERE ':imieinazwisko' =



dwukropek jest dla tej funkcji:
http://de.php.net/manual/en/pdostatement.bindvalue.php




19 Maj 2008, 05:10
kamyk

$query = $PDO-prepare("SELECT COUNT(*) AS liczba FROM `prezydenci`
WHERE ':imieinazwisko' =
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(RE­PLACE(LOWER(`imieinazwisko`),'ź',
'z'), 'ż', 'z'), 'ś', 's'), 'ó', 'o'), 'ń', 'n'), 'ł', 'l'), 'ę', 'e'),
'ć', 'c'), 'ą', 'a'), ' ', '-')");



sprobuj usunac apostrofy przy :imieinazwisko


20 Maj 2008, 11:01
Staszek27


sprobuj usunac apostrofy przy :imieinazwisko



Zadziałało tam gdzie trzeba (domowy dalej bruździ)! Serdecznie
dziękuję za odpowiedź! Dla mnie to kolejny dowód na to, że jeśli uczyć
się czegokolwiek to tylko z instrukcji dostaraczanej przez wydawcę
tego czegoś...
Sasq: Takie przygotowanie wydaje mi się najodpowiedniejsze. Jeśli
dostaję dane bez ogonków to muszę jakoś zmienić dane z bazy. Dane,
które ogonki posiadają. Wyciąganie ileśtam rekordów tylko po to by w
PHP każdy z nich porównać z żądaniem wydaje mi się złym pomysłem. Może
masz inny, lepszy pomysł (pytam poważnie, bo jest wg mnie dobry, ale
mogę się mylić :-)).
Pozdrawiam,
Stanisław Polański

20 Maj 2008, 11:07
pakalk



Zadziałało tam gdzie trzeba (domowy dalej bruździ)! Serdecznie
dziękuję za odpowiedź! Dla mnie to kolejny dowód na to, że jeśli uczyć
się czegokolwiek to tylko z instrukcji dostaraczanej przez wydawcę
tego czegoś...
Sasq: Takie przygotowanie wydaje mi się najodpowiedniejsze. Jeśli
dostaję dane bez ogonków to muszę jakoś zmienić dane z bazy. Dane,
które ogonki posiadają. Wyciąganie ileśtam rekordów tylko po to by w
PHP każdy z nich porównać z żądaniem wydaje mi się złym pomysłem. Może
masz inny, lepszy pomysł (pytam poważnie, bo jest wg mnie dobry, ale
mogę się mylić :-)).
Pozdrawiam,
Stanisław Polański
--http://www.kolej.to.pl/



where imienazwisko like 'xxx'

set names xxx

poczytaj, pomoze moze


20 Maj 2008, 13:51
Artur Muszyński


Sasq: Takie przygotowanie wydaje mi się najodpowiedniejsze. Jeśli
dostaję dane bez ogonków to muszę jakoś zmienić dane z bazy. Dane,
które ogonki posiadają. Wyciąganie ileśtam rekordów tylko po to by w
PHP każdy z nich porównać z żądaniem wydaje mi się złym pomysłem. Może
masz inny, lepszy pomysł (pytam poważnie, bo jest wg mnie dobry, ale
mogę się mylić :-)).



Odwrotnie: dodaj do tabeli imienazwisko_bez_ogonkow.
PS: W postgresie byłoby łatwo:
lower(to_ascii(imienazwisko))=lower(to_ascii('kWaśNieWski'))

artur


php + redhat 7.2 || redhat 7.1
nowy php nowy problem ;)
Zapytanie mysql (mysql) w php
PHP i pole <select></select>
jak uzyskac w php '/' ? [newbe]
kompilacja PHP z imap'em i imap-ssl
Zend Encoder vs ionCube PHP Encoder 3
  • emilia plater byla zona
  • emocjonalne jedzenie 100
  • fox jones
  • mniejszosci wyznaniowe
  • najB3adniejsze chB3opaki w wieku 13
  • darmowe motywy do B6ciB1gniEAcia
  • wybory i po wyborach czas rzadzic ale jak 6
  • sound blaster x fi x
  • umowa na usB3ugEA
  • Zestawienie wypowiedzi z for internetowych ; Index