2017-09-21 8 views
0

私は、それぞれ異なるサーバーにある2つのデータベースに接続し、更新を実行するスクリプトを完成しようとしています。基本的に、テーブルの選択と挿入は同じです。先日、ダンプ/インポートを行いました。スクリプトは、ローカルのテーブルを遠隔から最新の状態に保つ必要があります。遠隔のレコードが毎日挿入され、ローカルに最新の状態に保つ必要があるからです。PHPスクリプトで文字列をエスケープする/挿入する

ここで重要な点は、テーブルが共有する自動インクリメントプライマリキーであるSESSIONIDを調べることで、リモートサーバー上の新しい行を決定することです。私はIDがローカルサーバーではなく、ローカルサーバーに存在する場合、これらのレコードをローカルサーバーに挿入すると、私のループは以下のようになります。

以下のスクリプトをpowershellでphp 'filename'と入力すると、正常な接続メッセージが得られます。このメッセージはIncorrect datetime value: '' for column 'ALERTINGTIMESTAMP' at row 1です。このレコードでは挿入しようとしていますが、日時の値はNULLですが、テーブルは許されますが、エスケープ文字や何かの問題であるかと心配しています。

これを変更して正しくエスケープしたり、これらのレコードを挿入するにはどうすればよいですか。

注:この状況では、レプリケーションと大量のダンプ/インポート/テーブルの再作成はオプションではありません。この実行にはいくつかの同様のスクリプトがあり、ここでは同じプロセスを維持したいと考えています。私は単にこれらのエラーを解決するか、誰かに私がこのスクリプトをより効率的にコーディングする方法を教えてもらいたいと思っています。ここで

