【问题标题】:What's wrong in this simple PHP SQL sentence?这个简单的 PHP SQL 语句有什么问题?
【发布时间】:2010-12-12 20:21:52
【问题描述】:

我想重新识别全名中带有“blo”的所有用户,例如:“Pablo”

我用user PHP 参数传递“blo”参数:

$q=mysql_query("select * From user Where fullName Like '%'".$_REQUEST['user']."'%'",$link );

php SQL 语句有问题,因为当我在我的 SQL 数据库上尝试带有参数“blo”的语句时,我看到 SQL 语句是正确的,因为它返回了正确的结果,这是带有关于它的论点“blo”:select * From user Where fullName Like "%blo%"

我确定PHP正确接收了“blo”参数,那么,它必须是PHP上SQL语句的sintax错误......但我找不到它

编辑:好的!最后一句解决了,但是现在我有了这个新句子,同样的问题,它有一个错误但我不知道在哪里

$query = sprintf("SELECT u.* 
                    FROM USER u
                   WHERE u.fullName LIKE '%%%s%%' AND email NOT IN (select pp.fk_email2 from permission pp where pp.fk_email1='".mysql_escape($_REQUEST['mymail'])."') AND email NOT LIKE  '".mysql_escape($_REQUEST['mymail'])."' ",
                  mysql_real_escape_string($_REQUEST['user']));

【问题讨论】:

    标签: php sql mysql mysql-error-1064


    【解决方案1】:

    SQL 需要单引号来指示要比较的字符串,并且通配符 (%) 必须包含在这些单引号内。双引号仅用于列和表的别名(如果有的话)。

    $query = sprintf("SELECT u.* 
                        FROM USER u
                       WHERE u.fullName LIKE '%%%s%%'",
                      mysql_real_escape_string($_REQUEST['user']));
    
    $q = mysql_query($query, $link);
    

    其次,你要离开自己open to a SQL injection attack by not sanitizing the user request variable。在处理提交到 MySQL 数据库的字符串时,请始终使用 mysql_real_escape_string。

    【讨论】:

    • 由于 sprintf,您还需要转义 %,所以 %%%s%%
    • @Brian:已更正,谢谢。我不确定,没有 PHP 方便测试。
    • 双引号通常可用于指定字符串。只有启用 ANSI 模式时,它们才会被解释为表名。
    • @AndroidUser99:“它不起作用”并没有告诉我们任何有用的信息 - 你有错误吗?如果是这样,它是什么?事实是,我发布的 有效代码,所以问题在于你以某种方式改变它......
    • 你确定我必须写 %%%s%% 而不是 %%s%% ???为什么第一种情况为 3%,第二种情况为 2%?
    【解决方案2】:

    你把引号弄乱了。使用这个:

    $q=mysql_query('SELECT * 
                    FROM user
                    WHERE fullName LIKE "%' . $_REQUEST['user'] . '%"',$link );
    

    顺便说一句,这是不好的做法。您在查询中使用了未转义的输入,并且对 SQL 注入持开放态度。

    【讨论】:

    • 所以,在你的答案中添加一个转义函数,而不是在上面写空的 blab。
    • @Col-shrapnel 如果我打开 PHP 文档,我会这样做。因为我现在不记得,也不记得函数名称,所以我把它作为练习留给提问者/其他回答者
    • @AndroidUser99:“它不起作用”并没有告诉我们任何有用的信息 - 你有错误吗?如果有,是什么?
    • 没有错误,就是什么都不返回,JSON错误,说明PHP SQL语句有问题
    • @AndroidUser99:停止使用 JSON,并通过将输出打印到屏幕进行调试。当这可行时,然后继续查看 JSON...
    【解决方案3】:

    您的报价似乎已关闭..尝试类似...

    $q=mysql_query("select * From user Where fullName Like '%".$_REQUEST['user']."%'",$link);
    

    此外,您还需要确保传入的参数是 sql 转义的,以防止 sql 注入。我不知道php,但它可能类似于...

    $q=mysql_query("select * From user Where fullName Like '%".mysql_escape($_REQUEST['user'])."%'",$link);
    

    【讨论】:

      【解决方案4】:

      我想它一定是... where fullname like '%" . $_REQUEST['user']."%'"... 在单引号内使用 % 符号。

      【讨论】:

        【解决方案5】:

        @AndroidUser99:将查询改为--

        $q = mysql_query("select * from user Where fullName like '%" . $_REQUEST['user'] . "%'", $link);
        

        更新

        我认为我们可能需要更多代码,因为没有一个答案似乎“有效”。数据库链接是否在$link 中实例化?如果有错误是什么?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-28
          • 2014-05-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-06
          • 1970-01-01
          相关资源
          最近更新 更多