2012-01-21 10 views
0

すべては、私のPHP PDOは、終わりのないMySQLレコードループを挿入するのはなぜですか?

私は以下のコードをしようとしている、と私はそれを書かれているように、$insertedの値はTRUEになったことがないと思い、私がなぜわかりません。プログラムを実行すると、何千もの空のレコードが作成され、サーバーを手動でシャットダウンする必要があります。

function createRecord(){ // Query creates a new empty record in table, returns the auto-incremented ID. 
      $dbConnection=$this->dbConnect(); 
      $inserted=false; 
      $IDQuery=null; 
      while (!$inserted){ 
       $insertQuery=$dbConnection->prepare("INSERT INTO $this->table() VALUES()"); 
       $inserted=$insertQuery->execute(); 
       if ($inserted){ 
        $IDQuery=$dbConnection->prepare("SELECT LAST_INSERT_ID()"); 
        $IDQuery->execute(); 
       } 
      } 
      $result=$IDQuery->fetch(PDO::FETCH_ASSOC); 
      $ID=$result["Last_Insert_ID()"]; 
      return $ID; 
     } 

多くのお手伝いをいただきありがとうございます。

乾杯、

JDelage

編集:私は、コードのスタンドアローン部分で問題を再現することはできませんので、私は問題は、コードのこの部分に関連していないと思います。

+0

OK、テストを実行した後気づいたのは、 '' Last_Insert_ID() ''を '' LAST_INSERT_ID() ''に大文字にする必要があることです。 – JDelage

答えて

2

最後の挿入IDのクエリを実行する代わりに、PDO :: last_insert_idを使用する必要があります。

http://php.net/manual/de/pdo.lastinsertid.php

私はなぜあなたはあなたの行を挿入するためにループを使用する必要があるだろうかわかりません。準備され実行されたステートメントをdebugDumpParams()で検査してみると、そのような文字列に変数を挿入するのではなく、準備されたステートメントにbindParam()を使用することができます。

編集:挿入しようとしているテーブルにAUTO_INCREMENTの列が設定されていることを確認しましたか?そうしないと、PDOドライバはlast_insert_id()の意味のあるデータを返しません。

+0

'PDO :: last_insert_id'と' debugDumpParams() 'をチェックしますが、私はそれに慣れていません。それらを私の注意を引くことに感謝します。なぜ '$ inserted'がfalseのままであるのかについての示唆はありますか? – JDelage

+0

あなたのコードと 'dbConnect()'メソッドが再作成されましたが、その問題を再現することはできません。テーブル構造をチェックして、カラムのインデックスがあり、そのカラムが 'AUTO_INCREMENT'に設定されていることを確認してください。この時点で私が考えることができるのは唯一のことです。さらにコードを見て、さらに助けてください。 '$ inserted'変数は、ループの最初のサイクルでtrueに設定されます。この問題は、表示されているコードスニペット以外の場所にあるようです。 – bkzland

+0

なぜMySQL関数ではなく 'PDO :: last_insert_id'を使用する方が良いでしょうか?もっとdbに不可能なコードを持つだけですか? – JDelage

関連する問題