Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: filtorwanie danych w wyszukiwarce
Forum PHP.pl > Forum > PHP
peklo
Korzystając z przykładowego skryptu nospor dot. wykonania wyszukiwarki stanąłem w jednym miejscu a mianowicie bindowania przesyłanych danych. Mam coś takiego i nie wiem co i jak wstawić żeby te dane zostały przefiltorwane

  1. if (!empty($_POST['nazwa_ogloszenia']))
  2. {
  3. $wh[] = "nazwa_ogloszenia LIKE '%$nazwa_ogloszenia%'";
  4. }
  5. if (!empty($_POST['id_kategoria']))
  6. {
  7. $wh[] = 'id_kategoria = '.'"'.$_POST['id_kategoria'].'"';
  8. }
  9.  
  10. if (!empty($wh))
  11. {
  12. $where = 'WHERE '.implode(' and ', $wh);
  13. $stmt = $pdo -> prepare("SELECT nazwa_ogloszenia,id_kategoria,aktywne FROM ogloszenia ".$where." and aktywne=:aktywne");
  14. $stmt -> bindValue(':aktywne', 1, PDO::PARAM_INT);
  15.  
  16. //i tutaj chodzi mi jak wykonać bindValue dla tego id_kategoria i nazwa_ogloszenia
  17.  
  18. $stmt -> execute();
  19. }
fizzlebubble
Cytat
aktywne=:aktywne");


Od kiedy to w PHP są symbole?
peklo
to jak mam to napisać? bez:?
fizzlebubble
Spróbuj bez : w obu przypadkach, jednakże nie sądzę, aby to rozwiązało ten konkretny problem.
peklo
ale ja pytałem o co innego. jak przefiltorwać nazwa_ogloszenia i id_ogloszenia

a poza tym ten zapis aktywne=:aktywne jest wg mnie jak najbardziej prawidłowy
IProSoft
  1. $bind = array(
  2. ':aktywne' => 1
  3. );
  4.  
  5. $where = array(
  6. 'aktywne=:aktywne'
  7. );
  8.  
  9. if ( !empty( $_POST['nazwa_ogloszenia'] ) )
  10. {
  11. $where[] = "nazwa_ogloszenia LIKE '%:nazwa_ogloszenia%'";
  12. $bind[':nazwa_ogloszenia'] = $_POST['nazwa_ogloszenia'];
  13. }
  14.  
  15. if ( !empty( $_POST['id_kategoria'] ) )
  16. {
  17. $where[] = "id_kategoria = '%:id_kategoria%'";
  18. $bind[':id_kategoria'] = $_POST['id_kategoria'];
  19. }
  20.  
  21. if ( count( $where ) > 1 )
  22. {
  23. $stmt = $pdo->prepare("SELECT nazwa_ogloszenia,id_kategoria,aktywne FROM ogloszenia WHERE ". implode( ' AND ', $where ) );
  24. $stmt->execute( $bind );
  25. }


Nie sprawdzone, tylko pokazuję przykładowe rozwiązanie.
peklo
acha myslwłem że to sprawdzenie mozna wrzucic tutaj

$stmt -> bindValue(nazwa_ogloszenia itd..);
Turson
Cytat(fizzlebubble @ 9.04.2014, 12:58:25 ) *
Od kiedy to w PHP są symbole?

To PDO tongue.gif


Generalnie jak chcesz przebindować dane w tablicy, można to zrobić też pętlą.
nospor
nie:
$where[] = "nazwa_ogloszenia LIKE '%:nazwa_ogloszenia%'";
$bind[':nazwa_ogloszenia'] = $_POST['nazwa_ogloszenia'];

a:
$where[] = "nazwa_ogloszenia LIKE :nazwa_ogloszenia";
$bind[':nazwa_ogloszenia'] = '%'.$_POST['nazwa_ogloszenia'].'%';

ANalogicznie reszta.
Jesli nadal jeszcze nie dziala, to napisz czym sie objawia niedzialanie i jakie sa bledy
peklo
po wlaczeniu bledów mam tylko to
Notice: Undefined variable: stmt in ... (tu link do pliku stony) on line 116

Fatal error: Call to a member function fetch() on a non-object in ... (tu link do pliku stony) on line 116


