Mysqli预处理语句的结果与直接查询不同

时间:2014-07-17 11:56:01

标签: php mysql mysqli

因此,我正在研究一些PHP并使用预处理语句使用mysqli访问我的数据库,以下语句在使用预处理语句时的结果与我的结果不同

  1. 使用HeidiSQL运行查询,手动插入值
  2. 运行查询而不使用预准备语句并手动输入值
  3. 准备好的陈述查询:

    $qStr = "SELECT id, head, descrip, img.dir 
                        FROM CS_P, img,Q_Q_Items 
                        WHERE CS_P.id = Q_Q_Items.I_ID 
                        AND CS_P.id = img.Product_ID 
                        AND img.priority=1 
                        AND CS_P.id NOT IN(
                            SELECT ID2 
                            FROM I_Cols, Q_Q_Items 
                            WHERE ID2 = Q_Q_Items.I_ID 
                            AND Q_Q_Items.Q_ID = ? 
                            AND ID1 IN (".$madeMarks.")
                        ) 
                        AND Q_Q_Items.Q_ID = ?;";
    

    手动输入查询:

    SELECT id, head, descrip, img.dir 
                        FROM CS_P, img,Q_Q_Items 
                        WHERE CS_P.id = Q_Q_Items.I_ID 
                        AND CS_P.id = img.Product_ID 
                        AND img.priority=1 
                        AND CS_P.id NOT IN(
                            SELECT ID2 
                            FROM I_Cols, Q_Q_Items 
                            WHERE ID2 = Q_Q_Items.I_ID 
                            AND Q_Q_Items.Q_ID = 2 
                            AND ID1 IN (35)
                        ) 
                        AND Q_Q_Items.Q_ID = 2;
    

    区别:

    此语句旨在省略ID_Cols.ID1的值与要绑定的值之一匹配的行,而不是$ madeMarks。 $ mademarks只是一串插入字符串的问号,因此我可以插入使用AJAX发布到PHP的数值,并对应用户之前做出的选择。

    当我在SQL服务器上直接运行此查询时,它正确地省略了在准备好的语句中输入的值代替$ madeMarks的行,其中包含准备好的语句,这些行总是包含在内,并且它们不应该是因为这意味着用户先前做出的选择与此选择冲突意味着不应该显示它。

    处理预处理语句的方式是否使得此查询无法按预期执行?

    更多信息:

    我已经回显了这些值,它们是正确的整数,没有字符串或字符,并且在绑定到预准备语句之前所有数据都是正确的,我使用了intval来确保这一点。

    JSON编码绑定到查询的值数组:

    [2,35,2]
    

    绑定类型字符串:

    'iii'
    

    $ madeMarks:

    '?'
    

    我已将这些价值观绑定在声明上。按照数据库的预期进行绑定。

    ID1和ID2是整数。

    /////////////////////////////////////////////// ///////////////////////

    它现在正在运作。

    这不是一个真正的答案,但是是一种解决方法,我只是使用preg_replace用空字符替换任何非数字字符,然后使用for循环构建in语句,将来自choices数组的值插入该声明。 SQL注入没有漏洞,因为它只是数字字符,如果它是我必须比较的字符串,这将容易被注入。

    不要这样做,它是黑客和坏的,只需使用PDO。

0 个答案:

没有答案