Php 为什么我不能使用prepare函数用PDO更新行?

Php 为什么我不能使用prepare函数用PDO更新行?,php,mysql,pdo,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` =

我有一个这样的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
$params = array(
    "id", "name", "slug", "date_published",
    "meta_title", "meta_description", "meta_keywords");

$values = array();

foreach ($params as $key) {
    @$values[$key] = $_POST[$key];
}
和我的$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的prepare函数更新一行

$sth = $this->db->prepare($query);
$sth->execute($values);
echo "affected rows: ".$sth->rowCount(); // prints 0
return $sth->rowCount() ? true : false;
我没有得到任何错误,但在执行查询后,行不会受到影响。我的错在哪里

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

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
$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);
}

您正在错误地转义列名。例如,后面的记号不应包含整个
标记.name
,而应分别包含表名和列名:

`tags`.`name`
检查的输出确认了这一点(但是,必须将模拟准备设置为
false
,才能看到这一点)

一般说明:

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

您正在错误地转义列名。例如,后面的记号不应包含整个
标记.name
,而应分别包含表名和列名:

`tags`.`name`
检查的输出确认了这一点(但是,必须将模拟准备设置为
false
,才能看到这一点)

一般说明:

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

您的阵列看起来很奇怪。你能展示你的PHP代码在哪里创建这个数组吗?看起来你在使用phpMyAdmin。您是否确认(在phpMyAdmin中)行确实没有受到影响?这将帮助您确定问题是出在您的查询上,还是出在
rowCount()
上。如果您要更新相同的数据,则没有更新HEPPEN,因此行数为0。@低租金我添加了创建数组的方式。@alexw是的,我检查了行,它们没有受到影响。:(您的数组看起来很奇怪。能否显示创建此数组的PHP代码?看起来您使用的是phpMyAdmin。您确认(在phpMyAdmin中)行确实没有受到影响吗?这将帮助您确定问题是与查询有关还是与
rowCount()有关。)
。如果要更新相同的数据,则没有更新HEPPEN,因此行数为0。@low\u rents我添加了创建数组的方法。@alexw Yes我检查了行,它们没有受到影响。:(非常感谢)但是,当我将Simulated prepares设置为false时,我不能将setFetchMode函数用于FETCH_类。为什么我不能?这不是我所知道的限制。我建议您打开另一个问题,概述示例代码的新问题,因为注释部分不是解决此问题的实际位置。非常感谢。:)但是,当我将模拟的prepares设置为false时,我不能为FETCH_类使用setFetchMode函数为什么我不能?这不是我所知道的限制。我建议您打开另一个问题,用示例代码概述您的新问题,因为注释部分不是解决这个问题的实用地方。