Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PDO] Budowa wyszukiwarki
DonJeday
post
Post #1





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Witam,

Jestem w trackie budowy wyszukiwarki wyszukującej osoby. Mój problem polega na tym że nie wiem gdzie mam błąd, że nie zwraca mi wyników



  1. <?php
  2.  
  3.  
  4.  
  5. case 'personal':
  6. $wh = array();
  7. if (!empty($_POST['imie']))
  8.    $wh[] = "imie = '$_POST[imie]' ";  
  9.  
  10. if (!empty($_POST['nazwisko']))
  11.    $wh[] = "nazwisko = '$_POST[nazwisko]' ";  
  12.  
  13. if (!empty($_POST['miasto']))
  14.    $wh[] = "miasto = '$_POST[miasto]' ";  
  15.  
  16. if (!empty($_POST['rocznik']))
  17.    $wh[] = "rocznik = '$_POST[rocznik]' ";  
  18.  
  19. if (!empty($wh)) 
  20.    $where = implode(' and ', $wh); 
  21. else 
  22.    $where = ''; 
  23.  
  24.    
  25. $pdo = new PDO('mysql:host=localhost;dbname=h', 'b', 'f3',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  26. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  27. $query = $pdo -> prepare('SELECT * FROM users WHERE :where'); 
  28. $query -> bindValue(':where', $where, PDO::PARAM_STR);
  29. $query -> execute();
  30.  
  31. $aImie = array();
  32. while($row = $query -> fetch(PDO::FETCH_ASSOC)) {
  33.          $aImie[] = $row;
  34.      }
  35.   
  36. $query -> closeCursor();
  37.  
  38. $smarty->assign('data', $aImie);
  39. $smarty->display(search_results.tpl);
  40.  
  41. break;
  42.  
  43.  
  44.  
  45. ?>




Co jest nie tak. Dodam że w standartowych zapytaniach jest ok, ale po przeróbce na pdo już nie zwraca wynikóe, żadnych błędów itp.

Ten post edytował DonJeday 24.11.2008, 19:09:40
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Przyjrzyj się:
  1. <?php
  2. $query -> bindValue(':where', $where, PDO::PARAM_STR);
  3. ?>


Jak podstawić wiele warunków do zapytania? W tej chwili podstawiasz tablicę, a jaką składnię ma WHERE + wiele warunków? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)

PS. Poza tym, pokopały Ci się cudzysłowy.

Ten post edytował erix 24.11.2008, 18:47:39
Go to the top of the page
+Quote Post
DonJeday
post
Post #3





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Cudzysłowy pokopały mi się przy usówaniu danych połączenia z bazą ^^



tzn. tak jak mam przekazać wiele tych warunków?
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Jak? Tak samo, jak w instrukcjach warunkowych. PS. Google: MySQL WHERE i znajdziesz odpowiedź. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
DonJeday
post
Post #5





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Nie rozumiem, chodzi ci o warunki w zapytaniu to przecież dodaje składnie z warunkami
  1. <?php
  2. $where = implode(' and ', $wh);
  3. ?>
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Pardon, mój błąd, napisałeś ten kod podobnie do dodawania pól w warunkach, że przeoczyłem...

A próbowałeś łapać wyjątek PDOException na operacjach do bazy?
Go to the top of the page
+Quote Post
DonJeday
post
Post #7





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Cytat(erix @ 24.11.2008, 20:18:29 ) *
A próbowałeś łapać wyjątek PDOException na operacjach do bazy?




Nie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nigdy tego nie potrzebowałem ^^

Jak to w ogóle użyć? Czy
  1. <?php
  2. PDOException extends RuntimeException {
  3.  
  4. }
  5. ?>


Wrzucam w try {} ? Czy przed try?

Ten post edytował DonJeday 24.11.2008, 20:27:04
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Użycie masz opisane na tej samej stronie manuala, gdzie znalazłeś ten kawałek.
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




