Php 为什么setAttribute()函数会导致无效的参数错误?
我用一个简单的select语句使用mysql查询数据库。我使用PDO准备的语句使用一个命名参数,但是我得到了HY093错误,我使用的参数数量无效,这对我来说没有多大意义,因为我只有一个参数Php 为什么setAttribute()函数会导致无效的参数错误?,php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,我用一个简单的select语句使用mysql查询数据库。我使用PDO准备的语句使用一个命名参数,但是我得到了HY093错误,我使用的参数数量无效,这对我来说没有多大意义,因为我只有一个参数 try { $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=UTF8', DB_USER, DB_PASSWORD); // These variables let mysql errors
try {
$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=UTF8', DB_USER, DB_PASSWORD);
// These variables let mysql errors throw PDO Exceptions. http://stackoverflow.com/a/12872698/83916 and http://www.lornajane.net/posts/2011/handling-sql-errors-in-pdo
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$dbh->setAttribute( \PDO::ATTR_EMULATE_PREPARES, false );
}
catch(PDOException $e) {
die('pdo connection error: ' . $e->getMessage());
}
$hotel_slug = "sh";
$sql = "select count(*) as count from hotel h where h.hotel_slug = :hotel_slug";
$sql_param[':hotel_slug'] = $hotel_slug;
$sth = $dbh->prepare($sql);
if(!$sth->execute($sql_param)){
echo "<h2>An error has occurred</h2><br />";
$error_array = $sth->errorInfo();
var_dump($error_array);
} else {
$result_count = $sth->fetchAll(PDO::FETCH_ASSOC);
$row = current($result_count);
$count = $row['count'];
echo "Count: $count<br />";
}
我意识到发生错误是因为在打开数据库连接后使用的最后两个setAttribute函数。我已经包括了这些,所以如果发生Mysql错误,我可以在整个站点的try/catch块上抛出Mysql异常,所以当用户遇到Mysql错误时,我可以使用该异常数据通过电子邮件向自己发送错误报告,因为默认情况下,Mysql错误不会抛出异常
为什么这些函数会在本页上导致错误,我如何在没有问题的情况下仍然使用它们?h.hotel\u slug=':hotel\u slug'删除引号。它是一个绑定,而不是字符串值。另外,阅读手册我已经做了必要的修正,但我仍然得到错误。不会改变任何东西。摆脱错误模式警告。仅使用ERRMODE\u异常。您的代码看起来应该可以工作,但由于捕获了异常,因此不需要在execute调用周围使用if。只需执行$sth->execute,然后执行fetchAll代码并捕获它引发的任何错误。您需要将以下任一项更改:PDO::ATTR_EMULATE_PREPARES,false为:PDO::ATTR_EMULATE_PREPARES,true。或者:保留当前设置并将::hotel_slug更改为:u?。您与正在使用的“本机mysql驱动程序”存在冲突:
array (size=3)
0 => string 'HY093' (length=5)
1 => null
2 => null