2013-02-05 14 views
5

Próbowałem używać multi_query, ale ciągle dostaję ostry komunikat Standards.Rygorystyczne standardy: mysqli_next_result() błąd z mysqli_multi_query

$querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; 

if (mysqli_multi_query($db, $querystring)) { 
    do { 
     if ($result = mysqli_store_result($db)) { 
      // 
     } 
    } while (mysqli_next_result($db)); 
} 
echo "end"; 

Komunikat o błędzie pojawia się:

Strict Standards: mysqli_next_result(): Nie ma następny zestaw wyników. Proszę mysqli_more_results zadzwonić()/mysqli :: more_results(), aby sprawdzić, czy do wywołania tej funkcji/metody

Próbowałem dodawanie i usuwanie -; ale nie miał szczęścia.

+2

"Próbowałem dodawanie i usuwanie" Czy próbowałeś również ... hhmmmm. idunno dodając czek dla 'mysqli :: more_results()'? – PeeHaa

+0

To prawie bezużyteczne ostrzeżenie. Zasadniczo prosi o napisanie brzydszego kodu. Jaki jest powód tego ostrzeżenia? – Calmarius

Odpowiedz

19

Podczas gdy pipodesign poprawił błąd w $ querystring i złagodził problem, faktyczne rozwiązanie nie zostało dostarczone w odniesieniu do błędu ścisłych norm.

Nie zgadzam się z radą SirBT, przejście z DO CZASU DO CZASU nie jest konieczne.

Otrzymany przez nas komunikat dotyczący ścisłych standardów jest dość pouczający. posłuszeństwa, użyj tego:

do{} while(mysqli_more_results($db) && mysqli_next_result($db)); 

Następnie, nie ma potrzeby, aby napisać exit warunkową lub złamać wewnątrz pętli, ponieważ warunek gdy złamie pętlę na pierwszym wystąpieniu błędu. * uwaga, instrukcja if przed do-while odmówi wejścia do pętli, jeśli pierwsze zapytanie zawiera błąd.

W powyższym przykładzie uruchomione są tylko zapytania INSERT, więc nie otrzymasz żadnych zestawów wyników do przetworzenia. Jeśli chcesz policzyć liczbę dodanych wierszy, użyj mysqli_affected_rows().

jako kompletne rozwiązanie dla Twojego pytania:

if(mysqli_multi_query($db,$querystring)){ 
    do{ 
     $cumulative_rows+=mysqli_affected_rows($db); 
    } while(mysqli_more_results($db) && mysqli_next_result($db)); 
} 
if($error_mess=mysqli_error($db)){echo "Error: $error_mess";} 
echo "Cumulative Affected Rows: $cumulative_rows"; 

wyjściowa:

// if no errors 
Cumulative Affected Rows: 2 

// if error on second query 
Error: [something] 
Cumulative Affected Rows: 1 

// if error on first query 
Error: [something] 
Cumulative Affected Rows: 0 

LATE EDIT:

Ponieważ ludzie nowi do mysqli są natyka to p ost, oferuję ogólny, ale solidny fragment kodu służący do obsługi zapytań z/bez zestawów wyników przy użyciu funkcji multi_query() i dodawania funkcji do wyświetlania, które zapytanie w tablicy jest obsługiwane ...

Classic "IF() {} WHILE DO {}" Składnia:

if(mysqli_multi_query($mysqli,implode(';',$queries))){ 
    do{ 
     echo "<br><br>",key($queries),": ",current($queries); // display key:value @ pointer 
     if($result=mysqli_store_result($mysqli)){ // if a result set 
      while($rows=mysqli_fetch_assoc($result)){ 
       echo "<br>Col = {$rows["Col"]}"; 
      } 
      mysqli_free_result($result); 
     } 
     echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs 
    } while(next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); 
} 
if($mysqli_error=mysqli_error($mysqli)){ 
    echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value 
} 
//if you want to use the snippet again... 
$mysqli_error=null; // clear variables 
reset($queries); // reset pointer 

wynalezione na nowo koła "podczas gdy {}" Składnia (... dla tych, którzy nie jak post-testu pętli):

while((isset($multi_query) && (next($queries) && mysqli_more_results($mysqli) && mysqli_next_result($mysqli))) || (!isset($multi_query) && $multi_query=mysqli_multi_query($mysqli,implode(';',$queries)))){ 
    echo "<br><br>",key($queries),": ",current($queries); // display array pointer key:value 
    if($result=mysqli_store_result($mysqli)){ 
     while($rows=mysqli_fetch_assoc($result)){ 
      echo "<br>Col = {$rows["Col"]}"; 
     } 
     mysqli_free_result($result); 
    } 
    echo "<br>Rows = ",mysqli_affected_rows($mysqli); // acts like num_rows on SELECTs 
} 
if($mysqli_error=mysqli_error($mysqli)){ 
    echo "<br><br>",key($queries),": ",current($queries),"Syntax Error:<br>$mysqli_error"; // display array pointer key:value 
} 
//if you want to use the snippet again... 
$multi_query=$mysqli_error=null; // clear variables 
reset($queries); // reset pointer 

Więc albo snippet podane następujące pytania będzie oferować ten sam wyjściowy:

tablica Zapytanie:

$queries[]="SELECT * FROM `TEST`"; 
$queries[]="INSERT INTO `TEST` (Col) VALUES ('string1'),('string2')"; 
$queries[]="SELECT * FROM `TEST`"; 
$queries[]="DELETE FROM `TEST` WHERE Col LIKE 'string%'"; 

wyjściowa:

0: SELECT * FROM `TEST` 
Rows = 0 

1: INSERT INTO `TEST` (Col) VALUES ('string1'),('string2') 
Rows = 2 

2: SELECT * FROM `TEST` 
Col = string1 
Col = string2 
Rows = 2 

3: DELETE FROM `TEST` WHERE Col LIKE 'string%' 
Rows = 2 

Zmienić fragmenty na swoje potrzeby. Pozostaw komentarz, jeśli znajdziesz błąd.

1

Powodem, dla którego otrzymujesz to ostrzeżenie, jest po prostu użycie pętli ... while, która ocenia warunek po uruchomieniu bloku poleceń. Tak więc, gdy nie ma więcej wyników, zawartość pętli jest uruchamiana jeden dodatkowy czas, powodując to ostrzeżenie.

Użycie pętli powinno to naprawić. (Ogólnie rzecz biorąc: używanie pętli po teście, tak jak to robiłeś, jest dość rzadkie w programowaniu baz danych)

Jeśli kod jest poezją, staram się być Szekspirem!

0

(Wysłana odpowiedź w imieniu PO).

rozwiązany:

$querystring = "INSERT INTO responses VALUES('1', '2', '3', '4'); INSERT INTO responses VALUES('1', '2', '3', '4')"; 

if (mysqli_multi_query($db, $querystring)) { 
do { 
    if (!mysqli_more_results($db)) { 
    exit(); 
    } 
} while (mysqli_next_result($db)); 
} 
echo "end"; 
Powiązane problemy