【问题标题】:Set variable from SELECT PHP从 SELECT PHP 设置变量
【发布时间】:2011-02-08 08:32:08
【问题描述】:

我只想将变量“$read”定义为它在数据库中的任何值。我该怎么做?

$read =  "SELECT `read` FROM `users` WHERE `id` = '$id'";

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    $read = mysql_result(mysql_query("SELECT read FROM users WHERE id = $id"),0);
    

    【讨论】:

    • @Mike 实际上是最丑的一个
    • 别装傻,丹。你自己知道所有的原因。你永远不会在自己的代码中使用它,这就够了。
    • 我已经这样做了,实际上,在编写一次性脚本时知道存在这种速记很有用。
    • 我已经 -1'ed 你的答案,因为我发现在没有警告潜在 SQL 注入的情况下呈现此代码是不负责任的;特别是对于您可以合理假设不知道此类问题的人。当然,您可以假设$id 是安全的,但请明确地这样做。或者更好的是,不要。
    • 我没有对其他答案发表相同的评论,因为我在自己的答案中留下了一般评论。我特别评论你的另一个原因是,你在 PHP 和 MySQL 中享有很高的声誉,所以你的回答更有可能被路人重视。不,我不知道$id 是用户输入,但是您认为可以安全地假设执行简单 SQL 查询有困难的人在没有明确说明的情况下正确清理了他们的输入吗?
    【解决方案2】:

    注意使用mysql_query 给出的答案,因为它们容易受到SQL injection 的攻击。

    如果$id 由用户提供,则切勿将其直接放入 SQL 查询中,而应使用预准备语句。

    这样做的一种方法是使用PDO,方式类似于:

    $dbh = new PDO($connStr, $user, $pass);
    $sql = "SELECT `read` FROM `users` WHERE `id` = :id";
    $statement = $dbh->prepare($sql);
    $statement->execute( array('id' => $id) );
    $read = $statement->fetchColumn();
    

    有关如何使用 PDO 的更多信息,请参阅以下内容:

    【讨论】:

    • 或者,您也可以使用mysqli,它比旧的mysql 函数更受欢迎。
    • 事实上,mysql 并不比 PDO 或 mysqli 更容易受到攻击
    • @Col:本身并不不安全,不,但是通过使用mysql 函数,您必须手动确保所有输入都经过适当的清理。通过使用准备好的查询,您不必担心对输入进行清理,这通常会使您的脚本安全,假设您正确使用它们。
    • @Col:SQL 注入是由数据库系统理解数据即代码的含义引起的。通过将数据绑定到参数,您直接告诉数据库系统某事是数据,因此如果正确使用准备好的查询,则不会发生 SQL 注入。另见this question
    • @Col。 Shrapnel:您需要多久将直接用户输入作为排序参数或其他元数据传递一次?除非您正在编写数据库设计/管理工具,否则这不太可能出现。没有人说过准备好的语句可以 100% 防止 SQL 注入,但它确实可以防止 99% 的 SQL 注入漏洞。认为我们都遭受 SQL 注入只是因为我们更喜欢准备好的语句,这也是非常冒昧的。我们明白了,你已经阅读了 SQL 反模式,所以你比我们所有人都聪明。
    【解决方案3】:

    实现此目的的一种方法如下:

    // Run the query
    $db_result = mysql_query("SELECT read FROM users WHERE id = $id");
    // Get the first row (in this case you'll only get one row)
    $row = mysql_fetch_array($db_result, MYSQL_NUM);
    // Get the first column (you should only have one column anyway) and put it into your variable
    $read = $row[0];
    

    如下所述,我应该补充一点,如果您不相信 $id 会被正确转义,您可能会受到SQL injection 的攻击。为了克服这个问题,您应该确保正确地转义并验证 $id 或使用某种绑定或准备好的语句来为您完成此操作,例如在this question 或下面的示例中。

    【讨论】:

      【解决方案4】:

      我知道教别人一些东西几乎是不可能的,尤其是当他们不想学习的时候。但希望它对其他人有用

      所有现代编程语言都支持这种称为“用户定义函数”的东西。
      一个非常方便的功能。

      想要让代码真正整洁的程序员可以从一些重复的代码中创建一个函数,并使调用该代码的过程变得非常小,就像在 OP 中所说的那样:

      $read = dbgetvar("SELECT `read` FROM `users` WHERE `id` = %d",$id);
      

      这种方法的另一个好处 - 您的代码可以包含所有必要的东西,例如参数清理和错误处理。而且仍然调用这个代码会比上面所有的代码都短,为了追求简短而变得丑陋和难以维护。

      这种函数的一个例子

      function dbgetvar(){
        $args = func_get_args();
        $query = array_shift($args); 
        $query = str_replace("%s","'%s'",$query); 
        foreach ($args as $key => $val) { 
          $args[$key] = mysql_real_escape_string($val); 
        } 
        $query = vsprintf($query, $args);
      
        $res = mysql_query($query);
        if (!$res) {
          trigger_error("dbget: ".mysql_error()." in ".$query);
          return FALSE;
        }
        $row = mysql_fetch_row($res)
        if (!$row) return NULL;
        return $row[0];
      }
      

      【讨论】:

        【解决方案5】:

        我会做以下事情:

        // leave the single quotes around $id because it most probably is an INT
        // LIMIT 1 will make the query a bit faster
        $result = mysql_query("SELECT `read` FROM `users` WHERE `id` = $id LIMIT 1");
        
        $row = mysql_fetch_row($result);
        $read = $row[0];
        

        希望它对你有用。

        【讨论】:

          【解决方案6】:

          假设只有 1 个结果:

          $read = mysql_fetch_array(mysql_query("SELECT read FROM users WHERE id = $id"));
          $read = $read[0];
          

          【讨论】:

          • 记住转义特殊字符。
          猜你喜欢
          • 2013-01-26
          • 2017-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-12
          相关资源
          最近更新 更多