PHP PDO中bindParam和bindValue有什么区别?

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?但不确定如何操作。。我已经查看了文档,但感到困惑。


一个tag wiki包含了关于这个问题的建议。 - Your Common Sense
1
我认为在来这里询问之前,你应该尝试使用 bindValue() - Voitcus
1个回答

16

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 );
}
< p>在每个循环迭代中,$value被覆盖,你的值会丢失。(只有最后一个值保留下来。)

你需要使用PDOStatement::bindValue(),它的意思是:“存储这个值,并在执行语句时使用它”。这样,变量就不再必要了。


1
我反对恶意的匿名踩票行为 :/ 感谢您的解释。 - Coldblackice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接