PHP PDO with bindParam vs bindValue?



解决方案

更改此项:

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?但不确定如何。。我查过文件,但发现很混乱。

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((,这意味着:«存储此值,并在稍后执行语句时使用它»。这样,变量就不再是必需的了。

最新更新