Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL]błąd mysql_fetch_array a związek z mysql_insert_id()
siutek
post 29.12.2012, 23:07:02
Post #1





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 26.10.2005
Skąd: Toruń

Ostrzeżenie: (0%)
-----


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()

Ten post edytował siutek 29.12.2012, 23:30:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
minolone
post 29.12.2012, 23:44:33
Post #2





Grupa: Zarejestrowani
Postów: 141
Pomógł: 24
Dołączył: 21.06.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
siutek
post 29.12.2012, 23:57:17
Post #3





Grupa: Zarejestrowani
Postów: 173
Pomógł: 1
Dołączył: 26.10.2005
Skąd: Toruń

Ostrzeżenie: (0%)
-----


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ę?

Ten post edytował siutek 29.12.2012, 23:59:25
Go to the top of the page
+Quote Post
minolone
post 30.12.2012, 00:08:45
Post #4





Grupa: Zarejestrowani
Postów: 141
Pomógł: 24
Dołączył: 21.06.2008

Ostrzeżenie: (0%)
-----


Dobrze rozumujesz. Argument return powoduje zakonczenie funkcji.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 08:33