如果db连接在配置文件中,PDO prepared语句将停止重定向


PDO prepared statement stops redirecting if db connection is in config file

PDO准备语句在数据库连接位于单独的文件(config.php)中时停止重定向。查询工作正确(即插入正确等),和重定向工作只是很好,当数据库连接是在文档中,而不是在一个单独的文件,但它停止工作时,db连接被移动到另一个文件。它不会抛出任何错误消息。

为了排除类似问题中提到的其他问题(错误消息和URL路径)。我还删除了错误消息(因此它绝对不会向文档打印任何内容),并尝试用完整的URL替换相对路径。当错误报告打开时,它被包装在一个try/catch块中,如图所示。

更新——下面的代码可以工作,但是如果我用require_once('config.php');替换$conn = new PDO...,它不再重定向(无论是否设置错误消息)。我还删除了任何可能引起问题的额外空格,以及关闭?>。

我也试过在catch语句之前和之后都重定向(以及删除try/catch块)

<?php
session_start();  
$conn = new PDO('mysql:host=localhost;dbname=click2fit', 'db_username', 'DB_Password');
try {
      $stmt = $conn->prepare('INSERT INTO customer_info (user_id, fname, lname) 
        VALUES(:user_id, :fname, :lname)');
        $stmt->bindParam(':user_id', $user_id);   
        $stmt->bindParam(':fname', $_POST['fname'], PDO::PARAM_STR);   
        $stmt->bindParam(':lname', $_POST['lname'], PDO::PARAM_STR);
       $stmt->execute(); 
      header("location: page2.html");         
      exit();
 } catch(PDOException $e) {
  echo 'Error: ' . $e->getMessage();
}

config . php:

<?php 
  $conn = new PDO('mysql:host=localhost;dbname=click2fit', 'db_username', 'DB_Password');
?>

config.php打开错误报告:

<?php
  $salt = "XXXXXXXXXXXXXXXXXXX";
  try {
   $conn = new PDO('mysql:host=localhost;dbname=click2fit', 'db_username', 'DB_Password');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}

我最终发现这个问题是由UTF-8编码页面的一个已知问题引起的,有时在页面/包含的文件的顶部创建额外的代码行(链接到w3.org对这个问题的解释),并且由于这些不可见,删除任何可见的空格并不能纠正它。我甚至不知道这个设置在任何地方,因为我使用的所有web开发环境(Visual web Developer和其他几个)都会自动以UTF-8格式保存文档。

我发现的最佳解决方案是将文件保存在文本编辑器中为没有BOM的UTF-8。在notepad++或Visual Studio/Visual Web Developer(我使用的两种文本编辑器)中做到这一点的方法是:

  • notepad++ -点击"Encoding"选项卡下的"Convert to UTF-8 without BOM"选项,然后重新保存文档。
  • Visual Studio/Visual Web Developer Express 2010 -使用高级保存选项保存正确的UTF-8编码- Unicode(不带签名的UTF-8) - Codepage 65001。要访问Visual Web Developer Express中的高级保存选项,请选择"另存为",然后单击"保存"按钮上的小向下箭头以"以编码保存"。

我还必须更改HTML文档中的字符集,以避免在从php回显到HTML文档时得到奇怪的字符。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

它似乎与html中的utf-8设置和PHP中的No BOM一起工作,但如果你也想在html中使用No BOM,我发现3个在Firefox中工作的语法选项:charset=utf-8 without BOM;charset = utf - 8 no-BOM;charset=没有BOM的UTF-8编码(一旦我有机会对代码进行更多的测试,我会更新这一点)。

header()函数之前将输出发送到浏览器的可能性很大,这会导致重定向失败。

你应该在try/catch块中包装你的查询,以确保你正确处理和记录任何可能被抛出的PDO异常。

至于调试问题,使用您的日志文件和/或die("here")并遍历代码是我所能提供的最好的方法,没有更多的细节。您可能需要查看您的apache/IIS日志文件来查找任何异常。

最后,去掉关闭的?>,以确保空格不会输出到浏览器(您提到已经清理了这个,但这是您应该遵循的最佳实践)