带有预处理语句的execute()异常

时间:2014-12-31 00:40:27

标签: php mysql pdo transactions prepared-statement

这看起来真的很简单,但仍然在最后几个小时对着墙头踢我的头,并在网上寻找解决这个问题的任何线索也没有帮助。

错误:

简而言之,我在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_namegroup)。两列都是 VARCHAR(50)user_name列有 PRIMARY KEY 。数据库引擎 InnoDB

enter image description here

我尝试了什么?

我已经尝试使用query()和"真实"直接执行查询mysql查询,没有任何事务,并且运行良好。但是当我尝试使用准备好的语句时,它会一直失败。此外,我尝试使用bindParam()bindValue()的不同方法,但最终结果始终相同 - 它会抛出异常

已经检查了很多资源,主要是在StackOverflow,PHP.netMySQL.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();

我确定答案在代码中的某处,但仍然不知道问题在哪里。是的,看起来像初学者的问题,这真的让我最疯狂。

如果您需要更多信息或更新,请与我们联系。希望我已经提供了所有相关的代码示例和信息。

1 个答案:

答案 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 (?, ?)";