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