Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][sql]Sprawdzaniec istnienia w bazie
Forum PHP.pl > Forum > Przedszkole
MILICJA
Siema snitch.gif Otoz mam pewien problem za sprawdzaniem czy dany rekord jest bazie.
Sprawdzam to tak :

  1. <?php
  2. function sprawdzIst ($pid, $baza_danych) {
  3.  
  4. $istnieje= mysql_query("Select * FROM $baza_danych WHERE id = '$pid' ");
  5. $ile = mysql_num_rows($istnieje);
  6.  
  7. if ( $ile == 0 ) { 
  8.  
  9.  
  10. print '<CENTER></ br></ br>Strona o podanym id nie istnieje<CENTER>';
  11.  
  12.  
  13. }else {
  14.  
  15. wyPodstrone ($pid,$baza_danych); // funkcja wyswietla podstrone ( to dziala poprawnie)
  16.  
  17.  
  18. }
  19.  
  20. }
  21. ?>



Funkcja dziala bez zarzutu dopóki w "$pid" nie znajdzie sie / wtedy
mam oto taki komunikacik :

  1. Warning: mysql_fetch_array(): supplied argument IS NOT a valid MySQL result resource IN podstrony_index.php ON line 41



Wie ktos co nalezy poprawic ?
mike
1. Prosze poprawić temat wątku. Nie jest zgodny z zasadami panującymi na forum Przedszkole.
2.
Cytat(MILICJA @ 27.08.2006, 21:23 ) *
Wie ktos co nalezy poprawic ?
Należy sprawić aby $pid zawsze był liczbą calkowitą. Zrzutuj to na typ int lub zanim zaczniesz działać sprawdź jakiego typu jest zmienna i zareaguj jeśli nie jest int'em.
limak
po pierwsze to nie masz nigdzie listingowanym kodzie mysql_fetch_array wiec troche sciemniłeś z tym błędem, ale to nie ważne winksmiley.jpg Musisz sobie zrobić walidację. Walidację zawsze trzeba robić na każdej zmiennej która jest doklejana do zapytania, bo inaczej skrypt jest podatny na atak.
cadavre
Dopisz na końcu skryptu:
  1. <?php
  2. ?>
i powiedz co wypisze. Najprawdopodobniej znak "/" uznawany jest za slash poprzedzający znak (np. /" czy //).
MILICJA
Z bledem nie sciemniam (mysql) - bo wywoluje go funkcja wyPodstrone ($pid,$baza_danych); ( wyswietla podstrony). jak sprawdzic czy zmienna jest intt questionmark.gif



gry "?pid=1/ " wyskakuje ten wlasnie blad
Lonas
Można to rozwiązać dwojako :

Rozwiazanie pierwsze:
- zastosuj po zapytaniu mysql_query() ciag or die(mysql_error())
np.:

  1. <?php
  2. $result = mysql_query("SELECT nazwa_pola FROM nazwa_bazy WHERE nazwa_pola='costam'") or die(mysql_error());
  3. ?>


W ten sposob przy nieprawidlowym zapytaniu skrypt sie skonczy i wyswietli bledy zapytania.

Albo można tak :
  1. <?php
  2. $result = mysql_query("");
  3. {
  4. }
  5. else
  6. {
  7. }
  8. ?>

Teraz o co w tym wszystkim chodzi (kiedy powstaje blad).
Bład nie powstaje gdy zapytanie jest poprawne i generuj rezultat typu #resource
zmienna do ktorej zapisano wynik dzialania mysql_query() mozna smialo wstawic do mysql_fetch...().
Jesli w zapytaniu jest blad funkcja mysql_query() nie zwraca odpowiedniego rezultatu dla funkcji mysql_fetch...() i dlatego dopiero przy wywolaniu mysql_fetch...() nastepuje "wylozenie sie" skryptu.

pzdr
limak
Cytat
Z bledem nie sciemniam (mysql) - bo wywoluje go funkcja wyPodstrone ($pid,$baza_danych); ( wyswietla podstrony). jak sprawdzic czy zmienna jest intt questionmark.gif



gry "?pid=1/ " wyskakuje ten wlasnie blad


a, ok, chyba ze tak smile.gif

czy dana zmienna jest typu int można sprawdzić wywołując
is_numeric($zmienna);
zwroci ^ true jesli jest, lub false jesli nie jest.

można też jawnie przypisac typ, dodając "(int)" przed nazwą zmiennej, tj (int)$zmienna_typu_int

pozdrawiam
mike
~Lonas pierwszy sopsób slaby a drugi na dodatek błędny.

Nie powinno się przerywać działania skryptu w jakimkolwiek momencie.
A już na pewno nie wyrzucając przy tym akich informacji jak proponujesz.
Owszem, na etapie debuggowania tak, ale poten - nigdy.

W drugim przykładzie sugerujesz funkcję mysql_affected_rows() a ja sugeruję dowiedzeć się do czego w ogóle ona sluży i nie wprowadzać innych w błąd.


~MILICJA odsyłam do manuala:
MILICJA
Dziekuje za pomoc. " if (is_numeric($pid) == true) { " w pelni pomoglo . Wszystk odzial poprawnie obojetnei co wpisze. Uważam ze "mike_mech" zamiast pomagac i probowac rozwiazac problem pi**** glupoty.
mike
Cytat(MILICJA @ 27.08.2006, 21:57 ) *
Dziekuje za pomoc. " if (is_numeric($pid) == true) { " w pelni pomoglo . Wszystk odzial poprawnie obojetnei co wpisze. Uważam ze "mike_mech" zamiast pomagac i probowac rozwiazac problem pi**** glupoty.

A ja uważam że masz pierwsze i ostatnie słowne ostrzeżenie za używanie wulgaruzmów na forum. Gwiazdki, gwiazgkami a każdy wie o co chodzi więc daruj je sobie.
Jeśli nie potrafisz sie wypowiadać kulturalnie na publicznym forum to nie rób tego w ogóle. Nikt nie będzie tutaj tolerował Twojego chamstwa.

Dostałeś ode mnie dwie podpowiedzi, prowadzące bez problemu do rozwiązania. Listę funkcji odpowiedzialnych za sprawdzanie typów i instrukcje jak je rzutować. Jeśli nie zrozumiałeś manuala to jest powód żeby się rucać jak gówniarz.
Jeśli spodziewasz się na tym forum dostawać gotowce to zmień nastawienie, to forum służy do nauki i rozwijania umiejętności przy pomaganiu innym. A nie spełnianiu próśb leni i nierobów, którzy tyłka do manuala ruszyć nie potrafią.

Zastanów się więc następnym razem co piszesz.
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.