0

ここで質問する前に、かなりウェブを閲覧しました。私と同じ問題を抱えている人がいることに気付きましたが、他の人に与えられた回答はどれも私の問題を解決しませんでした....

public 関数内に基本的な PDO Update ステートメントがあります。

 public function editRank($name, $rank){
$query = "UPDATE `chat_mod` SET `chat_mod_rank` = :rank WHERE `chat_mod_ign` = :username";
$prepare = $this->_db->prepare($query);
$array = array(
    ':rank'     => $rank,
    ':username' => $name
);

try {
    $prepare->execute($array);
} catch (PDOException $e){
    echo 'Error: ' . $e->getMessage();
    return false;
}
return true; // If no PDO Exception is thrown..

}

例外はスローされないため、関数は常に true を返します。しかし、行は更新されていません。はい、行の名前が適切であり、値が null でないことを確認しました。

ありがとう、トム。

PS 選択、追加、削除などの他のクエリは正常に機能します。

4

1 に答える 1

2

PDO 例外をキャッチしていますが、PDO にそれらをスローするように指示しましたか?

PDO が例外をスローするようにするには、 PDO errmodeを構成する必要があります。このモードを接続オプションとして設定すると、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エラー自体を処理する場合 (たとえば、トランザクションをロールバックする場合) にのみ使用してください。
于 2013-07-31T13:40:03.543 に答える