PHP PDO Mysql:Can';t在同一页中执行两个请求


PHP-PDO-Mysql: Can't execute two requests in the same page

我正在将一个php应用程序移动到一个新的web服务器上。在原始服务器中,以下代码正在工作,但不在新服务器中。

$request=$connexion->prepare("SELECT * FROM access_control ");
$request->execute(); 
$request2=$connexion->prepare("SELECT * FROM tplmail ");
$request2->execute();`

第一个请求总是有效的。我试图反转这两个请求,但脚本总是在第二个execute处停止。在其他脚本中,也有同样的问题,我不能在同一页中执行两个execute

您的问题#1是缺少错误报告。如果没有看到错误消息,您将无法执行任何

为了能够看到数据库错误,必须将PDO错误模式设置为异常。异常在很多方面都比常规错误好:它们总是包含堆栈跟踪,可以使用try捕获。。catch或使用专用错误处理程序进行处理。即使未经处理,它们也会作为常规PHP错误提供所有重要信息,遵循站点范围的错误报告设置。

请注意,将此模式设置为连接选项也会让PDO在连接错误时抛出异常,这一点非常重要
因此,这里有一个正确创建PDO连接的示例:

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    // other options 
);
$pdo = new PDO($dsn, $user, $pass, $opt);

通过这种方式连接,您将始终收到查询执行过程中发生的所有数据库错误的通知。请注意,您必须能够看到PHP的一般错误。在一个实时网站上,你必须查看错误日志,所以,设置必须是

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

在本地开发服务器上,可以在屏幕上出错:

error_reporting(E_ALL);
ini_set('display_errors',1);

当然,您永远不应该在PDO语句前面使用错误抑制运算符(@)。

此外,由于许多不好的例子告诉您要将每个PDO语句封装到try..catch块中,我必须特别注意:

不要使用try。。catch运算符只是为了回显错误消息Uncaught异常在这方面已经很好了,因为它将以与其他PHP错误相同的方式运行-因此,您可以使用站点范围的设置来定义行为-因此,您将获得没有这些无用代码的错误消息虽然无条件回复的错误消息可能会向潜在的攻击者透露一些敏感信息,但会让诚实的访问者感到困惑

  • 稍后可以添加自定义异常处理程序,但不是必需的。特别是对于新用户,建议使用未处理的异常,因为它们信息丰富、有用且安全
  • 只有当您要处理错误本身时,才使用try..catch,例如回滚事务

您的问题#2是一个缓冲状态,它阻止执行第二个查询。

添加

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,

到init数组应该可以解决的问题

或者,您可以在启动第二个之前从第一个查询中获取所有数据