No właśnie. (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Napisałeś wcześniej:
Cytat
Co jest nie tak. Dodam że w standartowych zapytaniach jest ok, ale po przeróbce na pdo już nie zwraca wynikóe, żadnych błędów itp.

Zobacz najpierw, czy nie ma jakichś wyjątków.
Go to the top of the page
+Quote Post
DonJeday
post
Post #10





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Nawiązując do PDOException

Oto ci chodzi? :
  1. <?php
  2. try {
  3. $pdo = new PDO('mysql:host=localhost;dbname=e', 'e', 'f',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  4. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5. $query = $pdo -> prepare('SELECT * FROM users WHERE :where');
  6. $query -> bindValue(':where', $where, PDO::PARAM_STR);
  7. $query -> execute();
  8.  
  9. $aImie = array();
  10. while($row = $query -> fetch(PDO::FETCH_ASSOC)) {
  11.            $aImie[] = $row;
  12.        }
  13.        
  14. $query -> closeCursor();
  15. }
  16.        catch(PDOException $e) {
  17.              echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  18.        }
  19. ?>
Go to the top of the page
+Quote Post
erix
post
Post #11





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Właśnie.

Ale w bloku catch lepiej będzie dać var_dump" title="Zobacz w manualu PHP" target="_manual z parametrem $e; więcej info dostaniesz.

A w ogóle, coś wypluwa?
Go to the top of the page
+Quote Post
DonJeday
post
Post #12





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Problem leży w
$where = implode(' and ', $wh);

Bez tego wyszukiwarka działa ale teraz nie mam jak łączyc warunków, jak to zastąpić?

Ten post edytował DonJeday 24.11.2008, 22:09:21
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Problem leży w
$where = implode(' and ', $wh);

Na jakiej podstawie to stwierdziłeś? Może sprawdź składnie finalnie uzyskiwanego zapytania, spróbuj je wywołać w konsoli MySQL/phpMyAdmin.
Go to the top of the page
+Quote Post
DonJeday
post
Post #14





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Stwierdziłem to po tym, że mój kolega też ma problem z implode w PDO. Poza tym jak usunałem tą linijkę i bardziej sformułowałem zapytanie poszło, ale bez implode ani rusz...
Go to the top of the page
+Quote Post
erix
post
Post #15





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Napisałem, co masz zrobić. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
DonJeday
post
Post #16





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Zrobiłem i zapytanie w takiej formie wyszukało mnie w bazie...
Go to the top of the page
+Quote Post
erix
post
Post #17





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




W takiej formie, czy dokładnie takie, jakie wygenerowało PHP?
Go to the top of the page
+Quote Post
DonJeday
post
Post #18





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


  1. SELECT * FROM users WHERE imie = 'Łukasz' AND nazwisko = 'Czyż' AND miasto = 'Częstochowa' AND rocznik ='1991';

Normalnie wyświetliło mój rekord. A dokłądnie takie zapytanie powinno wejśc w PDO i wchodzi ale nie wyświetla wyników...

Ten post edytował DonJeday 24.11.2008, 22:34:29
Go to the top of the page
+Quote Post
erix
post
Post #19





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Hmm, wydaje mi się, że Twój problem dotyczy różnych systemów kodowań w bazie i na stronie. Spróbuj wyciągnąć rekordy szukając po ID, czy sytuacja się powtórzy.
Go to the top of the page
+Quote Post
DonJeday
post
Post #20





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Napewno nie kodowanie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Cały system napisałem w PDO wszystko w UTF i nigdzie nie było problemu z selectem do momentu gdy zacząłem pisać wyszukiwarkę. BTW. pisałem że jeśli ogranicze i bardziej sformułuje zapytanie to wyszukiwanie działa. To napewno przez implode tylko nie wiem jak to zastąpić.
Go to the top of the page
+Quote Post
webdice
post
Post #21


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Bindowanie parametrów działa tylko dla wartości pól. To znaczy że nie możesz sobie zrobić np.

  1. SELECT * FROM `table` WHERE `id` IN(:IDs)


Pozostaje Ci tylko:

  1. <?php
  2. $query = $pdo -> prepare('SELECT * FROM users WHERE ' . implode(' and ', $wh));
  3. ?>


ale w tym wypadku nie ma potrzeby bindowania parametrów, więc zmień prepare na query i usuń execute.
Go to the top of the page
+Quote Post
DonJeday
post
Post #22





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


Dobra wszystko zrobione działa elegancko (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) execute nie potrzeba usunąć (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Efekt końcowy (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

  1. <?php
  2.  
  3. case 'personal': //Wyszukuje według personalii
  4.  
  5. $wh = array();
  6. if (!empty($_POST['imie'])) {
  7.   $wh[] = "imie = '$_POST[imie]' ";  
  8. }
  9. if (!empty($_POST['nazwisko'])) {
  10.   $wh[] = "nazwisko = '$_POST[nazwisko]' ";  
  11. }
  12. if (!empty($_POST['pseudonim'])) {
  13.   $wh[] = "pseudonim = '$_POST[pseudonim]' ";  
  14. }
  15. if (!empty($_POST['miasto'])) {
  16.   $wh[] = "miasto = '$_POST[miasto]' ";  
  17. }
  18. if (!empty($_POST['rocznik'])) {
  19.   $wh[] = "rocznik = '$_POST[rocznik]' ";  
  20. }
  21. if (!empty($_POST['telefon'])) {
  22.   $wh[] = "telefon = '$_POST[telefon]' ";  
  23. }
  24. if (!empty($wh)) {
  25.   $where = implode(' and ', $wh);
  26.  
  27.  
  28. try {
  29.    $pdo = new PDO('mysql:host=localhost;dbname=b', 'b', 'f',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  30.    $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  31.    $query = $pdo -> query('SELECT * FROM users WHERE ' . implode(' and ', $wh));
  32.    $query -> execute();
  33.    $aImie = array();
  34.    while($row = $query -> fetch(PDO::FETCH_ASSOC)) {
  35.        $aImie[] = $row;
  36.        $i++;
  37.    }
  38.        
  39.    $query -> closeCursor();
  40. }    catch(PDOException $e) {
  41.    echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  42. }
  43.    if($aImie == true) {
  44.        $smarty->assign('is', $i);
  45.        $smarty->assign('data', $aImie);
  46.        $smarty->display('search_results.tpl');
  47.    } else {
  48.    $smarty->assign('style','error');
  49.    $smarty->assign('message_title','Brak wyników!');
  50.    $smarty->assign('message_text','Nie udało się odnaleść profilu według podanych kryteriów.');
  51.    $smarty->assign('message_back','../search/');
  52.    $smarty->display('message.tpl');
  53.    }
  54. } else {
  55.    $smarty->assign('style','error');
  56.    $smarty->assign('message_title','Brak wyników!');
  57.    $smarty->assign('message_text','Nie udało się odnaleść profilu według podanych kryteriów.');
  58.    $smarty->assign('message_back','../search/');
  59.    $smarty->display('message.tpl');
  60. }
  61.  
  62. break;
  63.  
  64. ?>



A jeszcze jak by można się dowiedzieć, jak zrobić by wyszukiwanie nie było takie szczegółowe, że np. dam kawałek numeru telefonu to mi wyświetli osoby z takim kawałkiem numeru. Próbowałem LIKE ale coś nie wychodziło ^^
Go to the top of the page
+Quote Post
erix
post
Post #23





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Próbowałem LIKE ale coś nie wychodziło

Bo właśnie potrzebujesz LIKE. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Pokaż najpierw, jak próbowałeś, bo kawy nie piję i nie mam jak wróżyć. ;P
Go to the top of the page
+Quote Post
Riklaunim
post
Post #24





Grupa: Zarejestrowani
Postów: 640
Pomógł: 44
Dołączył: 8.02.2004

Ostrzeżenie: (0%)
-----


Taka mała notka: LIKE czy ILIKE nie nadaje się do wyszukiwania po dużych ilościach rekordów - wtedy Sphinx, Xapian lub inne narzędzie przeznaczone do bycia wyszukiwarką (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
DonJeday
post
Post #25





Grupa: Zarejestrowani
Postów: 113
Pomógł: 0
Dołączył: 24.10.2008
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


  1. <?php
  2.  
  3. $wh = array();
  4. if (!empty($_POST['imie'])) {
  5.  $wh[] = "telefon LIKE '$_POST[telefon]' ";  
  6. }
  7.  
  8. ?>


Tak próbowałem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował DonJeday 25.11.2008, 17:01:17
Go to the top of the page
+Quote Post
Crozin
post
Post #26





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  1. telefon LIKE 'test'
Działa właściwie jak
  1. telefon = 'test'
Użyj
  1. telefon LIKE '%test%'
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.09.2025 - 13:58