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

PHP-PDO-Mysql:Can';t在同一页中执行两个请求,php,mysql,sql,pdo,request,Php,Mysql,Sql,Pdo,Request,我正在将一个php应用程序移动到一个新的web服务器上。 在源服务器中,以下代码正常工作,但不在新服务器中 $request=$connexion->prepare("SELECT * FROM access_control "); $request->execute(); $request2=$connexion->prepare("SELECT * FROM tplmail "); $request2->execute();` 第一个请求总是有效的。我试图反转这

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

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

$request2=$connexion->prepare("SELECT * FROM tplmail ");
$request2->execute();`
第一个请求总是有效的。我试图反转这两个请求,但脚本总是在第二次执行时停止。在其他脚本中,也存在同样的问题,我不能在同一页中执行两个
执行

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

为了能够看到数据库错误,必须设置为exceptions。异常在许多方面都比常规错误好:它们总是包含堆栈跟踪,可以使用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操作符只是为了回显错误消息。未捕获异常在这方面已经很好了,因为它的作用方式与其他PHP错误相同-因此,您可以使用站点范围的设置来定义行为-因此,您将收到没有此无用代码的错误消息。而无条件回显的错误消息可能会向潜在攻击者透露一些敏感信息,但会使诚实的访问者感到困惑

  • 可以稍后添加,但不是必需的。特别是对于新用户,建议使用未经处理的异常,因为这些异常信息丰富、有用且安全
  • 仅当您要处理错误本身时才使用
    try..catch
    ,例如回滚事务
您的问题#2是一个阻止执行第二个查询的问题

添加

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
到init数组应该可以解决这个问题

或者,您可以在启动第二个查询之前从第一个查询中获取所有数据。您的问题是缺少错误报告。如果没有看到错误消息,您将无法执行任何操作

为了能够看到数据库错误,必须设置为exceptions。异常在许多方面都比常规错误好:它们总是包含堆栈跟踪,可以使用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操作符只是为了回显错误消息。未捕获异常在这方面已经很好了,因为它的作用方式与其他PHP错误相同-因此,您可以使用站点范围的设置来定义行为-因此,您将收到没有此无用代码的错误消息。而无条件回显的错误消息可能会向潜在攻击者透露一些敏感信息,但会使诚实的访问者感到困惑

  • 可以稍后添加,但不是必需的。特别是对于新用户,建议使用未经处理的异常,因为这些异常信息丰富、有用且安全
  • 仅当您要处理错误本身时才使用
    try..catch
    ,例如回滚事务
您的问题#2是一个阻止执行第二个查询的问题

添加

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
到init数组应该可以解决这个问题


或者,在启动第二个查询之前,您可以从第一个查询中获取所有数据。它是否会给您任何错误消息?它是否会给您任何错误消息?谢谢您的帮助。我使用一个“try-catch”来声明我的PDO,但我会更改它。我添加了“PDO::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY=>true”,虽然“false”不起作用,但“true”现在起作用了。谢谢,这是我愚蠢的打字错误,我无意中复制了手动页面上的粘贴命令。现在修好了。谢谢你的帮助。我使用一个“try-catch”来声明我的PDO,但我会更改它。我添加了“PDO::MYSQL\u ATTR\u USE\u BUFFERED\u QUERY=>true”,虽然“false”不起作用,但“true”现在起作用了。谢谢,这是我愚蠢的打字错误,我无意中复制了手动页面上的粘贴命令。现在修好了。