我的更新查询有问题。它不显示任何语法错误,但也不会更新数据库。
// SQL
$sql = 'UPDATE pizza_info
SET name = :name, price = :price
WHERE id = :id';
try{
$update = $db->prepare($sql);
$update->execute(array(':name' => $this->name, ':price' => $this->price, ':id' => $this->id));
if($update->rowCount() != 1){
throw new PDOException('No row changed');
}
}catch(PDOException $e){
print "Error!: " . $e->getMessage() . "<br/>";
ErrorPages::generalError();
die();
}
但是如果我尝试将相同的值直接放入sql中:
// SQL
$sql = 'UPDATE pizza_info
SET name = "Test", price = "55"
WHERE id = 1';
try{
$update = $db->prepare($sql);
$update->execute();
if($update->rowCount() != 1){
throw new PDOException('No row changed');
}
}catch(PDOException $e){
print "Error!: " . $e->getMessage() . "<br/>";
ErrorPages::generalError();
die();
}
第一种方法适用于另一种查询和更新,但在这种情况下却没有。我尝试调试,但我找不到任何东西。
有人有点想法,哪里可能有问题? 感谢。
答案 0 :(得分:0)
我认为你错过了预备陈述的重点。值不应直接在字符串中,而是与bind_param函数绑定。这种方式即使您使用直接POST注入,查询也将始终是安全的:
$sql = 'UPDATE pizza_info
SET name = :name, price = :price
WHERE id = :id';
$update = $db->prepare($sql);
$update->execute(array(':name'=>'Test',':price'=>55,':id'=>1));
查看有关执行的文档 http://php.net/manual/en/pdostatement.execute.php
我的完整代码供参考:
<?php
$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
// SQL
$sql = 'UPDATE pizza_info
SET name = :name, price = :price
WHERE id = :id';
try{
$update = $db->prepare($sql);
$update->execute(array(':name' => 'Test', ':price' => 55, ':id' => 1));
echo $update->rowCount();
if($update->rowCount() != 1){
throw new PDOException('No row changed');
}
}catch(PDOException $e){
print "Error!: " . $e->getMessage() . "<br/>";
ErrorPages::generalError();
die();
}
使用以下数据库表:
CREATE TABLE `pizza_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`price` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `pizza_info` (`id`, `name`, `price`) VALUES
(1, 'a', 1);