0

在问这里之前,我已经浏览了很多网页;我注意到有些人和我有同样的问题,但是给其他人的答案都没有解决我的问题,所以....

我在公共函数中有一个基本的 PDO 更新语句:

 public function editRank($name, $rank){
$query = "UPDATE `chat_mod` SET `chat_mod_rank` = :rank WHERE `chat_mod_ign` = :username";
$prepare = $this->_db->prepare($query);
$array = array(
    ':rank'     => $rank,
    ':username' => $name
);

try {
    $prepare->execute($array);
} catch (PDOException $e){
    echo 'Error: ' . $e->getMessage();
    return false;
}
return true; // If no PDO Exception is thrown..

}

不抛出异常,所以函数总是返回true;但行没有被更新。是的,我检查了行的名称是否正确,并且值不是空值。

谢谢,汤姆。

PS 其他查询,如选择、添加和删除工作正常。

4

1 回答 1

2

您正在捕获 PDO 异常,但您是否告诉 PDO 抛出它们?

要使 PDO 抛出异常,您必须配置PDO errmode。请注意,将此模式设置为连接选项将使 PDO 在连接错误时也抛出异常,这非常重要。
因此,这是一个正确创建 PDO 连接的示例:

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    // other options 
);
$pdo = new PDO($dsn, $user, $pass, $opt);

以这种方式连接,您将始终收到在查询执行期间发生的所有数据库错误的通知。请注意,您必须能够看到一般的 PHP 错误。在实时站点上,您必须查看错误日志,因此,设置必须是

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

在本地开发服务器上,可以在屏幕上出错:

error_reporting(E_ALL);
ini_set('display_errors',1);

当然,您永远不应该@在 PDO 语句前使用错误抑制运算符 ( )。

另外,由于许多不好的例子告诉你将每个 PDO 语句包装成try..catch块,我必须做一个明确的说明:

不要使用 try..catch 运算符来回显错误消息。未捕获的异常已经非常适合此目的,因为它的行为方式与其他 PHP 错误相同 - 因此,您可以使用站点范围的设置来定义行为 - 因此,您将获得没有这些无用代码的错误消息。 虽然无条件回显的错误消息可能会向潜在的攻击者透露一些敏感信息,但会使诚实的访问者感到困惑。

于 2013-07-31T13:40:03.543 回答