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日志文件来查找任何异常。
最后,去掉关闭的?>
,以确保空格不会输出到浏览器(您提到已经清理了这个,但这是您应该遵循的最佳实践)