PHP PDO 与 bindParam 与 bindValue? [复制]

Posted

技术标签:

【中文标题】PHP PDO 与 bindParam 与 bindValue? [复制]【英文标题】:PHP PDO with bindParam vs bindValue? [duplicate] 【发布时间】:2013-02-15 18:04:41 【问题描述】:

解决方案

改变这个:

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 包含有关此问题的建议 我认为您应该先尝试bindValue(),然后再在这里提问。 【参考方案1】:

PDOStatement::bindParam() 是告诉 PDO 的一种方式:«当您稍后执行此语句时,请从该变量中读取值»。这意味着当调用$STH -&gt; execute() 时,$value 必须存在并且必须保持其原始值。

既然你是这样使用的:

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

...$value 在每次循环迭代时都会被覆盖,并且您的值会丢失。 (只剩下最后一个了。)

您需要使用PDOStatement::bindValue(),这意味着:«存储此值并稍后在执行语句时使用它»。这样,变量就不再需要了。

【讨论】:

@DownVoter - 想解释一下为什么这个答案没有用,所以我们都可以向你学习? 我拒绝投赞成票:/感谢您的解释。

以上是关于PHP PDO 与 bindParam 与 bindValue? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO::bindParam() 数据类型.. 它是如何工作的?

使用 PHP PDO 显示 bindParam 的值

使用 PHP PDO 显示 bindParam 的值

PHP PDO bindParam() 和 MySQL BIT

PHP扩展PDO MySQL之PDOStatement::bindParam vs bindValue

用于“IN”语句的变量/字符串的 PHP PDO bindParam...? [复制]