【发布时间】:2012-04-26 18:54:42
【问题描述】:
我在使用 PDO 执行语句时遇到了一些问题。我的代码如下所示:
try {
$stmt = $this->dbh->prepare("INSERT INTO smtp_servers (host, port, ssl, auth, username, password) VALUES(:host, :port, :ssl, :auth, :username, :password)");
$stmt->bindParam(':host', $serverOptions[0]);
$stmt->bindParam(':port', $serverOptions[1]);
$stmt->bindParam(':ssl', $serverOptions[2]);
$stmt->bindParam(':auth', $serverOptions[3]);
$stmt->bindParam(':username', $serverOptions[4]);
$stmt->bindParam(':password', $serverOptions[5]);
$stmt->execute();
} catch (PDOException $e) {
print("fail");
}
如果我在 $stmt->execute(); 打印测试之前进行打印,它不会打印“失败”,但如果我在执行行之后打印,它不会打印文本。
有什么想法吗?
更新:
我试图抛出更通用的异常,但没有任何运气,我在使用整数的地方实现了PDO::PARAM_INT。并且还添加了一行:
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
现在我的代码如下所示:
try {
$stmt = $this->dbh->prepare("INSERT INTO smtp_servers (host, port, ssl, auth, username, password) VALUES(:host, :port, :ssl, :auth, :username, :password)");
$stmt->bindParam(':host', $serverOptions[0]);
$stmt->bindParam(':port', $serverOptions[1], PDO::PARAM_INT);
$stmt->bindParam(':ssl', $serverOptions[2], PDO::PARAM_INT);
$stmt->bindParam(':auth', $serverOptions[3], PDO::PARAM_INT);
$stmt->bindParam(':username', $serverOptions[4]);
$stmt->bindParam(':password', $serverOptions[5]);
$stmt->execute();
} catch (PDOException $e) {
debug("fail");
}
我想看看我的数据库表设计会有所帮助吗?
CREATE TABLE IF NOT EXISTS `smtp_servers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`host` varchar(50) NOT NULL,
`port` int(11) DEFAULT NULL,
`ssl` smallint(11) DEFAULT NULL,
`auth` smallint(11) DEFAULT NULL,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
现在我收到此错误:
致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 13 行的 /var/www/isms/php/communication/Mail.php 的第 1 行的“ssl、auth、用户名、密码 FROM smtp_servers”附近使用正确的语法PDOException: SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 13 行的 /var/www/isms/php/communication/Mail.php 的第 1 行的“ssl、auth、用户名、密码 FROM smtp_servers”附近使用正确的语法堆栈:0.0002 649056 1. {main}() /var/www/isms/index.php:0 0.0023 867336 2. include('/var/www/isms/php/settings/ismsSettings.php') /var/www /isms/index.php:88 0.0065 1091712 3.require_once('/var/www/isms/php/settings/MailSettings.php') /var/www/isms/php/settings/ismsSettings.php:29 0.0147 2288960 4 .require_once('/var/www/isms/php/forms/settings/EditSmtpServer.php') /var/www/isms/php/settings/MailSettings.php:4 0.0155 2290456 5. Mail->getServers() /var /www/isms/php/forms/settings/EditSmtpServer.php:41 0.0156 2291888 6. PDOStatement->execute() /var/www/isms/php/communication/Mail.php:13
【问题讨论】:
-
尝试将异常更改为通用
Exception。 PDO 应该抛出 PDOException,但可能会以某种方式抛出不同的异常。 -
另外,您的所有字段都是字符串吗? bindParam 的第三个参数是 data_type,默认为 PDO::PARAM_STR。您可能需要 PDO::PARAM_INT 或其他东西。
-
错误信息很奇特——尤其是这部分:
'ssl, auth, username, password FROM smtp_servers'。这看起来像 SELECT 语法,这不是您在这里所做的。 SELECT 是否早些时候失败了,并且在您发布代码之前它不会抛出异常。 `/var/www/isms/php/communication/Mail.php 第 13 行`是什么?