如果由于数据库服务器的max_allowed_packet 设置而导致插入“过多数据”失败,则会引发以下警告:
SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than
'max_allowed_packet' bytes
如果此警告被捕获为异常(由于设置的错误处理程序),则数据库连接(可能)丢失,但应用程序不知道这一点(插入失败可能有多种原因)。
下一个查询,可以很简单:
SELECT 1 FROM DUAL
然后会因为这个 SO-question 开始的错误而失败:
Error while sending QUERY packet. PID=18486
重现我的解释的简单测试脚本,尝试使用和不使用错误处理程序以查看影响差异:
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
// error was suppressed with the @-operator
if (0 === error_reporting()) {
return false;
}
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try
{
// $oDb is instance of PDO
var_dump($oDb->query('SELECT 1 FROM DUAL'));
$oStatement = $oDb->prepare('INSERT INTO `test` (`id`, `message`) VALUES (NULL, :message);');
$oStatement->bindParam(':message', $largetext, PDO::PARAM_STR);
var_dump($oStatement->execute());
}
catch(Exception $e)
{
$e->getMessage();
}
var_dump($oDb->query('SELECT 2 FROM DUAL'));