为什么我不能使用准备功能使用PDO更新行?

时间:2016-03-27 20:41:59

标签: php mysql pdo

我有像这样的SQL $ query ;

UPDATE `tags` SET `tags.name` = :name, 
                  `tags.slug` = :slug,
                  `tags.date_published` = :date_published,
                  `tags.meta_title` = :meta_title,
                  `tags.meta_description` = :meta_description,
                  `tags.meta_keywords` = :meta_keywords
 WHERE `tags.id` = :id

我的 $ values 数组;

Array
(
    [:name] => iphone
    [:slug] => iphone
    [:date_published] => 2016-03-27
    [:meta_title] => iphone Yazıları
    [:meta_description] => iphone hakkında son gelişmeler ve faydalı bilgiler.
    [:meta_keywords] => iphone yazıları, iphone hakkında bilgiler, iphone haberleri
    [:id] => 24
)

我尝试使用PDO的准备功能更新一行;

$sth = $this->db->prepare($query);
$sth->execute($values);
echo "affected rows: ".$sth->rowCount(); // prints 0
return $sth->rowCount() ? true : false;

我没有错误,但执行查询后行不受影响。我的错误在哪里?

mysql tags table

编辑: 我正在创建像这样的值数组;

$params = array(
    "id", "name", "slug", "date_published",
    "meta_title", "meta_description", "meta_keywords");

$values = array();

foreach ($params as $key) {
    @$values[$key] = $_POST[$key];
}

这就是我创建查询的方式;

$query = "UPDATE `$table` SET";
$values = array();

/* Add field names and placeholders to query. */
foreach ($params as $key => $value) {
    $query .= " `{$table}.{$key}` = :" . $key . ",";
    $values[":" . $key] = $value;
}

/* Remove last comma. */
$query = substr($query, 0, -1);

/* Build where condition. */
if ($cond) {
    $query .= " WHERE ";
    foreach ($cond as $key => $value) {
        $query .= " `{$table}.{$key}` = :" . $key . ",";
        $values[":" . $key] = $value;
    }
    /* Remove last comma. */
    $query = substr($query, 0, -1);
}

1 个答案:

答案 0 :(得分:2)

您正在错误地转义列名称。例如,后面的刻度不应该包含整个tags.name,而应该分别包含表和列名称:

`tags`.`name`

检查PDO::errorInfo()的输出确认了这一点(模拟的准备必须设置为false才能看到这一点。)

一般说明:

  • 您不需要为要绑定的数组的键指定冒号前缀(同样在通过bindParam()bindValue()明确绑定列时)。
  • 您应避免在PDO查询中使用反向标记。它们是MySQL特有的功能,PDO不是SQL抽象层(从而阻止了PDO的一个主要优点 - 可移植性)。