0

我盯着这个语句和它的错误信息看了大约半个小时,却看不出它有什么问题。

这是我的声明:

try{
    $stmt = $conn->prepare("INSERT INTO dashboardsearchdates (userID, from, to) VALUES (?,?,?)");
    $result = $stmt->execute(array($userID, $frmFrom, $frmTo));
}
    catch(PDOException $e){
    echo 'ERROR: ' . $e->getMessage();
    $queryString = $stmt->queryString;
    $page = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
    mail(ADMIN_EMAIL, 'SQL ERROR: ' . $page, 'Error Page: ' . $page . '     //     Error: ' . $e->getMessage() . '     //     Query String: ' . $queryString);
}

这是我试图将值插入的表结构:

Table structure for table `dashboardsearchdates`

--

CREATE TABLE IF NOT EXISTS `dashboardsearchdates` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
  `userID` int(11) NOT NULL,
  `from` datetime NOT NULL,
  `to` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

这是我看到的异常:

ERROR: 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 'from, to) VALUES ('9','2012-12-12','2013-01-01')' at line 1

正如您从异常中看到的那样,我尝试插入数据库的三个值在运行时存在(否则它们不会显示在异常中)

我尝试过的事情:

$conn在代码中使用了上面的其他查询,所以我知道$conn它存在并且正在工作。

我已将声明改写为:

$stmt = $conn->prepare("INSERT INTO dashboardsearchdates (userID, from, to) VALUES (:userID,:from,:to)");
$stmt->bindParam(':userID', $userID);
$stmt->bindParam(':from', $frmFrom);
$stmt->bindParam(':to', $frmTo);                        
$result = $stmt->execute();

我已经尝试在表名、所有字段名、只有整数字段名和只有日期字段周围使用反引号。所有都带有上面显示的相同错误消息 - 据我所知,构造没有任何问题SQL。

对于其他尝试的任何建议,我将不胜感激。

4

2 回答 2

2

'from' 是一个关键字,您需要将其括在反引号中

`from`

'to' 也是一个关键字

注意:此问题与 PDO 无关。开发人员应该在开始动态构建之前在 mysql 客户端中测试他们的查询。

于 2013-06-11T13:45:15.680 回答
0

From 是 SQL 的保留字,所以如果你想使用它,你必须在反引号之前和之后使用它。

INSERT INTO dashboardsearchdates (userID, `from`, to) VALUES (?,?,?)"
于 2013-06-11T13:46:56.277 回答