PHP MySql - 更新未更新

时间:2015-04-17 17:15:04

标签: php mysql pdo

我的更新查询有问题。它不显示任何语法错误,但也不会更新数据库。

        // 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();
        }

第一种方法适用于另一种查询和更新,但在这种情况下却没有。我尝试调试,但我找不到任何东西。

有人有点想法,哪里可能有问题? 感谢。

1 个答案:

答案 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);