0

重複の可能性:
PDOデータベースアクセスWHERE title = $ title

$messageのコンテンツのサンプルを次に示します。

String(108) "\ n cc jet'aienvoy�uneinvitationAplus:p \ n"

エラーメッセージは次のとおりです。

致命的なエラー:101行目のB:\ wamp \ www \ messages.phpの非オブジェクトでメンバー関数setFetchMode()を呼び出す

うまくいかない私のリクエスト:

    $resultats = $connexion->query("SELECT * FROM messages WHERE message LIKE '%$message%'");
    $resultats->setFetchMode(PDO::FETCH_OBJ);
    $occurences= $resultats->rowCount();

なぜこれが機能するのですか?(私は$ messageをaで変更しました):

 $resultats = $connexion->query("SELECT * FROM messages WHERE message LIKE '%a%'");
        $resultats->setFetchMode(PDO::FETCH_OBJ);
        $occurences= $resultats->rowCount();
4

2 に答える 2

1

に使用されたのと同じ手法でPDOを使用するだけでは、何の役mysql_*にも立ちません。パラメータ化されたクエリを利用する必要があります。

$query = $connexion->prepare("SELECT * FROM messages WHERE message LIKE ?");
$query->setFetchMode(PDO::FETCH_OBJ);
if($query->execute(array('%'.$message.'%'))) {
    // process
}
else {
    // only for debugging purposes, not a live app
    var_dump($connexion->errorInfo());
}

メソッドを介して渡すパラメーターに対して、必要なすべてのエスケープを自動的かつ正しく実行しますexecute()


に関してI used addslashes:それは安全ではありません。上記のように準備されたステートメントを使用します。

SQLを生成している場合(ユーザー生成コンテンツで空白を埋めない実際のSQLロジック)を除いて、SQL内でPHP変数を使用する必要はありません。

于 2012-11-08T14:52:11.763 に答える
1

PDO Prepare を使用してみてください。これは mysql_real_escape_string() と「ほぼ」同等です。これにより、特殊文字によるエラーのほとんど (すべてではないにしても) が解消される可能性があります。

于 2012-11-08T14:47:17.817 に答える