za tym
  1. $stmt->execute($bind);
  2. }
  3. //mam
  4.  
  5. while($ogloszenia = $stmt -> fetch())
  6. {
  7.  
  8. //wyniki na stronie
  9. }
Turson
$a = $stmt->execute($bind);

while($ogloszenia = $a -> fetch())
peklo
kurde nadal nie działa:(
A nie da się tego w jakiś prostrzy sposób dostosować do tego skryptu który podałem na poczatku.
id_kategoria chyba może być bez like bo to int wybierany z pola select
nospor
A czymze znowu objawia sie to nie dzialanie??

I tak, jesli cos jest liczba to logicze ze nie uzywasz LIKE.....
peklo
nospor to niedziałanie objawia się tym że niedziała smile.gif)
Pewnie coś niee tak z tym warunkiem WHERE.
Wkleiłem to
error_reporting(E_ALL); ini_set('display_errors','1');
i wyskoczyły mi błędy takie jak wkleiłem
Wiem że ty wiesz jak to można dostosować w prosty sposób do skryptu który przykleiłem na początku smile.gifsmile.gif
nospor
Czyli nadal masz ten blad?
Notice: Undefined variable: stmt in ... (tu link do pliku stony) on line 116
Toz wyraznie napisane, ze uzyuwasz zmiennej, ktorej nie ma :/
peklo
wiem że chodzi o zmienną której nie ma. Ok idę po dziecko.
a nie da się tego wrzucić jakoś w to:

$stmt -> bindValue(':nazwa_ogloszenia', $where, PDO::PARAM_STR);

$stmt -> bindValue(':id_kategoria', $where, PDO::PARAM_STR);


questionmark.gif?
Turson
Pokaż cały ten kod to łatwiej będzie
peklo
tak na szybko znowu zmieniłem po nowemu i nic

  1. $username=$_SESSION['user'][4];
  2. $bind = array(
  3. ':aktywne' => 1,
  4. ':username' => $_SESSION['user'][4]
  5. );
  6.  
  7. $where = array(
  8. 'aktywne=:aktywne',
  9. 'username=:username'
  10. );
  11. if (!empty($_POST['nazwa_ogloszenia']))
  12. {
  13. $where[] = "nazwa_ogloszenia LIKE :nazwa_ogloszenia";
  14. $bind[':nazwa_ogloszenia'] = '%'.$_POST['nazwa_ogloszenia'].'%';
  15. }
  16. if (!empty($_POST['id_kategoria']))
  17. {
  18. $where[] = 'id_kategoria = '.'"'.$_POST['id_kategoria'].'"';
  19. $bind[':id_kategoria'] = $_POST['id_kategoria'];
  20. // tj wartośc int z pola select nie wiem czy bindować czy nie
  21. }
  22.  
  23. try
  24. {
  25. $pdo = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  26. $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  27. if ( count( $where ) > 1 )
  28. {
  29. $stmt = $pdo->prepare("SELECT nazwa_ogloszenia,id_kategoria,aktywne FROM ogloszenia WHERE ". implode( ' AND ', $where ) );
  30. $a = $stmt->execute($bind);
  31. }
  32. else
  33. {
  34. $stmt = $pdo->prepare("SELECT nazwa_ogloszenia,id_kategoria,aktywne FROM ogloszenia WHERE aktywne=:aktywne and username=:username");
  35. $stmt -> bindValue(':username', $username, PDO::PARAM_STR);
  36. $stmt -> bindValue(':aktywne', 1, PDO::PARAM_INT);
  37. $stmt -> execute();
  38. $a = $stmt->execute();
  39. }
  40. while($ogloszenia = $a -> fetch())
  41. {
  42.  
  43. //przykładowe dane
  44. echo $ogloszenia['nazwa_ogloszenia'];
  45. }
  46. $stmt -> closeCursor();
  47. }
  48. catch(PDOException $e)
  49. {
  50. echo 'Wystapił błąd.';
  51. }


