5

解決

これを変える:

foreach($fields as $dbfield => $field) {
    $value = isset($_POST[$field]) ? 1 : 0;
    $STH -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 1 );
}

これに:

foreach($fields as $dbfield => $field) {
    $value = isset($_POST[$field]) ? 1 : 0;
    $STH -> bindValue( ':' . $dbfield, $value, PDO::PARAM_INT );
}

質問

次のコードがありますが、エラーは発生しませんが、必要なことは実行されません。

PHP

$fields = array(
    'db_col_1'  => 'cb_1',
    'db_col_2'  => 'cb_2',
    'db_col_3'  => 'cb_3'
);

$parts = array();

foreach($fields as $dbfield => $field){
    $parts[] = '`' . $dbfield . '` = :' . $dbfield;
}

$DBH = new PDO( "mysql:host=localhost;dbname=db", "user", "pass" );
$DBH -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

//temp id
$id = 1;

$STH = $DBH -> prepare( 'UPDATE `table1` SET ' . join(', ', $parts) . ' WHERE `id`= :id' );

$STH -> bindParam( ':id', $id, PDO::PARAM_INT, 10 );

foreach($fields as $dbfield => $field) {
    $value = isset($_POST[$field]) ? 1 : 0;
    $STH -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 1 );
}

$STH -> execute();

HTML

<input id="cb_1" name="cb_1" type="checkbox" value="cb_1" />
<br />
<input id="cb_2" name="cb_2" type="checkbox" value="cb_2" />
<br />
<input id="cb_3" name="cb_3" type="checkbox" value="cb_3" />

データベースは更新されますが、次のようにチェックボックスをオンにすると:

サンプルのチェックボックスの状態

cb_1 = 1
cb_2 = 1
cb_3 = 0

データベース内のすべての列が取得され0ます。

次のようにチェックボックスをオンにすると:

サンプルのチェックボックスの状態

cb_1 = 0
cb_2 = 0
cb_3 = 1

データベース内のすべての列が取得され1ます。

誰でもこれを修正する方法を知っていますか?

ループが終了するまでに、に基づく値を持つと私が思うbindParam実際の変数を(参照によって)バインドするためでしょうか?$value$_POST['cb_3']

だから私は使用することになっていると思いますbindValueか?しかし、方法がわからない..ドキュメントを確認しましたが、わかりにくいと思います。

4

1 に答える 1

14

PDOStatement :: bindParam()は、PDOに次のことを伝える方法です。«後でこのステートメントを実行するときは、この変数から値を読み取ってください»。つまり、呼び出し時にが存在し、元の​​値を保持$STH -> execute()する$value必要があります。

このように使用しているので:

foreach($fields as $dbfield => $field) {
    $value = isset($_POST[$field]) ? 1 : 0;
    $STH -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 1 );
}

...$valueループが繰り返されるたびに上書きされ、値が失われます。(最後のものだけが残ります。)

PDOStatement :: bindValue()を使用する必要があります。これは、「この値を保存し、後でステートメントを実行するときに使用する」ことを意味します。このようにして、変数は不要になります。

于 2013-03-01T09:29:04.143 に答える