php - fatal error : Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error' in

标签 php mysql pdo fetch fetchall

我有这个功能,它不断发出错误“ fatal error :未捕获的异常‘PDOException’,消息为‘SQLSTATE[HY000]:一般错误’在……”错误将我引导到“$row”行= $q2->fetchAll(PDO::FETCH_OBJ);"。我已经搜索了大量的解决方案,但无济于事。我的代码似乎与 php 文档中给出的示例格式相同...

这是根据 TML 的建议更新的函数:

//gets a record by id and sets object properties to it's values
function getById($sid) {
    global $conf, $pdo;
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //checks to see if a record exists for the given id
    try {
        $stmt  = $pdo->prepare('Use ' . $conf['database'] . '; select mem_id as "_id", mem_name as "_name", mem_info as "_info",
                                mem_password as "_password", mem_email as "_email", mem_image as "_image",
                                mem_group as "_group"
                                from ' . $conf['prefix'] . 'members
                                where mem_id = ?;');
        echo"85 <br />";
        $stmt->execute(array($sid));
        echo"86 <br />";
        $rows = $stmt->fetchAll(PDO::FETCH_OBJ);
        echo"90 <br />";
        print_r($rows);
        if (count($rows) !== 1) {
            throw new Exception("Some exception here");
        }
        foreach($rows[0] as $field=>$value) {
            $this->$field = $value;
            echo"97 <br />";
        }
    } catch (PDOException $e) {
        echo"something went wrong! " . var_dump($e);
    }
}

var_dump 输出:

object(PDOException)[4]
  protected 'message' => string 'SQLSTATE[HY000]: General error' (length=30)
  private 'string' (Exception) => string '' (length=0)
  protected 'code' => string 'HY000' (length=5)
  protected 'file' => string 'D:\wamp\www\testing\scripts\Kantan\classes\Member.php' (length=53)
  protected 'line' => int 86
  private 'trace' (Exception) => 
    array (size=2)
      0 => 
        array (size=6)
          'file' => string 'D:\wamp\www\testing\scripts\Kantan\classes\Member.php' (length=53)
          'line' => int 86
          'function' => string 'fetchAll' (length=8)
          'class' => string 'PDOStatement' (length=12)
          'type' => string '->' (length=2)
          'args' => 
            array (size=1)
              ...
      1 => 
        array (size=6)
          'file' => string 'D:\wamp\www\testing\scripts\Kantan\test.php' (length=43)
          'line' => int 5
          'function' => string 'getById' (length=7)
          'class' => string 'Member' (length=6)
          'type' => string '->' (length=2)
          'args' => 
            array (size=1)
              ...
  private 'previous' (Exception) => null
  public 'errorInfo' => 
    array (size=1)
      0 => string 'HY000' (length=5)
  public 'xdebug_message' => string '<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> PDOException: SQLSTATE[HY000]: General error in D:\wamp\www\testing\scripts\Kantan\classes\Member.php on line <i>86</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeee'... (length=1472)

在此先感谢您的帮助。

最佳答案

编写上述代码的一种更好的方法 - 并且可能会解决您的问题 - 可能看起来像这样:

//gets a record by id and sets object properties to it's values
function getById($sid) {
    global $conf, $pdo;
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //checks to see if a record exists for the given id
    try {
        $stmt  = $pdo->prepare('select mem_id as "_id", mem_name as "_name", mem_info as "_info",
                                mem_password as "_password", mem_email as "_email", mem_image as "_image",
                                mem_group aS "_group"
                                from members
                                where mem_id = ?');
        $stmt->execute(array($sid));

        $rows = $stmt->fetchAll(PDO::FETCH_OBJ);
        if (count($rows) !== 1) {
            throw new Exception("Some exception here");
        }
        foreach($rows[0] as $field=>$value) {
            $this->$field = $value;
        }
    } catch (PDOException $e) {
        /* handle errors in useful way, don't just die() */
    }
}

需要注意的一些差异:

  1. 似乎没有任何理智的理由来查询数据库两次。
  2. 您上面的代码忽略了将准备好的语句与 PDO 一起使用的主要好处之一 - 即查询的参数化。
  3. “or die()”会留下糟糕的用户体验——更优雅地处理错误。我在这里的示例中使用了异常处理,但这当然不是唯一的方法;由于您的 setAttribute 调用,我只是默认了它。
  4. 虽然我在这里完整地保留了您的全局变量,但您真的应该考虑不再使用“全局”,因为它通常被认为是非常糟糕的做法。一点 Google 的工作应该会出现许多讨论原因的文章,但 Demeter 法则是一个很好的起点。
  5. 没有理由进行所有这些“USE”调用; PDO 对象已经为您携带了该信息。

Freenode 的##PHP 的成员已经整理了一个 tutorial对于 PDO,您可能希望在进一步取得进展之前检查一下。

关于php - fatal error : Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error' in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14809785/

相关文章:

mysql - 无法通过 SSL 将 Laravel 连接到 MySQL。 'PDO::__construct(): this stream does not support SSL/crypto'

php - 使用 PDO 计算 MySQL 表中的行数

php - 在 Magento 中添加属性以关联可配置产品的产品

php - wordpress 获取当前用户

java - 为什么在 REST API 中为应用程序(android 端)使用身份验证 token 而不是 session_id

php - 搜索结果无法显示分页

php - 在 Mac OS X 服务器上为 MySQL 安装 PDO 扩展

javascript - 无需重新加载页面的 anchor 标记更新 div

c# - 顺序计数器的正确隔离级别

php - 从 Slim Framework 调用 Mysql 函数