Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么setAttribute()函数会导致无效的参数错误?_Php_Mysql_Pdo_Prepared Statement - Fatal编程技术网

Php 为什么setAttribute()函数会导致无效的参数错误?

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

我用一个简单的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 />";
}
我意识到发生错误是因为在打开数据库连接后使用的最后两个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