【问题标题】:Insert into MySQL Table PHP插入 MySQL 表 PHP
【发布时间】:2013-06-16 23:07:55
【问题描述】:

我在制作一个简单的表单以将数据插入 MySQL 表时遇到了一些麻烦。我不断收到此 SQL 错误:

"错误:您的 SQL 语法有错误;请查看手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行的 'stock ('ItemNumber', 'Stock') VALUES ('#4','3'')' 附近"

我的表单 HTML 是:

    <form action="database.php" method="post">
    Item Number: <input type="text" name="ItemNumber">
    Stock: <input type="text" name="Stock">
    <input type="submit">
    </form>

PHP 是:

    <?php
    $con=mysqli_connect("localhost","root","root","inventory");
    if (mysqli_connect_errno($con))
      {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
      }
     $sql = "INSERT INTO current stock ('ItemNumber', 'Stock')
    VALUES
    ('$_POST[ItemNumber]','$_POST[Stock]'')";
    if (!mysqli_query($con,$sql))
      {
      die('Error: ' . mysqli_error($con));
      }
    echo "1 record added";
    mysqli_close($con);
    ?>

【问题讨论】:

  • 您的网页对 SQL 注入开放。不要这样编码。而是使用存储过程、参数化 SQL 命令并禁止用户输入特殊字符...
  • 我也会避免在表格或字段名称中使用空格字符。
  • 我知道这是一个老问题,但 Bill Karwin 在这里给出了最好的答案。其他答案是不安全的。

标签: php mysql sql syntax-error sql-insert


【解决方案1】:

试试这个

您不应该在 POST 周围使用参数引号。你应该在 POST 中使用它们

       $sql = "INSERT INTO `current stock` (ItemNumber, Stock)
           VALUES
         ('".$_POST['ItemNumber']."', '".$_POST['Stock']."' )";

你应该在像这样将它们插入到 mysql 之前转义你的变量

  • 请注意,该示例不调用mysqli_real_escape_string。如果您将字符串直接嵌入到查询中,您只需要使用mysqli_real_escape_string,但我建议您永远不要这样做。尽可能使用参数。

【讨论】:

  • 请不要给出SQL注入的坏例子,尤其是对于语法仍然有问题的初学者......
【解决方案2】:

你有一个额外的引号,你需要在你的表名周围打勾,因为它包含一个空格。

INSERT INTO current stock ('ItemNumber', 'Stock')
VALUES
('$_POST[ItemNumber]','$_POST[Stock]'')";

应该是:

INSERT INTO `current stock` (`ItemNumber`, `Stock`)
VALUES
('$_POST[ItemNumber]','$_POST[Stock]')";

仅供参考,您也欢迎SQL injections

【讨论】:

    【解决方案3】:
    ?php
      $conn=new mysqli("localhost","root","","inventory")
      or die("not connected".mysqli_connect_error());
      if(isset($_POST['submit']{
        $ItemNumber=$_POST['ItemNumber'];
        $Stock=$_POST['Stock'];
        $sql="insert into current stock(ItemNumber,Stock) values('$ItemNumber','$Stock')";
        $query=mysqli_query($conn,$sql);
        if($query){
          echo"1 row inserted";
        }else{
          echo mysqli_error($conn);
        }
      }
    ?>
    

    【讨论】:

    【解决方案4】:

    请学习使用参数绑定。您正在创建存在安全漏洞的代码。

    下面是如何在 mysqli 中编写代码:

    $sql = "INSERT INTO current stock (ItemNumber, Stock) VALUES (?, ?)";
    
    if (!($stmt = mysqli_prepare($con, $sql))) {
        die('Error: ' . mysqli_error($con));
    }
    
    if (!mysqli_stmt_bind_param($stmt, "ii", $_POST[ItemNumber], $_POST[Stock])) {
        die('Error: ' . mysqli_stmt_error($stmt));
    }
    
    if (!mysqli_stmt_execute($stmt)) {
        die('Error: ' . mysqli_stmt_error($stmt));
    }
    

    使用绑定参数比将所有的引号都与引号内的引号混淆起来更容易。

    【讨论】:

      【解决方案5】:
      <form action="database.php" method="post">
         Item Number: <input type="text" name="ItemNumber">
         Stock: <input type="text" name="Stock">
         <input type="submit" name="submit">
      </form>`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多