使用PHP表单向MySQL插入数据时出现MariaDB SQL语法错误求助
问题分析与解决方案
嘿,我一眼就揪出你代码里的问题啦!
错误根源
你给SQL语句里的列名套了单引号('),这在MySQL/MariaDB里是典型的语法错误。记住:单引号只能用来包裹字符串类型的字段值,而列名(或表名)如果需要转义,必须用反引号(`)——要是列名不是MySQL的保留关键字,甚至可以直接不用转义符号。
看你抛出错误的SQL:
INSERT INTO time ('emp_name', 'clockdate', 'start_at', 'end_at') VALUES ('John Smith','2018-05-01','08:00:00','12:00:00')
这里的'emp_name'写法完全错误,数据库会把它当成普通字符串,而非列名,自然就触发语法报错了。另外补充一句:time是MySQL的关键字,你的表名用这个词的话,也最好用反引号包起来,避免隐性冲突。
修正后的SQL写法
两种正确姿势任你选:
- 用反引号转义(推荐,适配所有场景):
INSERT INTO `time` (`emp_name`, `clockdate`, `start_at`, `end_at`) VALUES ('John Smith','2018-05-01','08:00:00','12:00:00')
- 若列名/表名非关键字,可直接省略转义:
INSERT INTO time (emp_name, clockdate, start_at, end_at) VALUES ('John Smith','2018-05-01','08:00:00','12:00:00')
对应PHP代码修正示例
假设你的PHP连接逻辑已经正常,修正后的代码大概是这样:
// 假设$conn是已经建立好的数据库连接 $sql = "INSERT INTO `time` (`emp_name`, `clockdate`, `start_at`, `end_at`) VALUES ('John Smith','2018-05-01','08:00:00','12:00:00')"; if ($conn->query($sql) === TRUE) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close();
额外重要提醒
为了避免SQL注入风险,强烈建议你放弃直接拼接字符串的写法,改用预处理语句,示例如下:
$stmt = $conn->prepare("INSERT INTO `time` (`emp_name`, `clockdate`, `start_at`, `end_at`) VALUES (?, ?, ?, ?)"); // 绑定参数,"ssss"表示四个参数都是字符串类型 $stmt->bind_param("ssss", $emp_name, $clockdate, $start_at, $end_at); // 给变量赋值 $emp_name = "John Smith"; $clockdate = "2018-05-01"; $start_at = "08:00:00"; $end_at = "12:00:00"; $stmt->execute(); echo "新记录插入成功"; $stmt->close(); $conn->close();
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

