我有以下代码,几乎可以使用:
<?php
if( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
$fields = array(
'col1' => 'cb1',
'col2' => 'cb2',
'col3' => 'cb3',
'col4' => 'cb4',
'col5' => 'cb5',
'col6' => 'cb6',
'col7' => 'cb7',
'col8' => 'cb8',
'col9' => 'cb9',
'col10' => 'cb10'
);
$parts = array();
foreach( $fields as $dbfield => $field ) {
$parts[] = '`' . $dbfield . '` = :' . $dbfield;
}
$dbh = new PDO( 'mysql:host=localhost;dbname=database', 'user', 'pass' );
$dbh -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth = $dbh -> prepare( 'UPDATE `table1` SET ' . join( ', ', $parts ) . ' WHERE `id` = :id' );
// temp simulation value
$id = 1;
$sth -> bindParam( ':id', $id, PDO::PARAM_INT, 4 );
foreach( $fields as $dbfield => $field ) {
$value = isset( $_POST[$field] ) ? 1 : 0;
$sth -> bindParam( ':' . $dbfield, $value, PDO::PARAM_INT, 4 );
}
$sth -> execute();
$dbh = null;
}
?>
<html>
<head>
<title></title>
</head>
<body>
<form method="post">
<input type="checkbox" name="cb1" /><br />
<input type="checkbox" name="cb2" /><br />
<input type="checkbox" name="cb3" /><br />
<input type="checkbox" name="cb4" /><br />
<input type="checkbox" name="cb5" /><br />
<input type="checkbox" name="cb6" /><br />
<input type="checkbox" name="cb7" /><br />
<input type="checkbox" name="cb8" /><br />
<input type="checkbox" name="cb9" /><br />
<input type="checkbox" name="cb10" />
<input type="submit" value="save" />
</form>
</body>
</html>
它应该插入0或1,具体取决于所选的复选框,但由于某种原因,无论选择哪个复选框,它都会将0插入所有列。但是,如果选中了最后一个复选框,则会在所有列中插入1。
答案 0 :(得分:3)
bindParam
绑定实际变量$value
(通过引用),在循环结束时,它具有基于$_POST['cb10']
的值。 (回想一下,PHP没有块作用域,因此只有一个$value
变量,而不是每个循环迭代一个。)
我认为您打算使用bindValue
。
bool PDOStatement :: bindParam(混合$参数,混合&amp; $变量[, int $ data_type = PDO :: PARAM_STR [,int $ length [,mixed $ driver_options]]])
bool PDOStatement :: bindValue(混合$参数 ,混合$ value [,int $ data_type = PDO :: PARAM_STR])
答案 1 :(得分:0)
此更改应该可以解决问题
foreach( $fields as $dbfield => $field ) {
$parts[] = '`' . $dbfield. '` = :' . $_POST[$field];
}