2017-03-03 3 views
0

Ich habe den folgenden Code:Looping vorbereitet statments

try 
{ 
    if(!($stmt = $conn["DB"]->prepare('CALL `central`.`permissions_edit`(?,?,?,?,?);'))) 
    { 
     $rtn["Errors"][] = "permissions_edit Prepare failed: (" . $conn["DB"]->errno . ") " . $conn["DB"]->error; 
    } 
    else{ 
     foreach ($data as $user => $areas) { 
      foreach ($areas as $area => $access) { 
       foreach ($access as $acc => $active) { 
        if($active != "U") 
        { 
         if(!($stmt->bind_param(
          'siiis', 
          $key, 
          $user, 
          $area, 
          $acc, 
          $active 
         ))) 
         { 
          $rtn["Error"][] = "permissions_edit Bind failed: (" . $conn["DB"]->errno . ") " . $conn["DB"]->error; 
         } 
         else if(!($stmt->execute())) 
         { 
          $rtn["Errors"][] = "permissions_edit Execute failed: (" . $conn["DB"]->errno . ") " . $conn["DB"]->error; 
         } 
         else if($res = $stmt->get_result()) 
         { 
          if ($row = $res->fetch_assoc()) 
          { 

           if(isset($row["Success"]) && $row["Success"]) 
           { 
            $rtn["Results"][]= "user=$user areas=$area access=$acc active=$active Message=" . $row["Msg"]; 
           } 
           else 
           { 
            $rtn["Success"] = false; 
            $rtn["Errors"][]= "user=$user areas=$area access=$acc active=$active Message=" . $row["Msg"];     
           } 
          } 

         } 
         else 
         { 
          $rtn["Errors"][] = "permissions_edit Get failed: (" . $conn["DB"]->errno . ") " . $conn["DB"]->error; 
         } 

        } 
        else 
         $rtn["Results"][]= "user=$user areas=$area access=$acc active=$active Message=Unchanged"; 
       } 
      } 
     } 
    } 


} 
catch(Exception $e) 
{ 
    $rtn["Errors"][] = "permissions_edit Error(" . $conn["DB"]->errno . "): " . $conn["DB"]->error; 
} 

diesen Code verwenden, wo die Schleife 1-2 mal wiederholt funktioniert perfekt jedoch diesen Code verwenden, wo die Schleife mehr wiederholt als das Doppelte des POST dazu führt zu PHP ohne Antwort beendet

und erzeugt das folgende in dem MySql log,

2017-03-03T16: 47: 49.284972Z 450 [Note] abgebrochen Verbindung 450 db: 'zentrale' user: 'username' host: 'localhost' (einen Fehler beim Lesen Kommunikationspakete GOT)

2017-03-03T16: 47: 49.582165Z 451 [Note] Abgebrochen Verbindung 451 bis db: ‚zentralen 'user: ‚username‘ host: ‚localhost‘ (haben Sie einen Fehler beim Lesen der Kommunikationspakete)

so die Frage ist, was habe ich falsch gemacht?

Hinweis ich versuchte

$res->free(); 
$stmt->close(); 

dies führte dann in

Pakete aus, um hinzuzufügen. Erwartete 1 empfangen 7. Paketgröße = 7

mysqli_stmt :: execute(): MySQL-Server ist weg

mysqli_stmt :: execute(): Fehler beim Lesen der Ergebnismenge Header

von Informationen. php

PHP Version 5.6.27 

mysqli 
MysqlI Support enabled 
Client API library version mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $ 
Active Persistent Links  0 
Inactive Persistent Links 0 
Active Links 0 
Directive Local Value Master Value 
mysqli.allow_local_infile On On 
mysqli.allow_persistent On On 
mysqli.default_host no value no value 
mysqli.default_port 3306 3306 
mysqli.default_pw no value no value 
mysqli.default_socket no value no value 
mysqli.default_user no value no value 
mysqli.max_links Unlimited Unlimited 
mysqli.max_persistent Unlimited Unlimited 
mysqli.reconnect Off Off 
mysqli.rollback_on_cached_plink Off Off 
+0

