【问题标题】:Why I cant update rows with PDO using prepare function?为什么我不能使用准备函数更新带有 PDO 的行?
【发布时间】:2016-03-27 20:41:59
【问题描述】:

我有一个这样的 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);
}

【问题讨论】:

  • 你的数组看起来很奇怪。你能在你创建这个数组的地方展示你的 PHP 代码吗?
  • 看起来您正在使用 phpMyAdmin。您是否确认(在 phpMyAdmin 中)这些行确实没有受到影响?这将帮助您确定问题出在您的查询上,还是出在 rowCount() 上。
  • 如果要更新到相同的数据,则不会发生更新,因此行数为 0。
  • @low_rents 我添加了创建数组的方式。
  • @alexw 是的,我检查了行,它们没有受到影响。 :(

标签: php mysql pdo


【解决方案1】:

您错误地转义了列名。例如,反引号不应包含整个tags.name,而应将表名和列名分开:

`tags`.`name`

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

一般说明:

  • 您不需要为要绑定的数组的键指定冒号前缀(通过bindParam() 或bindValue() 显式绑定列时也是如此)。
  • 您应该避免在 PDO 查询中使用反引号。它们是 MySQL 特有的功能,而 PDO 不是 SQL 抽象层(因此妨碍了 PDO 的主要优点之一 - 可移植性)。

【讨论】:

  • 非常感谢。 :) 但是当我将模拟准备设置为 false 时,我不能对 FETCH_CLASS 使用 setFetchMode 函数,为什么我不能?
  • 这不是我知道的限制。我建议你打开另一个问题,用示例代码概述你的新问题,因为 cmets 部分不是解决这个问题的实际地方。
猜你喜欢
  • 2016-11-19
  • 2011-05-14
  • 2012-05-31
  • 1970-01-01
  • 2016-04-30
  • 2011-08-01
  • 1970-01-01
  • 2020-08-27
相关资源
最近更新 更多