Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Nadpobudliwy warning: mysql_fetch_array(), czyli temat z cyklu "co jest źle"
Forum PHP.pl > Forum > Przedszkole
messmaker
Witam,

Przychodzę z dziwną przypadłością, a mianowicie:

W tabeli productionlist są przechowywane dane odnośnie właśnie przetwarzanych surowców (tak, chodzi o grę winksmiley.jpg ). Kolumna togo odpowiada za ilość tur do zakończenia produkcji.

Wklejony poniżej kod jest wykonywany przy każdej turze. Z założenia powinien najpierw zmniejszać licznik togo o 1 a w momencie, kiedy ten osiągnie zero ma dodać surowce graczowi. pięć linijek niżej wykonuję niemal identyczny kod (jedyną różnicą jest nazwa tabeli) i odbywa się to bezproblemowo, ale tutaj:

Cytat
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\_WebServ\httpd\turn.php on line 29


Takie oto ostrzeżenie widzę za każdym razem, kiedy ma nastąpić dodanie surowca (czyli togo osiąga 0). Żeby było śmieszniej surowiec ZOSTAJE DODANY w bazie danych.

W telegraficznym skrócie: Wywala warning, ale całość wykonuje poprawnie. Jak pozbyć się ostrzeżenia?

  1. <?php
  2. 27      $togo = doquery(&#092;"UPDATE {{table}} SET togo=togo-1 WHERE togo>0 AND type='building' AND itemid='\".$building[\"id\"].\"'\", \"productionlist\");
  3. 28      $productions2 = doquery(&#092;"SELECT * FROM {{table}} WHERE type='building' AND itemid='\".$building[\"id\"].\"' AND togo='0' ORDER BY id ASC\", \"productionlist\");
  4. 29      while ($production2=mysql_fetch_array($productions2)) {
  5. 30              //dodanie surowca
  6. 31      }
  7. ?>

Dodałem numery linii według pliku.
dr_bonzo
Ludzie troche myslenia.

Cytat
mysql_fetch_array(): supplied argument is not a valid MySQL result resource

Co to oznacza? Ze przekazany argument ($productions2) nie jest prawidlowym wynikiem zapytania select do mysql.

A skad sie $productions2 wzielo?
z
  1. <?php
  2. $productions2 = doquery("SELECT * FROM {{table}} WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC", "productionlist");
  3. ?>

A co robi doquery() - domyslam sie ze to samo co mysql_query().
Zagladamy do manuala mysql_query" title="Zobacz w manualu PHP" target="_manual
Cytat
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.

WOW, ta funkcja zwraca czasem FALSE.

Teraz wypada sprawdzic czemu zwraca FALSE zamiast wyniku SELECTa.

1. echo mysql_error() // Returns the text of the error message from previous MySQL operation
2. i printujemy zapytanie ktore wysylamy do bazki


  1. <?php
  2. $sql = "SELECT * FROM {{table}} WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC", "productionlist";
  3. echo($sql);
  4. $productions2 = doquery($sql);
  5. ?>


i z reszta radzimy sobie samodzielnie.


A czemu ci dodaje? Bo to select nie dziala, update wykonuje sie widocznie prawidlowo.
messmaker
O ja głupi idiota głupi głupi bezmyślny.
Tyle ironii, teraz na temat.


Cytat(dr_bonzo @ 2.08.2009, 13:33:28 ) *
Teraz wypada sprawdzic czemu zwraca FALSE zamiast wyniku SELECTa.


Primo:
  1. <?php
  2. $productions2 = doquery("SELECT * FROM {{table}} WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC", "productionlist");
  3.        die($productions2);
  4. ?>

Wyświetla co następuje:
Kod
Resource id #28



Secundo:
  1. <?php
  2. $productions2 = doquery("SELECT * FROM {{table}} WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC", "productionlist");
  3.        if (mysql_error()!="") {die(mysql_error());}
  4. ?>

Przepuszcza stronę dokładnie tak jak bez drugiej wklejonej linijki, z ostrzeżeniem.


Tertio:
  1. <?php
  2. $zap="SELECT * FROM {{table}} WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC";
  3.        $productions2 = doquery($zap, "productionlist");
  4.        die($zap);
  5. ?>

Wyświetla co następuje:
Kod
SELECT * FROM {{table}} WHERE type='building' AND itemid='7' AND togo='0' ORDER BY id ASC

i ja tu grzechu nie widzę.
zeten
Cytat
  1. <?php
  2. $productions2 = doquery("SELECT * FROM {{table}} WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC", "productionlist");
  3.        die($productions2);
  4. ?>

Wyświetla co następuje:
Kod
Resource id #28


popraw na:
  1. <?php
  2. $productions2 = doquery("SELECT * FROM {{table}} WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC", "productionlist")or die(mysql_error());
  3. ?>


I zobacz jaki błąd zapytania mysql generuje.
messmaker
  1. <?php
  2. $productions2 = doquery(&#092;"SELECT * FROM {{table}} WHERE type='building' AND itemid='\".$building[\"id\"].\"' AND togo='0' ORDER BY id ASC\", \"productionlist\") or die(mysql_error());
  3.        if (mysql_error()!=&#092;"\") {die(mysql_error());}
  4. ?>


przepuszcza stronę z ostrzeżeniem


EDIT:
  1. <?php
  2. function doquery($query, $table) {
  3.    include('config.php');
  4.    global $numqueries;
  5.    $sqlquery = mysql_query(str_replace("{{table}}", $dbsettings["prefix"]."_".$table, $query)) or die(mysql_error());
  6.    $numqueries++;
  7.    return $sqlquery;
  8. }
  9. ?>
zeten
Zamiast doquery() daj zwykle mysql_query() i pokaż jaki błąd generuje.
messmaker
  1. <?php
  2. $productions2 = mysql_query("SELECT * FROM gra_productionlist WHERE type='building' AND itemid='".$building["id"]."' AND togo='0' ORDER BY id ASC") or die(mysql_error());
  3.        while ($production2=mysql_fetch_array($productions2)) {
  4. ?>


tradycyjnie:
Kod
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\_WebServ\httpd\turn.php on line 29


gdzie 29. to linijka z while
zeten
A dobrze pakuje dane do tablicy? jak tak to daj @mysql_fetch_array ;-)
messmaker
Małpa pomogła, ale to jedyny taki fortel w całym kodzie i jeśli to możliwe to wolałbym temu zaradzić inaczej winksmiley.jpg tak czy inaczej jedno rozwiązanie jest, dzięki!
Wicepsik
Jak wyświetlasz dane?
messmaker
display($strona,$tytuł);
display2($strona,$tytuł);

funkcja display parsuje dane, wmontowuje je (zależnie od np. czy użytkownik jest zalogowany, jaki ma poziom uprawnień) w kilka kolejnych szablonów i na końcu po podstawieniu wszystkiego co miała podstawić wykonuje echo $calastrona;




Mój błąd, że się dokładniej nie przyjrzałem bazie i testowałem tylko dla jednego rekordu updatowanego w felernej pętli while.

Teraz zauważyłem, że skrypt jakby "nie akceptuje" pętli i zmieniony zostaje tylko jeden rekord.
Innymi słowy, podczas jednego wywołania funkcji zostaje dodany tylko jeden surowiec. Jest na to jakaś rada?
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.