这看起来真的很简单,但仍然在最后几个小时对着墙头踢我的头,并在网上寻找解决这个问题的任何线索也没有帮助。
错误:
简而言之,我在execute()循环内的第一次foreach调用中获得了异常。
Error while execute data (User1, Group1)
exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access
violation: 1064 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 'group)
VALUES ('User1', 'Group1')' at line 2' in C:\wamp\www\dbo-test-transactions.php:32
Stack trace: #0 C:\wamp\www\dbo-test-transactions.php(32):
PDOStatement->execute(Array) #1 {main}
我用的是什么?
Windows上的WAMP 2.4;数据库主机,用户名和密码具有默认值(" localhost"," root""")。我创建了数据库test
(合作: utf8_general_ci ),其中包含表格users
(两列user_name
和group
)。两列都是 VARCHAR(50),user_name
列有 PRIMARY KEY 。数据库引擎 InnoDB 。
我尝试了什么?
我已经尝试使用query()和"真实"直接执行查询mysql查询,没有任何事务,并且运行良好。但是当我尝试使用准备好的语句时,它会一直失败。此外,我尝试使用bindParam()或bindValue()的不同方法,但最终结果始终相同 - 它会抛出异常。
已经检查了很多资源,主要是在StackOverflow,PHP.net和MySQL.com,全部读取,逐字逐句,检查所有示例,评论等。
相关代码
我已使用这段代码建立了我的数据库连接。
try {
$pdo = @new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
}
catch (PDOException $ex) {
die ("<b>Connection Error!</b><br /><br />{$ex}");
}
我的查询看起来像这样。
$sql = "INSERT INTO users (user_name, group) VALUES (?, ?)";
我要插入数据库表的所有数据都存储在一个数组中。
$data = array();
$data[] = array("User1", "Group1");
$data[] = array("User2", "Group2");
$data[] = array("User3", "Group3");
最后,我要做的就是:
$pdo->beginTransaction();
$res = $pdo->prepare($sql);
foreach ($data as $values) {
try {
$res->execute($values);
}
catch (PDOException $ex) {
$pdo->rollBack();
die ("<b>Error while execute data ({$values[0]}, {$values[1]})</b><br /><br />{$ex}");
}
}
$pdo->commit();
我确定答案在代码中的某处,但仍然不知道问题在哪里。是的,看起来像初学者的问题,这真的让我最疯狂。
如果您需要更多信息或更新,请与我们联系。希望我已经提供了所有相关的代码示例和信息。
答案 0 :(得分:1)
找到答案。根据此链接,解决方案是封装您的字段名称。 PHP PDO Syntax error or access violation: 1064 on insert
在上一个链接中,“desc”是一个保留关键字。在您的情况下,“组”是一个保留字。 http://dev.mysql.com/doc/refman/5.6/en/reserved-words.html
请尝试此查询:
$sql = "INSERT INTO `users` (`user_name`, `group`) VALUES (?, ?)";