带有bindParam和bindValue的PHP PDO?

osh*_*nen 5 php pdo

改变这个:

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

对此:

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

我有以下代码,它没有给出任何错误,但它没有做我需要它做的事情:

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();
Run Code Online (Sandbox Code Playgroud)

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" />
Run Code Online (Sandbox Code Playgroud)

数据库会更新,但如果我选中复选框,如下所示:

样本复数字符状态

cb_1 = 1
cb_2 = 1
cb_3 = 0
Run Code Online (Sandbox Code Playgroud)

db中的每一列都有0.

如果我选中复选框如下:

样本复数字符状态

cb_1 = 0
cb_2 = 0
cb_3 = 1
Run Code Online (Sandbox Code Playgroud)

db中的每一列都有1.

有人知道怎么修这个东西吗?

可能是因为bindParam绑定实际变量$value(通过引用)我认为,在循环结束时,它具有基于的值$_POST['cb_3']

所以我认为我应该使用bindValue?但不确定如何..我已经检查了文档,但发现它令人困惑.

Álv*_*lez 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 );
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @DownVoter - 小心解释为什么这个答案没用,所以我们都可以向你学习? (6认同)