Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PDO] Budowa wyszukiwarki
Forum PHP.pl > Forum > PHP
DonJeday
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.
erix
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? snitch.gif

PS. Poza tym, pokopały Ci się cudzysłowy.
DonJeday
Cudzysłowy pokopały mi się przy usówaniu danych połączenia z bazą ^^



tzn. tak jak mam przekazać wiele tych warunków?
erix
Jak? Tak samo, jak w instrukcjach warunkowych. PS. Google: MySQL WHERE i znajdziesz odpowiedź. smile.gif
DonJeday
Nie rozumiem, chodzi ci o warunki w zapytaniu to przecież dodaje składnie z warunkami
  1. <?php
  2. $where = implode(' and ', $wh);
  3. ?>
erix
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?
DonJeday
Cytat(erix @ 24.11.2008, 20:18:29 ) *
A próbowałeś łapać wyjątek PDOException na operacjach do bazy?




Nie 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?
erix
Użycie masz opisane na tej samej stronie manuala, gdzie znalazłeś ten kawałek.
erix
No właśnie. 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.
DonJeday
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. ?>
erix
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?
DonJeday
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ć?
erix
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.
DonJeday
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...
erix
Napisałem, co masz zrobić. winksmiley.jpg
DonJeday
Zrobiłem i zapytanie w takiej formie wyszukało mnie w bazie...
erix
W takiej formie, czy dokładnie takie, jakie wygenerowało PHP?
DonJeday
  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...
erix
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.
DonJeday
Napewno nie kodowanie 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ć.
webdice
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.
DonJeday
Dobra wszystko zrobione działa elegancko winksmiley.jpg execute nie potrzeba usunąć winksmiley.jpg

Efekt końcowy 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 ^^
erix
Cytat
Próbowałem LIKE ale coś nie wychodziło

Bo właśnie potrzebujesz LIKE. winksmiley.jpg

Pokaż najpierw, jak próbowałeś, bo kawy nie piję i nie mam jak wróżyć. ;P
Riklaunim
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ą smile.gif
DonJeday
  1. <?php
  2.  
  3. $wh = array();
  4. if (!empty($_POST['imie'])) {
  5.  $wh[] = "telefon LIKE '$_POST[telefon]' ";  
  6. }
  7.  
  8. ?>


Tak próbowałem smile.gif
Crozin
  1. telefon LIKE 'test'
Działa właściwie jak
  1. telefon = 'test'
Użyj
  1. telefon LIKE '%test%'
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.