代码之家  ›  专栏  ›  技术社区  ›  Julian H. Lam

我应该如何在mysql_查询函数中编写php$_post vars?

  •  3
  • Julian H. Lam  · 技术社区  · 16 年前

    在访问我的数据库时,我让用户填写一个表单,在目标页面中,发布的值将用于生成的MySQL查询。

    $query = mysql_query("SELECT pass FROM database WHERE user='$_POST[user]'");
    

    但是,出于某种原因,MySQL不喜欢我在命令中使用一个$\u post变量,它只在我定义(例如)时才起作用。 $user = $_POST['user']; ,然后将$user直接放入SQL命令中。

    另一方面,我可以在不需要特定列名的insert语句中使用$_post值:

    $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', '$_POST[user]'");
    

    如果我尝试在定义了属性(例如 user='foo' ,然后出现相同的问题。

    我在SQL查询中做了什么错误,导致命令在运行时出错,但使用了格式化插入命令的特定方法?

    希望这不是“运气不好,看起来你必须分配你所有的发布值”。呵呵。

    5 回复  |  直到 16 年前
        1
  •  9
  •   Community Mohan Dere    8 年前

    首先, watch out for SQL Injections !

    现在,要回答您的问题,请尝试执行以下操作:

    $query = mysql_query("SELECT `pass` FROM `database` WHERE `user` LIKE '" . mysql_escape_string($_POST['user']) . "';");
    

    你做错了两件事:

    • 使用 = 运算符而不是 LIKE 操作人员
    • 不使用 '
    • 不将用户索引封闭在 $_POST 数组与

    附:你应该用 mysql_real_escape_string() 而不是 mysql_escape_string() !

        2
  •  3
  •   JAL    16 年前

    您只需在字符串中插入一个变量,所以您将它放入哪个命令并不重要。

    有几个问题需要指出。

    第一,您可能希望对数组变量使用格式。在此格式中,不在arrray密钥名周围使用引号。

    $query = mysql_query("SELECT pass FROM database WHERE user='{$_POST[user]}'")
    

    两个, 你永远不想做这样的查询 因为您可以使用SQL注入孔。考虑一下,如果$_post['user']是“cow”;drop table database;--”呢?

    您必须在将后输入放入查询之前运行mysql_real_escape_字符串,或者使用 PHP PDO 带着准备好的陈述。

    设置字符串格式的一种方法是使用sprintf,它提供了一点结构。

    $query=mysql_query(sprintf("SELECT pass FROM database WHERE user='%s'",mysql_real_escape_string($_POST['user'])));
    
        3
  •  2
  •   Crozin    16 年前
    1. 使用 PDO -它提供了更好的API来与数据库通信。
    2. 如果你在用 mysql_*() 函数总是记住 滤波器 ( mysql_real_escape_string() )来自不受信任源的任何数据(如用户)
    3. 注意代码的外观。只需比较以下列表:

      $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ", " . mysql_real_escape_string($_POST['user']) . ")");
      
      $query = sprinf('INSERT INTO database VALUES ("foo", "bar", "%s", "%s", "%s")',
      mysql_real_escape(...), ...);
      

      我需要解释哪一个更适合阅读、修改或理解吗?

        4
  •  1
  •   Marc B    16 年前

    为什么不检查并查看mysql_error()对此有何评论?如果查询无效,mysql_error()将返回一个很好的文本块,告诉您到底出了什么问题。

    至于MySQL不喜欢post var,如果您直接为某些运行而不是其他运行插入它,那么您应该确保为每个测试使用一致的数据和设置。如果使用get完成了一些测试,那么您的post vars将为空。如果您对每个测试使用不同的用户名,那么看看失败的用户名之间是否一致。

    如前所述,阅读有关SQL注入的内容以及您的查询是如何被恶意用户破坏的。

        5
  •  0
  •   jtm    16 年前

    尝试

    $query = mysql_query("SELECT pass FROM database WHERE user=" . mysql_real_escape_string($_POST['user']));
    

    $query = mysql_query("INSERT INTO database VALUES ('foo', 'bar', " . mysql_real_escape_string($_POST['user']) . ")");
    

    清理通过$GET或$U POST收到的任何内容始终是个好主意。