【问题标题】:How to Get Error Details From MySQL Stored Procedure如何从 MySQL 存储过程中获取错误详细信息
【发布时间】:2012-12-22 04:59:36
【问题描述】:

我在 PHP 中使用 PDO 调用 mysql 存储过程

try {

    $conn = new PDO("mysql:host=$host_db; dbname=$name_db", $user_db, $pass_db);    
    $stmt = $conn->prepare('CALL sp_user(?,?,@user_id,@product_id)');    
    $stmt->execute(array("user2", "product2"));    
    $stmt->setFetchMode(PDO::FETCH_COLUMN, 0);
    $errors = $stmt->errorInfo();
    if($errors){
        echo $errors[2];
    }else{
        /*Do rest*/
    }

}catch(PDOException $e) {
  echo "Error : ".$e->getMessage();
}

返回以下错误,因为插入查询中的字段名称错误

Unknown column 'name1' in 'field list'

所以我想知道这是否可以获得详细的错误信息,例如:-

Unknown column 'Tablename.name1' in the 'field list';

这可以告诉我哪个表的哪一列是未知的。

【问题讨论】:

  • 你在几个表中有name1 列吗?
  • 实际的列名是 name 但我在存储过程中故意将其更改为 name1 以获取错误。我想在“字段列表”中检索详细的错误信息,例如未知列“Tablename.name1”;而不是“字段列表”中的未知列“name1”;

标签: php mysql stored-procedures pdo


【解决方案1】:

在创建 pdo 连接时,传递错误模式和编码等选项: PDO 系统由 3 个类组成:PDO、PDOStatement 和 PDOException。 PDOException 类是您处理错误所需要的。

这是一个例子:

try
{
    // use the appropriate values …
    $pdo = new PDO($dsn, $login, $password);
    // any occurring errors wil be thrown as PDOException
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $ps = $pdo->prepare("SELECT `name` FROM `fruits` WHERE `type` = ?");
    $ps->bindValue(1, $_GET['type']);
    $ps->execute();
    $ps->setFetchMode(PDO::FETCH_COLUMN, 0);
    $text = "";
    foreach ($ps as $row)
    {
         $text .= $row . "<br>";
    }
    // a function or method would use a return instead
    echo $text;
} catch (Exception $e) {
    // apologise
    echo '<p class="error">Oops, we have encountered a problem, but we will deal with it. Promised.</p>';
    // notify admin
    send_error_mail($e->getMessage());
}
// any code that follows here will be executed

【讨论】:

  • 这无济于事,因为在我的代码中添加该行后,现在我得到错误“错误:SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'name1'”。我也想在错误中获取表名,以便我可以知道哪个表的列是未知的。所以我想获取类似“'字段列表'中的未知列'Tablename.name1';”的错误
【解决方案2】:

我发现这对我很有帮助。 “error_log”打印到 php 错误日志,但你可以用任何你想显示错误的方式替换。

} catch (PDOException $ex){
    error_log("MYSQL_ERROR"); //This reminds me what kind of error this actually is
    error_log($ex->getTraceAsString()); // will show the php file line (and parameter 
                                        // values) so you can figure out which
                                        // query/values caused it
    error_log($ex->getMessage());  // will show the actual MYSQL query error 
                                   // e.g. constraint issue
}

附言我知道这有点晚了,但也许它可以帮助某人。

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2012-06-20
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多