Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Co robię źle w zapytaniu z LIKE ?
Forum PHP.pl > Forum > Przedszkole
roobik
Witam!
Pomóżcie proszę... Mam takie zapyt:
  1. $query = "SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3";

Niestety, nic mi nie wyświetla. Gdzieś mam byka, czy cuś?

Nazwa tabeli i pól są ok...
Adi32
'%PIWO%' może pomoże.
mortus
Jeśli masz byka, to poniższy kod pokaże, gdzie tego byka masz:
  1. $sql = "SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3";
  2. $results = mysql_query($sql) or die(mysql_error());
wookieb
@roobik to cały kod?
roobik
Cytat(Adi32)
'%PIWO%' może pomoże

Niestety - nie pomogło sad.gif

@mortus - Wywaliło mi:
Query was empty.
Czyli "puste" zapytanie? Hm...

Cytat(wookieb)
@roobik to cały kod?

To tylko zapytanie. Potem daję
  1. $result = mysql_query($query);

...i pętelka z wyświetlaniem. Zapytanie (w sensie logicznym) nie może być empty, bo w tabeli jest wiele rekordów zawierających PIWO. Chyba normalnie zaraz skoczę po piwo smile.gif

wookieb
Zapytanie zapisujesz do $sql a do mysql_query wrzucasz $query...
Przeczytaj Temat: Jak poprawnie zadac pytanie i wróć
roobik
Cytat(wookieb)
Przeczytaj Temat: Jak poprawnie zadac pytanie i wróć

Myślę, że poprawnie zadałem pytanie. Pytam właśnie o zapytanie. Bo reszta jest ok. Tak więc problem leży w zapytaniu, dlatego też pytałem o błąd w nim wystepujący. Ale ok:
  1. $query = "SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3";
  2. $result = mysql_query($query);
  3. while($r = mysql_fetch_array($result)) {
  4. $id = $r['id'];
  5. $title = $r['title'];
  6. $date = $r['data'];
  7. $ile_odslon = $r['op'];
  8. echo '<p class="mirt"><a class="pack" href="'.$PHP_SELF.'?view='.$id.'">'.$title.'</a><br>
  9. <font class="mini"">Odsłon: <b>'.$ile_odslon.'</b> | Dodano: '.$date.'</font></p>';
  10. }
mortus
Zmień tę drugą linijkę w Twoim kodzie na:
  1. $result = mysql_query($query) or die(mysql_error());

i napisz, czy wywala jakiś błąd, czy nie.
Włącz wyświetlanie błędów i ustaw raportowanie błędów na 'wszystkie' na początku pliku:
  1. ini_set('display_error', 'on');

Jeśli zapytanie nie działa, to pętla while powinna przerwać działanie skryptu.
roobik
@mortus, tak, jak pisałem wcześniej, wywaliło mi Query was empty.

Cytat(mortus)
Jeśli zapytanie nie działa, to pętla while powinna przerwać działanie skryptu

I tak własnie jest.

Bez tej części
  1. AND title like \"%PIWO%\"

wyświetla poprawnie. Ale własnie chodzi mi o wyświetlanie tytułów, w których PIWO wystepuje. Hmmm...
mortus
No to przed wykonaniem zapytania sprawdź zmienną $query - var_dump($query);.
roobik
Zrobiłem, jak piszesz:
Cytat(mortus)
przed wykonaniem zapytania sprawdź zmienną $query - var_dump($query);

I wywaliło mi:
Cytat
string(96) "SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3"
mortus
A powinno wyświetlić:
Cytat
string(98) "SELECT * FROM alkohole WHERE kat=2 AND title like "%PIWO%" AND status=0 ORDER BY data DESC LIMIT 3"


Zatem upewnij się, że zmienną $query zapisujesz tak, jak tutaj tj. w cudzysłowach, a nie w apostrofach.
roobik
Zmieniłem.
  1. $query = "SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3";

na to:
  1. $query = 'SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3';

Czyli całe zapytanie jest teraz w apostrofach, a tylko PIWO jest w cudzysłowiu.
Fakt, wyświetla teraz:
Cytat
string(98) "SELECT * FROM alkohole WHERE kat=2 AND title like "%PIWO%" AND status=0 ORDER BY data DESC LIMIT 3"

ale i tak nie zmienia to faktu, że po usunięciu var_dump($query); nic się nie dzieje...
gorden
ale jak dałeś to w apostrofach to po co z kolei backslashe koło cudzysłowów ?
mortus
Cytat(roobik @ 6.01.2012, 19:10:58 ) *
Zmieniłem.
  1. $query = "SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3";

