在问这里之前,我已经浏览了很多网页;我注意到有些人和我有同样的问题,但是给别人的答案都没有解决我的问题,所以.......
我在公共函数中有一个基本的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;但行没有更新。是的,我已检查行是否正确命名且值不为空。
谢谢, 汤姆。
P.S其他查询,例如Select,Add&删除工作正常。
答案 0 :(得分: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错误相同 - 所以,你可以使用站点范围的设置来定义行为 - 因此,您将收到错误消息而没有此无用的代码。 虽然无条件回显的错误消息可能会向潜在的攻击者泄露一些敏感信息,但会混淆一个诚实的访客。
- 以后可以添加custom exception handler,但不是必需的。特别是对于新用户,建议使用未处理的异常,因为它们提供的信息非常丰富,有用且安全。
- 仅当您要处理错误本身时才使用
try..catch
- 例如,回滚事务。