我使用带有简单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 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 />";
}
这就是页面上出现的内容:
发生了错误
array (size=3)
0 => string 'HY093' (length=5)
1 => null
2 => null
我意识到由于我打开数据库连接后使用的最后两个setAttribute()函数发生错误。我已经包含了那些,所以如果发生mysql错误,我可以在整个站点的try / catch块上抛出Mysql异常,所以我可以使用该异常数据在用户遇到mysql错误时给自己发错误报告,因为mysql错误没有默认情况下抛出异常。
为什么这些功能会在此页面上导致错误?如何在没有问题的情况下仍然使用它们?