PHP-PDO-Mysql:无法在同一页面中执行两个请求

dev*_*691 1 php mysql sql pdo request

我正在将一个php应用程序移动到一个新的Web服务器上.在原始服务器中,以下代码正在运行,但它不在新服务器中.

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

$request2=$connexion->prepare("SELECT * FROM tplmail ");
$request2->execute();`
Run Code Online (Sandbox Code Playgroud)

第一个请求始终有效.我试图反转这两个请求,但脚本总是停在第二个execute.在其他脚本中,存在同样的问题,我不能execute在同一页面中做两个.

You*_*nse 5

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

为了能够看到数据库错误,必须将PDO errmode设置为异常.异常在许多方面优于常规错误:它们总是包含堆栈跟踪,可以使用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);
Run Code Online (Sandbox Code Playgroud)

通过这种方式连接,您将始终收到查询执行期间发生的所有数据库错误的通知.请注意,您必须能够查看PHP错误.在实际站点上,您必须查看错误日志,因此必须进行设置

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
Run Code Online (Sandbox Code Playgroud)

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

error_reporting(E_ALL);
ini_set('display_errors',1);
Run Code Online (Sandbox Code Playgroud)

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

此外,由于许多不好的例子告诉你将每个PDO语句包装成try..catch块,我必须做一个明确的说明:

请勿使用try..catch运算符来回显错误消息.为此目的,未捕获的异常已经非常出色,因为它的行为与其他PHP错误的行为方式相同 - 因此,您可以使用站点范围的设置来定义行为 - 因此,您将获得没有此无用代码的错误消息. 虽然无条件回复的错误消息可能会向潜在的攻击者泄露一些敏感信息,但却会使诚实的访问者感到困惑.

  • 一个自定义异常处理程序可以在以后添加,但不是必需的.特别是对于新用户,建议使用未处理的异常,因为它们提供的信息非常丰富,有用且安全.
  • try..catch说,回滚事务-只有当你要处理错误本身.

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

添加

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
Run Code Online (Sandbox Code Playgroud)

到init数组应该解决问题

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