0

重複の可能性:
CodeIgniter で mysqli クエリを実行するにはどうすればよいですか?

php から実行しようとしている mysql クエリがありますが、codeigniter で sql 構文エラーが発生します。同じクエリをコピーして貼り付け、andを正しい値にmysql workbench置き換えて実行すると、正常に動作します。@uid@rangee

クエリは次のとおりです。

$this->db->query("
            SET @uid    = ".mysqli_real_escape_string($conid,$userid).";
            SET @rangee = ".mysqli_real_escape_string($conid,$attempt)." * 50;

            PREPARE STMT FROM 
            '
            UPDATE     
                notificationrecievers 
                SET notificationrecievers.status=1 
                WHERE notificationrecievers.status=0 and notificationrecievers.recieverid=? and 

                notificationrecievers.notificationid <=
                (
                     SELECT MAX(notid) FROM
                     (
                      SELECT n.notid FROM user u,notifications n,notificationrecievers nr WHERE
                      nr.recieverid=? AND u.userid=n.senderid AND nr.notificationid=n.notid ORDER BY n.notid DESC
                      LIMIT 50 OFFSET ?
                     )e
                )   

               AND

                notificationrecievers.notificationid >=
                (
                     SELECT min(notid) FROM
                     (
                      SELECT n.notid FROM user u,notifications n,notificationrecievers nr WHERE
                      nr.recieverid=? AND u.userid=n.senderid AND nr.notificationid=n.notid ORDER BY n.notid DESC
                      LIMIT 50 OFFSET ?
                     )g
                );';
            EXECUTE STMT USING @uid,@uid,@rangee,@uid,@rangee;");

エラーが表示されるのはなぜですか?

4

2 に答える 2

1

まず第一に、query()メソッドは複数のクエリを実行することを意図していません。次に、コードで $userid 変数を介したインジェクションを許可します。

マニュアルで説明されているように、これらの生の準備済みステートメントからバイナリ準備済みステートメントに移行することをお勧めします

于 2012-12-25T19:53:45.890 に答える
0

$this->db がどのようなオブジェクトであるかをコードから判断することはまったく不可能です。エスケープに使用されるのが mysqli の場合、query() 関数は複数のステートメントをサポートしません。

さらに、PHP からプリペアド ステートメントを使用する場合は、次のようにプリペアド ステートメントに PHP ラッパーを使用する必要があります。mysqli::prepare()

于 2012-12-25T19:54:53.617 に答える