sql >> データベース >  >> RDS >> Mysql

無効なパラメーター番号:パラメーターがバインドされていません

    プリペアドステートメントのパラダイムに従って、bind_paramを使用していません。

    選択した場合:

    $sql = "SELECT id,msg,time,msg.from,msg.to 
            FROM msg 
            WHERE msg.from IN (?, ?) 
                AND msg.to IN (?, ?)
            ORDER BY time";
    
    $ex = $conn->prepare($sql);
    $ex->bind_param("s", $_SESSION["username"]);
    $ex->bind_param("s", $_SESSION["tousermessage"]);
    $ex->bind_param("s", $_SESSION["username"]);
    $ex->bind_param("s", $_SESSION["tousermessage"]);
    $ex->execute();
    

    そしてあなたのアップデートで:

    $sql = "UPDATE msg 
            SET readmsg=1 
            WHERE id = ? 
                AND msg = ?";
    
    $ex1 = $conn->prepare($sql);
    $ex1->bind_param("i", $result['id']);
    $ex1->bind_param("s", $result["msg"]);
    $ex1->execute();
    

    上記により、プリペアドステートメントはパラメーター化された文字列形式のパラメーターを受け入れ(パラメーターを表すために「?」を使用)、bind_param()メソッドを介してタイプ情報を含むパラメーターを受け入れることができます。

    これにより、DBエンジンは、クエリを実行する前にパラメータを適切にキャストおよびエスケープできます。

    パラメータをバインドしていない場合は、プリペアドステートメントを使用しても意味がありません。これが、おそらくその警告が表示される理由です。

    ちなみに、クエリの連結は(上記で行っているように)非常に悪い習慣です。これにより、SQLインジェクション

    プリペアドステートメントの詳細については、ドキュメントを参照してください:

    http://php.net/manual/en/mysqli-stmt.prepare .php




    1. Oracleデータ型:VARCHAR2またはCHARを使用する必要があります

    2. php読み取りmysqlビットフィールドが奇妙な文字を返す

    3. SELECTステートメントで変数を設定します-MySQL

    4. MySQLでの大文字と小文字を区別する照合