用于DELETE语句的bindValue内部循环

时间:2015-01-27 19:26:38

标签: php mysql

我的DELETE查询方法存在“小问题”。 此代码不会给出任何错误,因此它应该可以正常工作。但是在数据库中没有任何改变,我想要删除的行仍然存在。

主要问题可能在这里:

$query = $this->conn->prepare($sql);

            foreach ($value as $row) {
                if(is_int($row)){
                    $query->bindValue(':'.$field[$k].'', $row, PDO::PARAM_INT);
                } else
                {
                    $query->bindValue(':'.$field[$k].'', $row, PDO::PARAM_STR);
                }
                $k++;
            }
        $query->execute();

该循环内部出现问题。我准备的SQL看起来像: DELETE FROM account WHERE id =':id' 所以它看起来很好,我只是试图绑定:id的值(如果有更多的WHERE它也将绑定它们)但没有任何反应。没有错误也没有影响。 我手动检查了foreach,$ field [$ k]和$ row返回正确的值。 我坐了4个小时。不知道出了什么问题......或者我只是失明了。

此外,我在Insert方法中使用完全相同的循环,并且一切正常。

我的代码:( sry for long code)

class Delete extends Connection{

public function deleteClause($table, $where = array()){

    if (count($where) % 3 === 0) {


            $length = count($where) / 3;

            $counter = $count = $k = 0;


            for ($i = 0; $i < $length; $i++) {


                for ($j = $count; $j < (count($where) / $length) + $count; $j++) {
                    $field[$i]    = $where[$j];
                    $j            = $j + 1;
                    $operator[$i] = $where[$j];
                    $j            = $j + 1;
                    $value[$i]    = $where[$j];
                    $counter      = $j + 1;
                }
                $count = $counter;
            }

            $sql = "DELETE FROM $table WHERE ";

            for ($i = 0; $i < $length; $i++) {
                if ($i == $length - 1) {
                    $sql .= "$field[$i] $operator[$i] ':$field[$i]'";
                } else {
                    $sql .= "$field[$i] $operator[$i] ':$field[$i]' AND ";
                }
            }
            echo $sql;
            $query = $this->conn->prepare($sql);


            foreach ($value as $row) {
                if(is_int($row)){
                    $query->bindValue(':'.$field[$k].'', $row, PDO::PARAM_INT);
                } else
                {
                    $query->bindValue(':'.$field[$k].'', $row, PDO::PARAM_STR);
                }
                $k++;
            }
            $query->execute();

        return true;
    } else {
        echo "Niepoprawna ilość argumentów funkcji";
        return false;
    }        
}}

1 个答案:

答案 0 :(得分:0)

使用占位符时,在准备好的查询中,'没有用处。 像

这样的行
$sql .= "$field[$i] $operator[$i] ':$field[$i]'"

应该改写为

$sql .= "$field[$i] $operator[$i] :$field[$i]"

占位符周围没有引号 - :$field[$i],而不是':$field[$i]'