na to:
  1. $query = 'SELECT * FROM alkohole WHERE kat=2 AND title like \"%PIWO%\" AND status=0 ORDER BY data DESC LIMIT 3';

Czyli całe zapytanie jest teraz w apostrofach, a tylko PIWO jest w cudzysłowiu.
Fakt, wyświetla teraz:

ale i tak nie zmienia to faktu, że po usunięciu var_dump($query); nic się nie dzieje...

Kolego, chyba się gubisz w "zeznaniach" wink.gif . Pokaż cały poprawiony kod.
roobik
Usunięcie backslash'y wyświetla znowu 96

Poprawiony kod (i tak nie działający sad.gif )
  1. $query = 'SELECT * FROM alkohole WHERE kat=2 AND title like "%PIWO%" AND status=0 ORDER BY data DESC LIMIT 3';
  2. $result = mysql_query($query);
  3. while($r = mysql_fetch_array($result)) {
  4. $id = $r['id'];
  5. $title = $r['title'];
  6. $date = $r['data'];
  7. $ile_odslon = $r['op'];
  8. echo '<p class="mirt"><a class="pack" href="'.$PHP_SELF.'?view='.$id.'">'.$title.'</a><br>
  9. <font class="mini"">Odsłon: <b>'.$ile_odslon.'</b> | Dodano: '.$date.'</font></p>';
  10. }

mortus
  1. // na początku pliku
  2. ini_set('display_errors', 'on');
  3. // i dalej
  4. $query = 'SELECT * FROM alkohole WHERE kat=2 AND title like "%PIWO%" AND status=0 ORDER BY data DESC LIMIT 3';
  5. $result = mysql_query($query) or die(mysql_error());
  6. while($r = mysql_fetch_array($result)) {
  7. $id = $r['id'];
  8. $title = $r['title'];
  9. $date = $r['data'];
  10. $ile_odslon = $r['op'];
  11. echo '<p class="mirt"><a class="pack" href="'.$PHP_SELF.'?view='.$id.'">'.$title.'</a><br>
  12. <font class="mini"">Odsłon: <b>'.$ile_odslon.'</b> | Dodano: '.$date.'</font></p>';
  13. }
roobik
Po dodaniu tego
  1. ini_set(''display_errors', 'on');
  2. error_reporting(E_ALL);

nic się nie wyświetla. Pozostaje dalej to, co było na poczatku:
Cytat
string(96) "SELECT * FROM alkohole WHERE kat=2 AND title like "%PIWO%" AND status=0 ORDER BY data DESC LIMIT 3"
mortus
Zrobiłem literówkę, skopiuj poprawiony kod z góry.
roobik
Domyśliłem się - wstawiłem jednak backslasha przed jednym z apostrofów. Teraz poprawiłem, jak napisałeś. Niestety - ani nie wywala błędów, ani nic. Tylko zamiast wyświetlać, to co zamierzam, wywala:
Cytat
string(96) "SELECT * FROM alkohole WHERE kat=2 AND title like "%PIWO%" AND status=0 ORDER BY data DESC LIMIT 3"

skleps
Może głupie, ale czy jest choć jeden rekord spełniający wszystkie warunki:

kat=2
i
title like "%PIWO%"
i
status=0

Może na razie testowo zrób:
  1. $query = 'SELECT * FROM alkohole WHERE title like "%PIWO%" ORDER BY data DESC LIMIT 3';



roobik
Takich rekordów jest całkiem sporo. Wszystkich rekordów w bazie: 638. Kategorii jest (narazie) 3. Jak już wcześniej pisałem, a teraz doprecyzuję - są rekordy ze słowem PIWO w title, o statusie 0 w kategorii 2.
skleps
a spróbuj:

  1. $query = "SELECT * FROM alkohole WHERE title like '%PIWO%' ORDER BY data DESC LIMIT 3";


to już jest superzgodne z dokumentacją mysql:
http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html

i jeśli nie zadziała to znaczy że błąd jest raczej w danych.
roobik
OK smile.gif
W końcu smile.gif
Zmienię tylko order by data DESC na order by rand() i będzie super smile.gif
Dzięki bardzo!!!
Wszystkim!!!

Pozdrawiam!
skleps
Cytat(roobik @ 6.01.2012, 23:16:58 ) *
W końcu


Jak człowiek pisze z automatu wg swojego przyzwyczajenia to i ciężko mu później znaleźć problem smile.gif

Cytat(roobik @ 6.01.2012, 23:16:58 ) *
Zmienię tylko order by data DESC na order by rand() i będzie super smile.gif


No i nie będzie super, ale pod kątem wydajnościowym.
Poczytaj chociażby pierwszy wynik z googla:
http://blog.ksiazek.info/2010/05/04/order-by-rand-to-zlo/


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.