Ich denke, es gibt zu viele Anfrage gemacht Server anrufen müssen und dass dies verursachen könnte ... von bearbeiten Ich denke, http://StackOverflow.com/Questions/2232150/PDO-MYSQL-Server-Ha-Google-Way-Govern-Away Dieser Thread könnte – RohitS

+0

helfen, wie Sie von den Fehlern sehen können, ist es eine localhost DB mit nur ich benutze es, also dort sollte nur dieser Befehl sein, der gerade auf ihn zugreift und diese sollten sequentiell nicht simultan sein – MikeT

+0

T ja ... aber es gibt einige Lösungen ns innerhalb von thread können Sie versuchen..also versuchen Sie aktivieren Reconnect-Eigenschaft .. – RohitS

Antwort

0

das Problem ist, dass Sie $conn["DB"]->next_result();

Hier ist eine saubere Version, die funktioniert

$stmt = $conn["DB"]->prepare('CALL `central`.`permissions_edit`(?,?,?,?,?);'); 
$stmt->bind_param('siiis', $key, $user, $area, $acc, $active); 

foreach ($data as $user => $areas) { 
    foreach ($areas as $area => $access) { 
     foreach ($access as $acc => $active) { 
      if($active == "U") 
      { 
       $rtn["Results"][]= "user=$user areas=$area access=$acc active=$active Message=Unchanged"; 
       continue; 
      } 
      $stmt->execute(); 
      $row = $stmt->get_result()->fetch_assoc(); 
      if(!empty($row["Success"])) 
      { 
       $rtn["Results"][]= "user=$user areas=$area access=$acc active=$active Message=" . $row["Msg"]; 
      } 
      else 
      { 
       $rtn["Success"] = false; 
       $rtn["Errors"][]= "user=$user areas=$area access=$acc active=$active Message=" . $row["Msg"]; 
      } 
      $conn["DB"]->next_result(); 
     } 
    } 
} 
+0

zu viel Code ist nie das Problem nur falscher Code, können Sie darauf hinweisen, welcher Teil falsch war, da das meiste von dem, was Sie getan haben, ist Entfernen aller Fehlerbehandlung – MikeT

+0

Was Sie Lust haben, "Fehlerbehandlung" zu nennen, tut eigentlich nicht * handle * alles. Dennoch macht es diesen Code furchtbar schwer zu lesen und auf den Punkt zu kommen. Jetzt ist es klar und lesbar, ohne dass ein ganzer Bildschirm horizontal gescrollt werden muss. –

+0

wie ich sagte, leichter zu lesen ändert nicht das Verhalten, etwas, was Sie getan haben, hat das Verhalten geändert, nachdem ich nicht weiß, warum dies behebt es, wie kann ich das Problem finden, das nächste Mal, wenn ich mache, was auch immer es war ? – MikeT

-2

Sie können sehen, was cuse diesen Fehler von https://dev.mysql.com/doc/refman/5.7/en/communication-errors.html

Wenn ein Client erfolgreich eine Verbindung herstellt, aber später die Verbindung getrennt oder beendet wird, erhöht der Server die Variable Aborted_clients status und protokolliert eine Aborted-Verbindungsmeldung im Fehlerprotokoll. Die Ursache kann eine der folgenden sein:

  • Das Client-Programm nicht mysql_close hat() aufrufen vor dem Beenden.

  • Der Client geschlafen hatte mehr als wait_timeout oder interactive_timeout Sekunden ohne irgendwelche Anfragen an den Server ausgibt.

  • Das Client-Programm endete abrupt in der Mitte einer Datenübertragung.

Ich glaube jedoch, dass es nicht gut Praktiken ist bind_param Looping zu verwenden, da es nur ein einziges Mal ein, bevor die Schleife verwendet soll. Der zweite Hinweis ist, dass die Verbindung auch dann geschlossen wird, wenn ein Fehler aufgetreten ist.

+1

Leider keine Ihrer Spekulationen sind mit der Frage verbunden. –

+0

Wirklich !! Warum also enthält Ihre Antwort ** bind_param ** außerhalb der Schleife, da meine Spekulationen nicht auf die Frage bezogen sind? –

+0

Weil es nur vernünftig ist, es einmal auszuführen, aber es schadet nicht, eine Schleife aufzurufen => irrelevant für das Problem. –