【问题标题】:You have an error in your SQL syntax PHP MySQL您的 SQL 语法 PHP MySQL 有错误
【发布时间】:2014-10-25 15:52:41
【问题描述】:

我正在使用 PHP 制作一个发送到我的数据库的订单,但我在提交时收到此错误:

错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'case, casel, processor) VALUES ('case1', 'casel1', 'processor1')' 附近使用正确的语法

这是我的代码

index.php:

<Form name ="pc" Method ="Post" ACTION ="cart.php">
<Input type = 'Radio' Name ='case' value= 'case1' />Case 1 <br />
<Input type = 'Radio' Name ='case' value= 'case2' />Case 2 <br />
<Input type = 'Radio' Name ='case' value= 'case3' />Case 3 <br /><br />

<Input type = 'Radio' Name ='casel' value= 'casel1' />Red<br />
<Input type = 'Radio' Name ='casel' value= 'casel2' />Green <br /><br />

<Input type = 'Radio' Name ='processor' value= 'processor1' />Intel&reg; Core&trade; i3 4130 3,4 GHz<br />
<Input type = 'Radio' Name ='processor' value= 'processor2' />Intel&reg; Core&trade; i5 4670K 3.40 Ghz <br />
<Input type = 'Radio' Name ='processor' value= 'processor3' />Intel&reg; Core&trade; i7 4770K 3.5 GHz <br />

<Input type = 'submit' Name ='submit' value= 'Submit' ><br />

</FORM>

cart.php

<?php
include("config.php");
if ( isset( $_POST['case'] ) && isset( $_POST['casel'] ) && isset( $_POST['processor'] ) ) {
$case = mysqli_real_escape_string($mysqli, $_POST['case']);
$casel = mysqli_real_escape_string($mysqli, $_POST['casel']);
$processor = mysqli_real_escape_string($mysqli, $_POST['processor']);

$sql="INSERT INTO products (case, casel, processor) 
    VALUES ('$case', '$casel', '$processor')";

if (!mysqli_query($mysqli,$sql)) {
  die('Error: ' . mysqli_error($mysqli));
}
echo "1 record added";
} else {
echo "You didn't choose all the options! No record was added. Please choose one option from each category";
}
?>

【问题讨论】:

    标签: php mysql sql syntax


    【解决方案1】:

    请记住,case 是保留字,因此应该在反引号内:

    `案例`
    INSERT INTO products (`case`, casel, processor)
    

    这里是保留字的list

    注意:fluffeh 提出的一个很好的建议,最好只使用另一个列名。

    对了,既然你用的是mysqli_*,那为什么不用prepared statements呢。

    【讨论】:

    • 可能值得注意的是,列名是保留字是可怕的。最好重命名它,并且永远不要再使用那种名称。
    • 顺便问一下,准备好的语句有什么用?
    • @KyleThomas 直接在您的查询字符串上使用用户输入对 sql 注入开放,请查看 link 并阅读它,您就会明白为什么。
    • 所有选项都是单选按钮,没有文本框等真正的输入。这还需要做吗?
    • @KyleThomas 用户从单选按钮输入并不能保证您的安全输入,您是开发人员,对吧?尝试使用控制台更改 dom 内的值 :)
    【解决方案2】:

    case 是 MySQL 中的 reserved word。为了使用语法词作为标识符,您需要将它们括在反引号中:

    INSERT INTO `products` (`case`, `casel`, `processor`) 
    VALUES ('$case', '$casel', '$processor')
    

    一般:

    1. 无论如何,最好将标识符显式地包含在反引号中。
    2. 使用保留字作为标识符不是一个好主意。

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      相关资源
      最近更新 更多