【问题标题】:MySQL query based on user input基于用户输入的 MySQL 查询
【发布时间】:2012-07-30 03:51:30
【问题描述】:

我有一个数据库表。我想做一个文本输入,用户可以在其中输入“uid”,查询将返回与该 uid 关联的行。

假设我有这样的东西:

$query = "SELECT name,age FROM people WHERE uid = '2' LIMIT 0,1";
$result = mysql_query($query);
$res = mysql_fetch_assoc($result);

echo $res["age"];

我如何将该查询修改为..

SELECT name, age 
  FROM people 
 WHERE uid = $_POST['blahblah'] LIMIT 0,1

提前感谢您的帮助!

【问题讨论】:

    标签: php mysql database return row


    【解决方案1】:

    事实上……

    // Read input from $_POST
    $uid = (isset($_POST['uid']) ? $_POST['uid'] : '');
    
    // Build query.  Properly escape input data.
    $query = 
      "SELECT name,age " .
      "FROM people " .
      "WHERE uid = '" . mysql_real_escape_string($uid) . "' " . 
      "LIMIT 0,1";
    

    出于安全原因,建议对变量中的字符进行转义。看看这个文档有几个原因:

    http://en.wikipedia.org/wiki/SQL_injection

    【讨论】:

    • 或者为什么不切换到 PDO + 使用准备好的语句来防止 SQL 注入?
    【解决方案2】:

    要避免 SQL 注入攻击,请使用:

    $search_query = mysql_real_escape_string($_POST['blahblah']);
    
    $query  = "SELECT name, age FROM people WHERE uid = '".$search_query."' LIMIT 0 , 1";
    

    【讨论】:

      【解决方案3】:

      有很多方法可以做到这一点 但首先将其转义并将其存储在一个变量中

      $blahblah = mysql_real_escape_string($_POST['blahblah']);
      

      还有

      首先: 正如@Mett Lo 所说:

      $query = "SELECT name,age FROM people WHERE uid = '" . $blahblah . "' LIMIT 0,1";
      

      第二:

      $query = "SELECT name,age FROM people WHERE uid = '{$blahblah}' LIMIT 0,1";
      

      第三:

      $query = "SELECT name,age FROM people WHERE uid = '$blahblah' LIMIT 0,1";
      

      如果 blahblah 是 db 表中的 int 值,则第四个:

      $query = "SELECT name,age FROM people WHERE uid = $blahblah LIMIT 0,1";
      

      【讨论】:

      • 出于我自己的教育目的,为什么这是-1ed?另外,我的印象是,如果将字符串括在双引号中,则可以插入不带引号的变量。这是真的,还是仅适用于回声?感谢您的建议/回答。
      • @HiggsBoson 谁做了 -1 他们应该添加评论。如果您在 db 表中提到了一些 int ,那么您不需要在该变量周围加上引号。更多的添加引号会影响数据插入速度。但是如果 db 表有 varchar 或 char 列或 date 或 int 以外的其他列,则必须用 ("") 双引号将其括起来
      【解决方案4】:

      您可以使用 sprintf 函数来创建查询。

      $query = sprintf("SELECT name,age FROM people WHERE uid = '%s' LIMIT 0,1",
               $_POST['blahblah'] );
      

      其余的都是一样的。强烈建议您在运行查询之前转义 $_POST 数据以防止 SQL 攻击。您可以将查询改写如下。

      $query = sprintf("SELECT name,age FROM people WHERE uid = '%s' LIMIT 0,1",
               mysql_escape_string($_POST['blahblah']) );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-23
        • 2015-05-19
        • 2011-04-08
        • 1970-01-01
        • 2017-01-16
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多