【问题标题】:PHP MySQL insert with $_REQUESTPHP MySQL 插入 $_REQUEST
【发布时间】:2017-12-07 15:02:50
【问题描述】:

我正在尝试将此 $_REQUEST 数据插入到我的 MySQL 数据库中。代码如下:

foreach ($_REQUEST as $value)
{

 $sql = "INSERT INTO beer (b_beer) VALUES ('$value');";

 if(mysqli_query($connection, $sql))
  {
  echo "Records added successfully.";
  } 

   else
   {
   echo "ERROR: Could not able to execute $sql. " . mysqli_error($connection);
   }
}

MySQL 成功插入到我的“啤酒”表中,但也创建了 2 条空记录。发生这种情况有什么原因吗?

【问题讨论】:

  • 是的,foreach 正在这样做。查询应该在它之外。那,和/或你有一个空键。
  • 将您的 foreach 更改为具有 as $key=>$value) 并将键值添加到您的数据库以及 ('$key = $value')。将显示它尝试添加的字段。
  • REQUEST 中有3 个值,您的表单中有3 个inputsname 属性。 PHP 不知道您只想保存其中之一。在这里使用if条件或者忘记foreach循环,真的不需要。
  • 您的代码容易受到SQL injection 攻击。您应该通过mysqliPDO 驱动程序使用带有绑定参数的准备好的语句。 This post 有一些很好的例子。
  • 在将数据插入数据库之前检查 $_REQUEST 数组的组成。使用 print_r($_REQUEST)

标签: php mysql http-post


【解决方案1】:

因为 $_REQUEST 是包含 $_GET、$_POST 和 $_COOKIE 的关联数组,所以它们中的一些可能是空的,但无论如何都存在键。这就是为什么你会得到三个记录。
我会添加一个条件if ($value!='') { ...insert... },但显然你仍然容易受到 $_GET 包含的内容的影响,以防用户在 URL 中添加任何内容。

【讨论】:

    【解决方案2】:

    试一试。你仍然容易受到可能的 SQL 注入的影响,但至少你会修剪你的值,并且只尝试编写那些实际包含某些东西的值,加上 addlashes() 你将帮助确保任何可能破坏 SQL 的字符都被转义.

    foreach ($_REQUEST as $key => $value) {
    
        if(trim($key) == 'beer') {
            if($beerid = trim($value)) {
                $sql = sprintf('INSERT INTO beer (b_beer) VALUES ("%s")',addslashes($beerid));
    
                if(mysqli_query($connection, $sql)){
                    echo "Records added successfully.";
                } else {
                    printf("ERROR: Could not able to execute %s -- %s\n",$sql,mysqli_error($connection));
                }
            }
        }
    }
    

    由于您只处理一个请求,并且您知道该字段的名称为“啤酒”,因此您可以这样简单:

    if(isset($_REQUEST['beer']) {
    
       if($beerid = trim($_REQUEST['beer'])) {
            $sql = sprintf('INSERT INTO beer (b_beer) VALUES ("%s")',addslashes($beerid));
    
            if(mysqli_query($connection, $sql)){
                echo "Records added successfully.";
            } else {
                printf("ERROR: Could not able to execute %s -- %s\n",$sql,mysqli_error($connection));
            }
        }
    }
    

    【讨论】:

    • DDeMartini 谢谢,这行得通,但它会创建两个单独的记录。我尝试使用: print_r($_REQUEST) 并得到: Array ( [beer] => Battery Brown Ale [b_beer] => )
    • 修剪值并同时测试是否为空,这是一种常见的设计模式,如果分配不为 null (false),则 $beeid 包含您可能想要使用的内容。如果该值为空,trim 将返回 FALSE/empty,并且赋值“$beeid =”将通过该值,外部评估“if()”将为 false。久经考验。
    • trim 将返回 FALSE/empty 不正确,trim 将返回 string
    • 如果您知道您只使用 Request 中的一条记录,则测试该密钥。我会修改评论,假设 'beer' 包含你想要的值。
    • @B001 它仍然评估为假,它可以工作,使用它大约 1000000 次并且从未出现过问题。请记住,我们在这里处理的 PHP 类型非常松散……所以……坦率地说,在这种情况下,我觉得区别并不重要……
    猜你喜欢
    • 2012-03-23
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2011-04-17
    • 2023-03-08
    相关资源
    最近更新 更多