手始めに、bindParam()
を使用しています bindValue()
のように 、まったく違います
。
配列値をどこから取得しているかを確認しないと、何が起こっているのかを確実に確認するのが少し難しくなります。提供している情報は、実際には使用しているコードではなく、変更されているようです。特に、説明している内容はBindParamに共通の問題であるため、foreachループとdata_array変数に関しては、これが前提です。作業します。その場合は、一般に、ブロック内のコードだけでなく、使用される変数や問題が見つかったブロックの初期化を含む実際のコードスニペットを提供することをお勧めします。
理由
の別の回答を次に示します。 、基本的には、foreachループの値の部分を参照して渡すか、bindParamsをbindValuesに変更するようにしてください。また、両方のbindParam()
を実行しているため、この構造を引き続き使用する場合は、1つではなく2つの別々のオブジェクトを使用していることを確認する必要があります。 execute()
を呼び出すたびにメソッド 。
たとえば、コード構造は変更されていません(これはすべてループ内にあり、Executeのみがループ内にある必要があるためです):
$set_data1 = "UPDATE data_table
SET data_status = 'PROCESSED'
WHERE data_id = :data_id1";
$stmt = $db->prepare($set_data1);
$stmt->bindValue(':data_id1', $data_array1['data_id'], PDO::PARAM_INT);
$stmt->execute();
$set_data2 = "UPDATE data_table
SET data_status = 'PENDING'
WHERE data_id = :data_id2";
$stmt2 = $db->prepare($set_data2);
$stmt2->bindValue(':data_id2', $data_array2['data_id'], PDO::PARAM_INT);
$stmt2->execute();
ただし、これを行うためのより最適な方法は次のようになります(これは単なる一般的な例であることに注意してください):
$set_data = "UPDATE data_table
SET data_status = :data_status
WHERE data_id = :data_id";
$data_array = array( array('data_status' => $dataStatus1, 'data_id' => $dataId), array('data_status' => $dataStatus2, 'data_id' => $dataId2) );
/* this is just to represent a multidimensional array (or a multidimensional object) containing the data status and the data id which should be handled and decided before you pass them into a loop. */
$stmt = $db->prepare($set_data);
$data_status = null;
$data_id = null;
$stmt->bindParam(':data_status', $data_status);
$stmt->bindParam(':data_id', $data_id);
foreach( $data_array as $name => $val ) {
$data_status = $val['data_status'];
$data_id = $val['data_id'];
$stmt->execute()';
}