我正在尝试使用PDO功能更新数据库,但密码将更新用户名,名称不会更新,但名称正在更新为0而不是我更改的内容?
public function insert($table, $fields = array()){
$keys = array_keys($fields);
$values = '';
$x = 1;
foreach($fields as $field) {
$values .="?";
if($x < count($fields)) {
$values .= ', ';
}
$x++;
}
$sql = "INSERT INTO users (`" . implode('`, `', $keys) . "`) VALUES ({$values})";
if(!$this->query($sql, $fields)->error()) {
return true;
}
return false;
}
并在此处显示数据:
$user = DB::getInstance()->update('users', 1, array(
password => 'erwrwe',
name => 'Dan'
));
答案 0 :(得分:0)
阵列从0开始,而你在$x = 1
开始计算阵数,这意味着你正遭受围栏错误的困扰(又名&#34; off-by-one&#34 ;)
将您的代码更改为
if($x <= count($fields)) {
^---
或以$x = 0
开头。
评论跟进:看看你的代码在做什么:
$ fields = array(&#39; name&#39; =&gt;&#39; foo&#39;,&#39;密码&#39; =&gt;&#39; bar&#39;); < / p>
包含两个项目的数组,因此count($files)
为2
$x = 1;
foreach($fields as $field) {
if ($x < count(fields) { ... }
}
在第一次迭代中:
field -> name, $x -> 1, count -> 2
$x < count --> 1 < 2 --> TRUE
... add a ?
$x++
在第二次迭代中:
field -> password, $x -> 2, count -> 2
$x < count --> 2 < 2 --> FALSE
循环中止,您最终只会在?
列表中找到一个$values
。
对于你的三项测试,你成功处理$ x = 1和$ x = 2,但是循环在第3项上中止,因为$x < 3
为FALSE。
所以是的,这是一个错误的错误。如果您$x <= 3
或0
启动了$ x,那么您可以正确处理数组中的最后一项。
答案 1 :(得分:0)
除了Marc B的回答。如果您要将文本插入数据库,则需要在您周围引用值:
$sql = "INSERT INTO users (`" . implode('`, `', $keys) . "`) VALUES ('{$values}')";