Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]błąd mysql_fetch_array a związek z mysql_insert_id()
Forum PHP.pl > Forum > Przedszkole
siutek
Witam,
od kilku godzin borykam się z pewnym problemem,
mam takie oto dwie funkcje:

pierwsza, odpowiedzialna ogólnie za umieszczanie danych w bazie:
  1. function queryInsert($tblName,$fldArray2,$debug=false) {
  2. global $connection;
  3. global $fldArray;
  4. global $tblArray;
  5. $_query1="";
  6. $_query2="";
  7.  
  8. if (is_array($fldArray2)) {
  9. foreach ($fldArray2 as $key=>$val) {
  10. if (strlen($val) && strlen($fldArray[$tblName][$key])) {
  11. $_query1.=$fldArray[$tblName][$key].",";
  12. $_query2.="'".addslashes($val)."',";
  13. }}}
  14. $query="INSERT INTO ".$tblArray[$tblName]." (".substr($_query1,0,-1).") VALUES (".substr($_query2,0,-1).")";
  15. if ($debug)
  16. echo $query;
  17. if (mysql_query($query,$connection))
  18. $odpowiedz=mysql_affected_rows($connection);
  19. else
  20. $odpowiedz="duplicate";
  21.  
  22. return $odpowiedz;
  23. }


i druga, która odpowiada za tworzenie nowego działu w drzewie menu:

  1. function createNode($parentId=0, $nodeId=false, $tblName="content") {
  2.  
  3. global $connection;
  4. global $fldArray;
  5. global $tblArray;
  6.  
  7. lockTable($tblName);
  8. $r = getRecord($tblName,$parentId);
  9.  
  10.  
  11. if(is_array($r)) {
  12. $left = $r['left'];
  13. $right = $r['right'];
  14. } else {
  15. $left = 0;
  16. $right = 1;
  17. }
  18.  
  19. mysql_query("UPDATE ".$tblArray[$tblName]." SET `".$fldArray[$tblName]["right"]."`=`".$fldArray[$tblName]["right"]."`+2 WHERE `".$fldArray[$tblName]["right"]."` > ".($right-1));
  20. mysql_query("UPDATE ".$tblArray[$tblName]." SET `".$fldArray[$tblName]["left"]."`=`".$fldArray[$tblName]["left"]."`+2 WHERE `".$fldArray[$tblName]["left"]."` > ".($right-1));
  21.  
  22. $_POST["left"] = $right;
  23. $_POST["right"] = $right+1;
  24. $_POST["parent"] = $parentId;
  25. $_POST["name"] = serialize($_POST["name"]);
  26. $_POST["content"] = $_POST["content"]["PL"];
  27. queryInsert($tblName,$_POST);
  28. return mysql_insert_id();
  29. unlockTable();
  30. }


teraz sprawa rozbija się o nieszczęsne mysql_insert_id(); z przedostatniej linijki drugiej funkcji.
gdy nie mam tego polecenia, wszystko działa jak należy, natomiast w momencie utworzenia polecenia jak wyżej (return mysql_insert_id(); - chcialbym poznać ID ostatniego umieszczonego w bazie rekordu) serwer atakuje mnie błędami:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\d4y\__admind4y\inc\config.php on line 153
i

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\d4y\__admind4y\inc\config.php on line 220

co ciekawsze linie 153 i 220 nie dotyczą żadnej z powyższych funkcji!!

linia 153 to inaczej linia 10 z poniższej funkcji
  1. function getRecord($tblName,$val,$fldName="id",$debug=false){
  2. global $connection;
  3. global $fldArray;
  4. global $tblArray;
  5.  
  6. $query="SELECT * FROM ".$tblArray[$tblName]." WHERE ".$fldArray[$tblName][$fldName]."='".$val."'";
  7. unset($val);
  8. if ($debug) echo $query;
  9. $result=mysql_query($query,$connection);
  10. $row=mysql_fetch_array($result,MYSQL_ASSOC);
  11. if (is_array($row)) {
  12. foreach ($row as $key=>$val) {
  13. $returnArr[array_search($key,$fldArray[$tblName])] = stripslashes($val);
  14. }}
  15. return $returnArr;
  16. }


