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 =”定义似乎有什么问题?
谢谢
答案 0 :(得分:2)
WHEN
是Reserved 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语句,以获取在命令执行时替换为变量的参数。