3

データベース接続が別のファイル (config.php) にある場合、PDO 準備済みステートメントはリダイレクトを停止します。クエリは正しく機能し (つまり、適切に挿入されるなど)、リダイレクトは、データベース接続が別のファイルではなくドキュメントにある場合は正常に機能しますが、db 接続が別のファイルに移動すると機能しなくなります。エラーメッセージはスローされません。

同様の質問で言及された他の問題 (エラー メッセージと URL パス) を除外するため。また、エラー メッセージを削除し (ドキュメントに何も出力されないようにするため)、相対パスを完全な URL に置き換えてみました。エラー報告がオンの場合、示されているように try/catch ブロックにラップされます。

更新 - 以下のコードは機能しますが、それを置き換える$conn = new PDO...require_once('config.php');リダイレクトされなくなります (エラー メッセージが設定されているかどうかに関係なく)。また、問題を引き起こす可能性のある余分なスペースと、最後の ?> も削除しました。

また、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();
}
4

2 に答える 2

1

最終的に、この問題は UTF-8 でエンコードされたページの既知の問題が原因であることがわかりました。ページ/インクルード ファイルの上部に余分なコード行が作成されることがあります(この問題に関する w3.org の説明へのリンク)。表示されているスペースを削除しても修正されません。私が使用したすべての Web 開発環境 (Visual Web Developer およびその他のいくつか) は、ドキュメントを自動的に UTF-8 で保存するため、これがどこかに設定されていることさえ知りませんでした。

私が見つけた最善の解決策は、テキスト エディターでファイルを BOM なしの UTF-8 として保存することです。Notepad++ または Visual Studio/Visual Web Developer (私が使用する 2 つのテキスト エディター) でこれを行う方法は次のとおりです。

  • Notepad++ - [エンコード] タブの [BOM なしで UTF-8 に変換] オプションをクリックし、ドキュメントを再保存します。
  • Visual Studio/Visual Web Developer Express 2010 -詳細保存オプションを使用して、正しい UTF-8 エンコーディング - Unicode (署名なしの UTF-8) - コードページ 65001 で保存します。 Visual Web Developer Express で詳細保存オプションにアクセスするには、 [名前を付けて保存] を選択し、[保存] ボタンの小さな下向き矢印をクリックして [エンコード付きで保存] をクリックします。

また、php から html ドキュメントにエコーしたときに奇妙な文字が表示されるのを避けるために、HTML ドキュメント内の文字セットを変更する必要がありました。

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

HTML では utf-8 セット、PHP では BOM なしで動作するようですが、HTML でも BOM なしを使用したい場合は、Firefox で動作する 3 つの構文オプションを見つけました: charset=utf-8 BOMなし; charset=UTF-8 no-BOM; charset=BOM なしの UTF-8 エンコーディング(コードをもう少しテストする機会があれば、これを更新します)。

于 2013-01-22T20:20:51.470 に答える
0

関数の前にブラウザーに出力を送信する可能性が高くheader()、リダイレクトが失敗する可能性があります。

スローされる可能性のあるPDO 例外try/catchを適切に処理してログに記録するように、クエリをブロックでラップする必要があります。

問題のデバッグに関しては、ログファイルを使用するかdie("here")、コードをウォークスルーすることが、詳細なしで提供できる最善の方法です。apache/IIS ログ ファイルを調べて、例外を見つける必要がある場合があります。

?>最後に、空白がブラウザーに出力されないように、閉じを取り除きます(これは既にクリーンアップしたと述べましたが、これは従うべきベスト プラクティスです)。

于 2012-12-30T21:03:21.143 に答える