在字段中插入0

时间:2014-10-03 20:07:21

标签: php pdo

我正在尝试使用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'
));

2 个答案:

答案 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 <= 30启动了$ x,那么您可以正确处理数组中的最后一项。

答案 1 :(得分:0)

除了Marc B的回答。如果您要将文本插入数据库,则需要在您周围引用值:

 $sql = "INSERT INTO users (`" . implode('`, `', $keys) . "`) VALUES ('{$values}')";