只有一个字段不起作用,sql语法错误

时间:2014-01-09 11:07:14

标签: php mysql sql sql-server

iv'e在mySQL中创建了一个数据库,代码中提到了以下内容:

<?php

// Create connection
$con=mysqli_connect("myURL","myUSER","myPassword","NewActivities");

// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }



$sql="INSERT INTO NewActivities1 (address, title, description, area, category, frequency, when)
VALUES
('$_POST[address]','$_POST[title]','$_POST[description]','$_POST[area]','$_POST[category]','$_POST[frequency]','$_POST[when]')";
if (!mysqli_query($con,$sql))
  {
  die('Error: ' . mysqli_error($con));
  }
echo "1 record added";
mysqli_close($con);

?>

我一直收到这个错误: 错误:SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以便在'when)VALUES('fff','fff','fff','Stockholm','Activities','One time','fff'附近使用正确的语法) )'在第1行

如果我从查询中删除了“when”,则数据库会在上述字段中更新。

表单中的字段“when”在“”

时使用属性“name =”定义

似乎有什么问题?

谢谢

1 个答案:

答案 0 :(得分:2)

WHENReserved Word。正如Schema Object Names所述:

  

如果标识符包含特殊字符或是保留字,那么只要您引用它,就必须引用它。 (例外:在限定名称中的句点后面的保留字必须是标识符,因此不需要引用它。)

[ deletia ]
     

标识符引号字符是反引号(“`”):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;
     

如果启用了ANSI_QUOTES SQL模式,也允许在双引号内引用标识符:

     

mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

因此:

$sql="INSERT INTO NewActivities1 (address, title, description, area, category, frequency, `when`)

你也应该阅读正确的字符串转义(以及如何将错误暴露给你的应用程序以及bug和常被利用的攻击媒介):我完全推荐@ deceze的博客文章,{{ 3}}

特别是,正如他在文章中所描述的那样,将用户提供的非转义字符串直接连接到SQL中不仅使您容易受到The Great Escapism (Or: What You Need To Know To Work With Text Within Text)的攻击,而且还会引入错误,其中字符串包含具有特殊含义的字符SQL字符串文字(例如')。

SQL injection attack使用占位符准备 SQL语句,以获取在命令执行时替换为变量的参数。