2017-03-03 11 views
0

I次のコードを持っている:ループ用意した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; 
} 

ループが1〜2回を繰り返し、このコードを使用したが、しかし、ループが3回以上のためにPHPにするPOSTを引き起こし繰り返し、このコードを使用して完全に 作品無応答

で終端とMySQLログに次のように生成し、

2017-03-03T16:47:49.284972Z 450 [注] DBへの接続450が失敗しました: '中央' ユーザ '名' ホスト 'localhost' の( 通信パケットを読み取るガットエラー)

2017-03-03T16:47:49.582165Z 451 [注] DBへ 接続451が失敗しました:「中央'user:' username 'host:' localhost ' (通信パケットの読み込みにエラーが発生しました)

質問はどうしたのですか?

私は、これがその後、順不同

パケットもたらし

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

を追加しようとしました。 1 7.パケットサイズ= 7

mysqli_stmt ::実行を()受信予想:エラー情報から

結果セットのヘッダを読み:MySQLのサーバが離れ

mysqli_stmt ::実行を()行ってきました。 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

の作品整頓バージョンである私が、サーバーに対して行われた非常に多くの要求があり、それがこれを引き起こしている可能性が...から推測します編集私は推測するhttp://stackoverflow.com/questions/2232150/pdo-mysql-server-has-gone-awayこのスレッドは – RohitS

+0

あなたがエラーから見ることができるようにローカルホストDBそれを使用して私だけと現在アクセスしているこのコマンドだけでなければならず、これらは同時にではありません。 – MikeT

+0

Tはい...しかし、いくつかの解決策がありますあなたは試してみることができるスレッド内のns ..また、再接続プロパティを有効にしようとする。 – RohitS

答えて

0

問題は、あなたがここで$conn["DB"]->next_result();

を呼び出す必要があるということですが

$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

あまりにも多くのコードは、間違ったコードでは決して問題ではありません。どの部分が間違っていたかを指摘できますか?ほとんどの場合、すべてのエラー処理が削除されます。 – MikeT

+0

"エラー処理" *何かを扱う。しかし、それはこのコードを読みにくくしてポイントに近づけるのが難しい。画面全体を水平にスクロールする必要がなく、きれいで読みやすい。 –

+0

私は、読みやすく、行動を変えないと言ったように、あなたがやったことは行動を変えてしまったのですが、なぜそれが修正されるのかわからないのですが、次回は、 ? – MikeT

-2

あなたがhttps://dev.mysql.com/doc/refman/5.7/en/communication-errors.html

からこのエラー必ず使う何を参照することができます

クライアントが正常に接続されたが、後で正しく接続が切断されるか、 が終了すると、サーバはAborted_clientsステータスを 変数に増分し、エラーログにAborted接続メッセージを記録します。 原因は、次のいずれかになります

  • クライアントプログラムが終了する前ににmysql_close()を呼び出していませんでした。

  • クライアントが サーバーへのリクエストを発行することなく、よりWAIT_TIMEOUTまたは秒は、interactive_timeout を眠っていました。

  • クライアントプログラムは、データ転送の途中で突然終了しました。

しかし、私はそれはそれはループの前に一度だけ1を使用しなければならないことから、ループ内bind_paramを使用することは良い習慣ではないと信じています。 2番目の注意は、エラーが発生しても接続を閉じることです。

+1

残念なことに、あなたの推測のどれも質問された質問に関連していません。 –

+0

本当に!だから私の推測は質問に関連していないので、なぜあなたの答えは** bind_param **ループ側に含まれていますか? –

+0

これは一度実行するだけで正常ですが、問題に関係のないループを呼び出すことには害はありません。 –

関連する問題