はスクリプトです:

 ini_set('memory_limit', '256M'); 

     // Create connection 
     $conn = new mysqli($servername, $username, $password); 
     $conn2 = new mysqli($servername2, $username2, $password2); 

     // Check connection 
     if ($conn->connect_error) { 
      die("Connection failed: " . $conn->connect_error); 
     } 
     echo "Connected successfully"; 

     // Check connection2 
     if ($conn2->connect_error) { 
      die("Connection failed: " . $conn2->connect_error); 
     } 
     echo "Connected successfully"; 


    $latest_result = $conn2->query("SELECT MAX(`SESSIONID`) FROM `ambition`.`session`"); 
    $latest_row = $latest_result->fetch_row(); 
    $latest_session_id = $latest_row[0]; 

    //Select All rows from the source phone database 
    $source_data = mysqli_query($conn, "SELECT * FROM `cdrdb`.`session` WHERE `SESSIONID` > $latest_session_id"); 

     // Loop on the results 
     while($source_item = $source_data->fetch_assoc()) { 

      // Check if row exists in destination phone database 
      $row_exists = $conn2->query("SELECT SESSIONID FROM ambition.session WHERE SESSIONID = '".$source_item['SESSIONID']."' ") or die(mysqli_error($conn2)); 

       //if query returns false, rows don't exist with that new ID. 
      if ($row_exists->num_rows == 0){ 

        //Insert new rows into ambition.session 
        $conn2->query("INSERT INTO ambition.session (SESSIONID,SESSIONTYPE,CALLINGPARTYNO,FINALLYCALLEDPARTYNO,DIALPLANNAME,TERMINATIONREASONCODE,ISCLEARINGLEGORIGINATING,CREATIONTIMESTAMP,ALERTINGTIMESTAMP,CONNECTTIMESTAMP,DISCONNECTTIMESTAMP,HOLDTIMESECS,LEGTYPE1,LEGTYPE2,INTERNALPARTYTYPE1,INTERNALPARTYTYPE2,SERVICETYPEID1,SERVICETYPEID2,EXTENSIONID1,EXTENSIONID2,LOCATION1,LOCATION2,TRUNKGROUPNAME1,TRUNKGROUPNAME2,SESSIONIDTRANSFEREDFROM,SESSIONIDTRANSFEREDTO,ISTRANSFERINITIATEDBYLEG1,SERVICEEXTENSION1,SERVICEEXTENSION2,SERVICENAME1,SERVICENAME2,MISSEDUSERID2,ISEMERGENCYCALL,NOTABLECALLID,RESPONSIBLEUSEREXTENSIONID,ORIGINALLYCALLEDPARTYNO,ACCOUNTCODE,ACCOUNTCLIENT,ORIGINATINGLEGID,SYSTEMRESTARTNO,PATTERN,HOLDCOUNT,AUXSESSIONTYPE,DEVICEID1,DEVICEID2,ISLEG1ORIGINATING,ISLEG2ORIGINATING,GLOBALCALLID,CADTEMPLATEID,CADTEMPLATEID2,ts,INITIATOR,ACCOUNTNAME,APPNAME,CALLID,CHRTYPE,CALLERNAME,serviceid1,serviceid2) 
        VALUES ('".$source['SESSIONID']."' , 
          '".$source['SESSIONTYPE']."' , 
          '".$source['CALLINGPARTYNO']."' , 
          '".$source['FINALLYCALLEDPARTYNO']."', 
          '".$source['DIALPLANNAME']."', 
          '".$source['TERMINATIONREASONCODE']."', 
          '".$source['ISCLEARINGLEGORIGINATING']."', 
          '".$source['CREATIONTIMESTAMP']."', 
          '".$source['ALERTINGTIMESTAMP']."', 
          '".$source['CONNECTTIMESTAMP']."', 
          '".$source['DISCONNECTTIMESTAMP']."', 
          '".$source['HOLDTIMESECS']."', 
          '".$source['LEGTYPE1']."', 
          '".$source['LEGTYPE2']."', 
          '".$source['INTERNALPARTYTYPE1']."', 
          '".$source['INTERNALPARTYTYPE2']."', 
          '".$source['SERVICETYPEID1']."', 
          '".$source['SERVICETYPEID2']."', 
          '".$source['EXTENSIONID1']."', 
          '".$source['EXTENSIONID2']."', 
          '".$source['LOCATION1']."', 
          '".$source['LOCATION2']."', 
          '".$source['TRUNKGROUPNAME1']."', 
          '".$source['TRUNKGROUPNAME2']."', 
          '".$source['SESSIONIDTRANSFEREDFROM']."', 
          '".$source['SESSIONIDTRANSFEREDTO']."', 
          '".$source['ISTRANSFERINITIATEDBYLEG1']."', 
          '".$source['SERVICEEXTENSION1']."', 
          '".$source['SERVICEEXTENSION2']."', 
          '".$source['SERVICENAME1']."', 
          '".$source['SERVICENAME2']."', 
          '".$source['MISSEDUSERID2']."', 
          '".$source['ISEMERGENCYCALL']."', 
          '".$source['NOTABLECALLID']."', 
          '".$source['RESPONSIBLEUSEREXTENSIONID']."', 
          '".$source['ORIGINALLYCALLEDPARTYNO']."', 
          '".$source['ACCOUNTCODE']."', 
          '".$source['ACCOUNTCLIENT']."', 
          '".$source['ORIGINATINGLEGID']."', 
          '".$source['SYSTEMRESTARTNO']."', 
          '".$source['PATTERN']."', 
          '".$source['HOLDCOUNT']."', 
          '".$source['AUXSESSIONTYPE']."', 
          '".$source['DEVICEID1']."', 
          '".$source['DEVICEID2']."', 
          '".$source['ISLEG1ORIGINATING']."', 
          '".$source['ISLEG2ORIGINATING']."', 
          '".$source['GLOBALCALLID']."', 
          '".$source['CADTEMPLATEID']."', 
          '".$source['CADTEMPLATEID2']."', 
          '".$source['ts']."', 
          '".$source['INITIATOR']."', 
          '".$source['ACCOUNTNAME']."', 
          '".$source['APPNAME']."', 
          '".$source['CALLID']."', 
          '".$source['CHRTYPE']."', 
          '".$source['CALLERNAME']."', 
          '".$source['serviceid1']."', 
          '".$source['serviceid2']."')"); 
        } 
     } 
+0

クエリに変数を入れるのではなく、パラメータ付きクエリを使用します。このリンクをチェックアウトしてください。http://php.net/manual/en/mysqli.prepare.php –

+0

私は、ほとんどの部分について理解していると思います(私はPHP側よりもmysql側に慣れています)。しかし、どのようにして私の既存のコードをどれだけ正確に変更できますか?私はループを維持するか?そして、どのように私は別の選択/挿入ステートメントを変更する必要がありますか? –

答えて

1

を。ここでは、他の変数と一緒に自分自身を追加できるいくつかのパラメータでクエリの例を取り上げました。

$stmt = $conn2->prepare("INSERT INTO ambition.session (SESSIONID,SESSIONTYPE,CALLINGPARTYNO,FINALLYCALLEDPARTYNO) VALUES (:SESSIONID ,:SESSIONTYPE ,:CALLINGPARTYNO ,:FINALLYCALLEDPARTYNO)"); 

$stmt->bindParam(':SESSIONID', $source['SESSIONID']); 
$stmt->bindParam(':SESSIONTYPE', $source['SESSIONTYPE']); 
$stmt->bindParam(':CALLINGPARTYNO', $source['CALLINGPARTYNO']); 
$stmt->bindParam(':FINALLYCALLEDPARTYNO', $source['FINALLYCALLEDPARTYNO']); 
$stmt->execute(); 

あなたはこのリンクをより理解するためにチェックアウトすることができます。 http://php.net/manual/en/mysqli.prepare.php

+0

そのようなフォーマットに従って、他の48個程度のカラム変数を同じ方法で追加すれば、それでもパラメータ化されますか?これは配列をループするのではなく、より良い方法ですか?私はこのようにしてすべての変数を見ることができるようにしたいと思います。私はちょっと慣れていないので、確信しています –

+0

はい、これはパラメータ化されています。できます –

+0

私はその正確な形式を行ったので、私はすべての列の名前を正しく指定しました。私は問題が見つからないと言っている構文チェッカーを持っていますが、PowerShellで実行すると、私の '' 'VALUES(:SESSIONID、:SESSIONTYPE、:CALLINGPARTYNO、' '行 –

2

パンカジはこのような何かしようと、言ったように:あなたはパラメータ化クエリを使用するための準備()関数を使用する必要が

//Insert new rows into ambition.session 
$statement = $conn2->prepare('INSERT INTO ambition.session (SESSIONID,SESSIONTYPE,CALLINGPARTYNO,FINALLYCALLEDPARTYNO,DIALPLANNAME,TERMINATIONREASONCODE,ISCLEARINGLEGORIGINATING,CREATIONTIMESTAMP,ALERTINGTIMESTAMP,CONNECTTIMESTAMP,DISCONNECTTIMESTAMP,HOLDTIMESECS,LEGTYPE1,LEGTYPE2,INTERNALPARTYTYPE1,INTERNALPARTYTYPE2,SERVICETYPEID1,SERVICETYPEID2,EXTENSIONID1,EXTENSIONID2,LOCATION1,LOCATION2,TRUNKGROUPNAME1,TRUNKGROUPNAME2,SESSIONIDTRANSFEREDFROM,SESSIONIDTRANSFEREDTO,ISTRANSFERINITIATEDBYLEG1,SERVICEEXTENSION1,SERVICEEXTENSION2,SERVICENAME1,SERVICENAME2,MISSEDUSERID2,ISEMERGENCYCALL,NOTABLECALLID,RESPONSIBLEUSEREXTENSIONID,ORIGINALLYCALLEDPARTYNO,ACCOUNTCODE,ACCOUNTCLIENT,ORIGINATINGLEGID,SYSTEMRESTARTNO,PATTERN,HOLDCOUNT,AUXSESSIONTYPE,DEVICEID1,DEVICEID2,ISLEG1ORIGINATING,ISLEG2ORIGINATING,GLOBALCALLID,CADTEMPLATEID,CADTEMPLATEID2,ts,INITIATOR,ACCOUNTNAME,APPNAME,CALLID,CHRTYPE,CALLERNAME,serviceid1,serviceid2) 
VALUES (?, ?, ?, ...);'); 
$statement->bindParam(1, $source['SESSIONID']); 
$statement->bindParam(2, $source['SESSIONTYPE']); 
$statement->bindParam(3, $source['CALLINGPARTYNO']); 
//... 
$statement->execute();