您的问题 #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);
以这种方式连接,您将始终收到在查询执行期间发生的所有数据库错误的通知。请注意,您必须能够看到一般的 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数组应该可以解决问题
或者您可以在触发第二个查询之前从第一个查询中获取所有数据