【问题标题】:how to use $_GET inside mysqli_query? [duplicate]如何在 mysqli_query 中使用 $_GET? [复制]
【发布时间】:2013-03-16 01:02:48
【问题描述】:

我正在尝试制作几个文本框,并且在提交时会连接另一个 php,假设它是 database.php,然后 database.php 会将文本框中的内容插入 mysql 数据库表中,但我不确定如何我应该进入 mysqli_query 代码....我现在拥有的是

mysqli_query($db,"INSERT INTO jliu VALUE(null,$_GET['title'],$_GET['fname'],$_GET['lname'],$_GET['description'])");

当然 $_GET 将无法正常工作。我真的不知道如何正确获取它。

【问题讨论】:

  • 出于安全原因,切勿在查询中直接使用 $_GET 变量。
  • 从不,从不(!!!)直接将$_GET插入到你的mysql查询中!
  • +1000 表示之前的 cmets。另外:您是否尝试转储$_GET 以查看定义了什么?日志中有错误吗?
  • 我推荐这篇文章:Getting Clean With PHP。如果你正在使用一些 PHP 框架,很可能它有输入清理方法
  • ohoh...我知道,因为 $_GET 是最难使用的,但我刚刚开始学习 php,这只是我正在看这本书的一些工作,它要求我这样做呀呵呵....谢谢提醒^_^

标签: php mysql forms mysqli insert


【解决方案1】:

您需要拆分字符串以便将其与$_GET 变量连接起来。

mysqli_query($db,"INSERT INTO jliu VALUES(null,".$_GET['title'].",".$_GET['fname'].",".$_GET['lname'].",".$_GET['description'].")");

但实际上,您应该查看 prepared statements 以避免上面的 SQL 注入安全漏洞。

使用准备好的语句,您可以将 $_GET 变量绑定到查询中的参数。

$stmt = mysqli_prepare($db,"INSERT INTO jliu VALUES(null, ?, ?, ?, ?");

mysqli_stmt_bind_param($stmt, "s", $_GET['title']); 
...
// and the same for the others

链接的手册页中有更多关于如何执行准备好的语句并返回结果的详细信息。

【讨论】:

  • 啊~我真是太傻了……我做了你在这里所做的,但后来我不知何故我的头没有旋转……最后一个)是什么让我想到了什么我应该把右括号和天哪,我可以用“)”然后你....让我试试看...天哪....我问的另一个愚蠢的问题
  • 不是这样......如果它引导你使用准备好的语句,那么你问它是一件好事;-)
  • 感谢准备好的陈述。我有点看 php 手册,但我想我对 php 不太好,但他们的例子让我的大脑旋转,但你的似乎很容易理解,我会在我开始尝试之后尝试一下 ^_^
【解决方案2】:

请不要使用 mysql_query() 和 consorts,它们是 way too unsafe。请查看PDO 并改用它。具体来说 PDO::prepare() 和 PDOStatement::execute() 将是您的解决方案。

【讨论】:

    【解决方案3】:

    您的实际问题,将数组的索引值插入字符串可以通过两种方式解决(如果算上heredoc、sprintf 和诸如此类,则更多):

    使用花括号:

    "INSERT INTO jliu VALUE(null, {$_GET['title']}, {$_GET['fname']}, {$_GET['lname']}, {$_GET['description']})"
    

    使用串联:

    "INSERT INTO jliu VALUE(null, " . $_GET['title'] . ", " . $_GET['fname'] . ", " . $_GET['lname'] . ", " . $_GET['description'] . ")"
    

    但是,最重要的问题是您不应该这样做。使用您的代码,您很容易受到 SQL 注入漏洞的影响。

    使用prepared statements,并在其中插入您的值。这会创建一个更安全(并且性能略高)的查询,因为您只是绑定 ,而不是更改实际查询本身。代码示例:

    if ($stmt = $mysqli->prepare("INSERT INTO jliu VALUES (NULL, ?, ?, ?, ?)")) {
        $stmt->bind_param("ssss", $_GET['title'], $_GET['fname'], $_GET['lname'], $_GET['description']);
    
        $stmt->execute();
    }
    

    【讨论】:

      【解决方案4】:

      您必须使用准备好的语句并将变量替换为占位符。

      http://php.net/manual/de/mysqli.prepare.php

      【讨论】:

        【解决方案5】:

        回答你的问题:

        您可以执行以下操作。其实就是把数组item的一个变量放到一个字符串中,不仅仅是$_GET。任何数组都可以这样访问:

        $str = "some text {$_GET['title']}"
        

        或在处理对象时采用类似方法:

        $str = "some text {$obj->test}"
        

        但是,当您使用 sql 查询时,这是个坏主意。您应该使用一些函数来清除您的输入,以防止 sql 注入。

        最直接的方式是使用mysqli_real_escape_string

        $str = "some text " . mysqli_real_escape_string($_GET['title'])." ...";
        

        或者你可以使用更灵活的prepared statements

        【讨论】:

          【解决方案6】:

          试试这个..

              $title = mysqli_real_escape_string($_GET['title']);
              $fname = mysqli_real_escape_string($_GET['fname']);
              $lname = mysqli_real_escape_string($_GET['lname']);
              $description = mysqli_real_escape_string($_GET['description']);
              $stmt = mysqli_prepare($db,"INSERT INTO jliu VALUES(null,'".$title."','".$fname."','".$lname."','".$description."'");
              mysqli_stmt_execute($stmt);
          

          【讨论】:

            【解决方案7】:

            应该是这样的。

            $query = sprintf("INSERT INTO jliu VALUE(null,%s,%s,%s,%s)",$_GET['title'],$_GET['fname'],$_GET['lname'],$_GET['description']);
            mysqli_query($db,$query);
            

            【讨论】:

              猜你喜欢
              • 2015-12-22
              • 2015-03-25
              • 1970-01-01
              • 2018-06-30
              • 2018-12-17
              • 2015-03-31
              • 2013-04-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多