2013-02-05 3 views
5

나는 multi_query를 사용해 보았지만 엄격한 표준 메시지가 계속 나타납니다.엄격한 표준 : mysqli_next_result() 에러 : 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"; 

내가 오류 메시지는 다음과 같습니다

엄격한 기준 : mysqli_next_result() : 더 다음 결과 세트가 없습니다. , mysqli_more_results 문의하시기 바랍니다()/mysqli :: more_results()이 기능/방법 I 추가 및 -;를 제거하려고했지만 운이 없었습니다

를 호출 할 수 있는지 여부를 확인합니다.

+2

"나는 추가 및 제거 시도했다"당신은 또한 hhmmmm ...에 노력했다. idunno가 mysqli :: more_results()에 대한 검사를 추가 했습니까? – PeeHaa

+0

이것은 거의 쓸모없는 경고입니다. 기본적으로 그것은 당신에게 더러운 코드를 작성하도록 요청합니다. 이 경고의 배경은 무엇입니까? – Calmarius

답변

19

pipodesign이 $ querystring에서 오류를 수정하고 문제를 완화했지만 Strict Standards 오류와 관련하여 실제 해결책이 제공되지 않았습니다.

나는 SirBT의 조언에 동의하지 않으므로 DO WHILE에서 WHILE로 변경할 필요가 없습니다.

받는 엄격한 표준 메시지는 매우 유익합니다. 순종 이를 사용하십시오 동안 조건이 오류의에 처음 루프를 중단하기 때문에 조건부 종료를 작성하거나 루프의 내부에 침입하는

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

그런 다음 필요가 없습니다. * note, do-while 앞에있는 if 문은 첫 번째 쿼리에 오류가 있으면 루프에 대한 항목을 거부합니다.

예에서 INSERT 쿼리 만 실행 중이므로 처리 할 결과 집합을받지 못합니다. 추가 한 행의 수를 계산하려면, mysqli_affected_rows()를 사용하십시오. 귀하의 질문에 대한 완벽한 솔루션으로

:

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"; 

출력 : mysqli 새로운 사람들을 가로 질러 보았 때문에

:

// 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 편집 이 p ost, 나는 multi_query()를 사용하여 결과 세트가있는 /없는 쿼리를 처리하고 배열의 어떤 쿼리가 처리되는지 표시하는 기능을 추가하기 위해 일반적이지만 강력한 스 니펫을 제공합니다 ...

클래식 "IF() {DO {} WHILE}"구문 :

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 

새롭게 탄생 한 휠 "WHILE {}"구문들에 대한 (... 할 사람 없습니다 시험 후 같은 루프) :

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 

그래서, 중 동일한 출력을 제공합니다 다음 쿼리 주어진 니펫을 :

쿼리 배열 :

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

출력 :

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 

사용자의 요구에 따라 내 조각을 수정합니다. 버그를 발견하면 의견을 남기십시오.

1

이 경고를받는 이유는 단순히 do ... while 루프를 사용하여 명령 블록을 실행 한 후 조건을 평가하기 때문입니다. 따라서 결과가 더 이상 없으면 루프의 내용이 한 번 더 실행되어 해당 경고가 발생합니다.

while ($mysql->next_result()) ... do 루프를 사용하면이 문제를 해결할 수 있습니다. (일반적인주의 : 당신이했던 것처럼 사후 테스트 루프를 사용하는 것은 데이터베이스 프로그래밍에서 매우 드물다)

코드가 시인 경우, 나는 셰익스피어가 되고자한다!

0

(OP 대신 게시 됨).

는 해결 :

$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"; 
관련 문제