Php PDO Update语句不工作

Php PDO Update语句不工作,php,pdo,Php,Pdo,在这里提问之前,我已经浏览了很多网页;我注意到有些人和我有同样的问题,但给其他人的答案都不能解决我的问题,所以 我在一个公共函数中有一个基本的PDO Update语句: public function editRank($name, $rank){ $query = "UPDATE `chat_mod` SET `chat_mod_rank` = :rank WHERE `chat_mod_ign` = :username"; $prepare = $this->_db->prep

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

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

 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;但是这些行没有被更新。是的,我已经检查了行的名称是否正确,值是否为空

谢谢, 汤姆


其他查询,如选择、添加和删除,效果良好。

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

要使PDO抛出异常,必须进行配置。请注意,将此模式设置为连接选项也会让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错误相同-因此,您可以使用站点范围的设置来定义行为-因此,您将收到没有此无用代码的错误消息。而无条件回显的错误消息可能会向潜在攻击者透露一些敏感信息,但会使诚实的访问者感到困惑

  • 可以稍后添加,但不是必需的。特别是对于新用户,建议使用未经处理的异常,因为这些异常信息丰富、有用且安全
  • 仅当您要处理错误本身时才使用
    try..catch
    ,例如回滚事务

您确定数据库中存在您的$名称吗?更新查询可以成功,但如果没有行匹配,则更新0行是的,我100%确定,我甚至直接从select复制了用户名,以确保键入的内容没有错误。因此,如果您回显您的查询并在命令行或phpmyadmin上运行它,它会工作吗?这就是问题所在,我正在为一个客户端编写它,我没有直接访问PHPMyAdmin的权限,所以我无法完全调试它。PHPMyAdmin只是一个PHP程序。您确定不能在主机上运行PHP程序吗?