解
改变这个:
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" />
数据库会更新,但如果我选中以下复选框:
示例CHECKBOX STATES
cb_1 = 1
cb_2 = 1
cb_3 = 0
数据库中的每一列都有0
。
如果我选中以下复选框:
示例CHECKBOX STATES
cb_1 = 0
cb_2 = 0
cb_3 = 1
数据库中的每一列都有1
。
任何人都知道如何解决这个问题?
可能是因为bindParam
绑定实际变量$value
(通过引用),我认为,当循环结束时,它具有基于$_POST['cb_3']
的值?
所以我认为我应该使用bindValue
?但不确定如何...我已经检查了文档,但发现它令人困惑。
答案 0 :(得分: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(),这意味着:«存储此值并在以后执行语句时使用它»。这样,变量就不再是必需的了。