执行 mysqli_query 时出现 SQL 语法错误

Posted

技术标签:

【中文标题】执行 mysqli_query 时出现 SQL 语法错误【英文标题】:SQL Syntax Error when executing mysqli_query 【发布时间】:2014-12-03 15:25:09 【问题描述】:

我有一个带有 mysqli 和 OOP 的 php 注册脚本。 但是在执行查询时出现 mysql 语法错误。

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-mail, ip_register, ip_lastlogin, lastlogin) VALUES ('', Aarivex, ******, ****' at line 1

PHP 代码:

$register_sql = "INSERT INTO users (id, username, password, pin, e-mail, ip_register, ip_lastlogin, lastlogin) VALUES ('', $username, $password, $pin, $email, $ip, $ip, $lastlogin)";

问题出在哪里?

【问题讨论】:

天哪,这很容易。 P.S.查看参数化查询。这(可能)是不安全的。 解决了我的问题。谢谢大家!我必须将“id”值设置为 0,将电子邮件更改为电子邮件并添加引号。 不客气@Aarivex 很高兴能提供帮助。 【参考方案1】:
...for the right syntax to use near '-mail  
SQL's telling you where error starts ^ the offending character 

您需要用反引号包裹/封装e-mail 列,因为它包含一个连字符。

您想要进行数学运算的 SQL 数字转换为:e 减去 mail

另外,您的价值观中缺少引号

$register_sql = "INSERT INTO users (id, username, password, pin, `e-mail`, ip_register, ip_lastlogin, lastlogin) VALUES ('', '$username', '$password', '$pin', '$email', '$ip', '$ip', '$lastlogin')";

这些是字符串,必须在引号内。

另一个选项是使用下划线将您的列重命名为e_mail,就像您对其他一些列所做的那样。这样,您就不需要使用反引号。

考虑使用以下方法之一:

Prepared statements

PDO with prepared statements.


使用or die(mysqli_error($con))mysqli_query() 会发出错误信号。

$con 是您的数据库连接,这可能/站与您的不同。

进行相应调整。

标识符(表/列)

有关此主题的更多信息:http://dev.mysql.com/doc/refman/5.0/en/identifier-qualifiers.html

提示:

尽量避免使用连字符、空格或任何其他 SQL 可能会抱怨的字符,这包括在单词之间使用空格。

即:

INSERT INTO your_table (column 1, column-2) <= will cause/throw an error

你需要使用反引号:

INSERT INTO your_table (`column 1`, `column-2`) <= correct / valid

虽然允许使用空格(但不鼓励),但它们也需要封装在反引号中。

【讨论】:

+1 用于提及缺少的引号。到目前为止,我还没有得到那个。 @JohnConde 谢谢约翰 :)【参考方案2】:

如果您要在列标识符中使用破折号(这是个坏主意),您必须将其包装在刻度中。否则,您将从 e 列中减去在 INSERT 语句中无效的 mail 列的值。

您的字符串值周围也缺少引号。

$register_sql = "INSERT INTO users (id, username, password, pin, `e-mail`, ip_register, ip_lastlogin, lastlogin) VALUES ('', '$username', '$password', '$pin', '$email', '$ip', '$ip', '$lastlogin')";

【讨论】:

【参考方案3】:

尝试将电子邮件字段名称更改为电子邮件,或者您需要将您的字段名称用反引号括起来,如下所示:

`e-mail`

【讨论】:

【参考方案4】:

我想你的 id 设置为 Auto Increment。 如果只是从插入语句中删除第一列,它应该可以正常工作。

$register_sql = "INSERT INTO users (username, password, pin, e-mail, ip_register, ip_lastlogin, lastlogin) VALUES ($username, $password, $pin, $email, $ip, $ip, $lastlogin)";

是的,将电子邮件字段更改为“电子邮件”。

【讨论】:

以上是关于执行 mysqli_query 时出现 SQL 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中实现 sql语15分钟执行一次 希望说详细一下

执行sql语法时出现异常[重复]

执行 SQL 查询时出现 Wix 错误 -2147217900

使用 JDBC 驱动程序执行 Sql 查询时出现 NetworkOnMainThreadException

在 python 中执行雪花 SQL 语句时出现雪花 python 错误

使用存储过程执行 PL/SQL 代码时出现问题