a linia 220 to inaczej linia 38 z poniższej funkcji:
  1. function getList($tblName,$arr,$start=0,$limit=0,$sortBy=false,$sortOrder=false,$debug=false){
  2. global $connection;
  3. global $fldArray;
  4. global $tblArray;
  5.  
  6. $i=0;
  7. $strToQuery="";
  8. $btwn = false;
  9.  
  10. foreach ($arr as $key=>$val) {
  11. if (strlen($tblArray[$tblName][$key])) {
  12. $percent = "";
  13. if (strpos($key,"_>")) {
  14. $znak = ">";
  15. $key = str_replace("_>","",$key);
  16. } elseif (strpos($key,"_<")) {
  17. $znak = "<";
  18. $key = str_replace("_<","",$key);
  19. } elseif (strpos($key,"_!")) {
  20. $znak = "!=";
  21. $key = str_replace("_!","",$key);
  22. } elseif (strpos($key,"_LIKE")){
  23. $znak = " LIKE ";
  24. $key = str_replace("_LIKE","",$key);
  25. $percent = "%";
  26. } elseif (strpos($key,"_BETWEEN")) {
  27. $znak = " BETWEEN ";
  28. $key = str_replace("_BETWEEN","",$key);
  29. $btwn = true;
  30. } else $znak = "=";
  31.  
  32. $strToQuery.=" AND ".($key=="hidden"?"":$fldArray[$tblName][$key].$znak)."'".$percent.$val.$percent."'";
  33. }
  34. }
  35. $query="SELECT * FROM ".$tblArray[$tblName]." WHERE ".substr($strToQuery,5).(strlen($sortBy)?" ORDER BY ".$fldArray[$tblName][$sortBy].(strlen($sortOrder)?" ".$sortOrder:" ASC"):"").($limit>0?" LIMIT ".$start.",".$limit:"");
  36. if($debug==true) echo $query;
  37. $result=mysql_query($query,$connection);
  38. while ($row=mysql_fetch_array($result,MYSQL_ASSOC)) {
  39. if (is_array($row)) {
  40. foreach ($row as $key=>$val) {
  41. $returnArr[$i][array_search($key,$fldArray[$tblName])] = stripslashes($val);
  42. }
  43. $i++;
  44. }}
  45. return $returnArr;
  46. }


nie mam bladego pojęcia co jest nie tak, szukam przyczyny już kilka godzin :/
===================================================
edit:
znalazłem przyczynę, tylko niech mi ktoś teraz wytłumaczy dlaczego...

wystarczyło przesunąć odblokowanie tabeli przed instrukcję mysql_insert_id() w funkcji createNode();
niestety mysql_insert_id() zwraca 0 mimo prawidłowego wykonania funkcji queryInsert()
minolone
Argument return:
Wartości zwracane są przy użyciu opcjonalnego wyrażenia return. Wszystkie typy mogą być zwracane, łącznie z tablicami i obiektami. Powoduje to natychmiastowe zakończenie wykonywania funkcji i wznowienie wykonywania skryptu od linijki w której funkcja została wywołana.

Powinno pomóc przypisanie mysql_insert_id() do zmiennej po wywołaniu zapytania, nastepnie odblokowanie i return.

Przeczytaj sobie jeszcze to:

mysql_insert_id() zwraca ID wygenerowane dla pola z własnością AUTO_INCREMENT. Funkcja zwróci ID wygenerowane automatycznie przez ostatnią operację INSERT używającą podanego identyfikatora_połączenia. Jeżeli identyfikator_połączenia nie został podany, wykorzystywane jest ostatnio otwarte połączenie.

mysql_insert_id() zwróci 0 jeśli ostatnie zapytanie nie generowało wartości AUTO_INCREMENT. Jeśli chcesz przechować zwrócony przez tę funkcję wynik, upewnij się, że wywołujesz ją zaraz po zapytaniu generującym nową wartość.

Notatka: Funkcja MySQL LAST_INSERT_ID() zawsze zawiera ostatnio wygenerowane ID, a zwracana wartośc nie jest czyszczona pomiędzy kolejnymi zapytaniami.

źródło algorytmy.pl
siutek
faktycznie Twoja kolejność pomogła, mam zarówno mysql_insert_id() jak i brak jakichkolwiek błędów.
Dzięki!

swoja droga, na chłopski rozum, skoro funkcja CreateNode została przerwana w lini gdzie pojawiło się return, tym samym tabele NIGDY nie zostały odblokowane, bo funkcja odblokowująca była za return, stąd Warningi?? dobrze rozumuję?
minolone
Dobrze rozumujesz. Argument return powoduje zakonczenie funkcji.
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.