尝试在PHP5 PDO中捕获

时间:2016-09-15 14:41:57

标签: pdo try-catch php-5.5

这是我在PHP上的第三天。我有以下代码来选择数据 -

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try
{
   $sql = "SELECT LoginName FROM users WHERE LoginName = :LoginName";
   $statement = $db->prepare($sql); //intentionally used $db here 
   $statement->bindParam(':LoginName', $LoginName, PDO::PARAM_STR, 50);
   $statement->execute();
   $count= $statement->rowCount();
}
catch(PDOException $e)
{
   header('Content-Type: application/json');
   echo json_encode(array('result'=>'Error','data'=> $e->getMessage()));    
}

我故意使用$db代替$conn。所以应该有例外。但是在我的ajax通话中,$e->getMessage()尚未从catch阻止发送。

任何帮助?

1 个答案:

答案 0 :(得分:1)

以下是必须如何完成

首先,设置此处理程序可以处理脚本中可能出现的所有错误,无论是PDO还是其他任何错误。

set_error_handler("myErrorHandler");
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    error_log("$errstr in $errfile:$errline");
    header('HTTP/1.1 500 Internal Server Error', TRUE, 500);
    header('Content-Type: application/json');
    echo json_encode(array('result'=>'Error', 'data'=>'Server error'));   
    exit;
}

然后以这种方式制作您的PDO代码

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "SELECT 1 FROM users WHERE LoginName = ?";
$statement = $db->prepare($sql); //intentionally used $db here 
$statement->execute([$LoginName]);
$found = $statement->fetchColumn();

实质上,您应遵循以下规则:

  • 从不使用try catch运算符报告错误
  • 永远不会向局外人透露真正的错误。只是一个通用的消息