a skoro mam skrypt wg starego schematu
  1. <input type='text' size='50' class='style7' maxlength='50' name="nazwa_ogloszenia" id="nazwa_ogloszenia">
  2.  
  3. <select name="id_kategoria" class="style7" id="id_kategoria">
  4. <option value=''>--wybierz--</option>
  5. <option value='1'>Dam pracę</option>
  6. //itd
  7. <option>
  8.  
  9. //i wyciagam to czego szukam z tego warunku
  10.  
  11. if (!empty($_POST['nazwa_ogloszenia']))
  12. {
  13. $wh[] = "nazwa_ogloszenia LIKE '%$nazwa_ogloszenia%'";
  14. }
  15. if (!empty($_POST['id_kategoria']))
  16. {
  17. $wh[] = 'id_kategoria = '.'"'.$_POST['id_kategoria'].'"';
  18. }
  19.  
  20. if (!empty($wh))
  21. {
  22. $where = 'WHERE '.implode(' and ', $wh);
  23. select from tabela ".$where."
  24. }
  25. else
  26. {
  27. select * from tabela
  28. }
  29.  
  30. //to nie mogę poprostu wpisać
  31. $stmt -> bindValue(':id_kategoria', $_POST['id_kategoria'], PDO::PARAM_STR);
  32. //itd
IProSoft
Wrzuć, odpal i napisz co się dzieje.

  1. $username = $_SESSION['user'][4];
  2.  
  3. $bind = array(
  4. ':aktywne' => 1,
  5. ':username' => $username
  6. );
  7.  
  8. $where = array(
  9. 'aktywne = :aktywne',
  10. 'username = :username'
  11. );
  12. if (!empty($_POST['nazwa_ogloszenia']))
  13. {
  14. $where[] = "nazwa_ogloszenia LIKE :nazwa_ogloszenia";
  15. $bind[':nazwa_ogloszenia'] = '%' . $_POST['nazwa_ogloszenia'] . '%';
  16. }
  17. if (!empty($_POST['id_kategoria']))
  18. {
  19. $where[] = 'id_kategoria = :id_kategoria';
  20. $bind[':id_kategoria'] = $_POST['id_kategoria'];
  21. }
  22.  
  23. try{
  24.  
  25. $pdo = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  26. $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  27.  
  28. $stmt = $pdo->prepare("SELECT nazwa_ogloszenia,id_kategoria,aktywne FROM ogloszenia WHERE ". implode( ' AND ', $where ) );
  29. $a = $stmt->execute( $bind );
  30.  
  31. while( $ogloszenia = $a->fetch() )
  32. {
  33. echo $ogloszenia['nazwa_ogloszenia'];
  34. }
  35. $stmt -> closeCursor();
  36. }
  37. catch(PDOException $e)
  38. {
  39. echo 'Wystapił błąd.';
  40. }
peklo
jest to samo co było
Call to a member function fetch() on a non-object in
A nie da sie tego zrobić jak pisałem wcześniej że wszystkie zmienne wrzucić bezpośrednio do bindvalue
Turson
Możesz bindować po kolei, ale w przypadku tablicy to nieco utrudnione. Tak jak wcześnie napisałem, można to w pętli zrobić
peklo
no tak tylko że jak to zrobić w pętli?
dobra a może przefiltorwać tylko samo pole gdzie wpisuje jakieś wyrazy czyli pole nazwa.
A te które wybieram z select lub checkbox poprostu nie filtorwać?
Turson
powiedzmy, że bindujesz wszystko co jest w $_POST

  1. foreach($_POST as $k=>$v){
  2. $stmt->bindValue(":{$k}", $v, PDO::PARAM_INT);
  3. }
peklo
to juz wtedy nie wpisuje tak:
$stmt -> bindValue(':username', $username, PDO::PARAM_STR); questionmark.gif?
$stmt -> bindValue(':aktywne', 1, PDO::PARAM_INT); questionmark.gif? bo nie za bardzo rozumiem
ber32
Tu masz linka jak LIKE użyć w pdo www.joomla-cms.com.pl/pl/praca-prog...isty-class.html linia 100 i 110 do tego użyj
  1. trim(implode(",", $v))
i powinno działać.
IProSoft
zamień w tym co Ci podałem:
  1. $a = $stmt->execute( $bind );
  2.  
  3. while( $ogloszenia = $a->fetch() )

na
  1. $stmt->execute( $bind );
  2.  
  3. while( $ogloszenia = $stmt->fetch() )
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.