PDO在PHP中执行
我在PDO execute语句中遇到了一些问题。我的代码如下所示:PDO在PHP中执行,php,sql,pdo,Php,Sql,Pdo,我在PDO execute语句中遇到了一些问题。我的代码如下所示: 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', $serverOp
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");
}
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");
}
如果在$stmt->execute()之前进行打印,则不会打印“fail”代码>它打印测试,但是如果我在执行行之后打印,它不会打印文本
有什么想法吗
更新:
我试图抛出更一般的异常,但没有任何运气,我在使用整数的地方实现了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]);
$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");
}
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");
}
我想看看我的db表设计会有帮助吗
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、username、password FROM smtp_servers”附近的正确语法。异常:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解在第13行调用堆栈上的/var/www/isms/php/communication/Mail.php的第1行使用“ssl、auth、用户名、来自smtp_服务器的密码”附近的正确语法:0.0002 649056 1。{main}()/var/www/isms/index.php:0.0023867362。包括('/var/www/isms/php/settings/ismsSettings.php')/var/www/isms/index.php:88 0.0065 1091712 3。需要一次('/var/www/isms/php/settings/MailSettings.php')/var/www/isms/php/settings/ismsSettings.php:29 0.0147 2288960 4。需要一次('/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
在您的代码示例中,fail
打印应该仅在出现问题的情况下,当try块内的脚本引发异常时才会发生
假设一切顺利,查询成功,看不到这一行是一个好迹象
如果查询未成功,但仍然没有看到错误消息,请尝试告诉PDO仅在出现错误时抛出PDO异常:
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
在实例化PDO对象之后。在您的代码示例中,失败
打印应该仅在出现问题的情况下,当脚本在try块中引发异常时才会发生
假设一切顺利,查询成功,看不到这一行是一个好迹象
如果查询未成功,但仍然没有看到错误消息,请尝试告诉PDO仅在出现错误时抛出PDO异常:
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
就在实例化PDO对象之后。这可能是因为您现在在一个特定的命名空间中。试着用}catch(\PDOException$e){
替换}catch(\PDOException$e){
,看看是否有变化。这可能是因为您现在在一个特定的命名空间中。试着用}catch(\PDOException$e)替换}catch(PDOException$e){
{
并查看是否有更改。您是否尝试打印查询的SQL,用您尝试插入的实际参数替换命名参数,并从命令行运行它
异常的文本意味着SQL语句有问题,而不是PDO连接有问题,从命令行运行它会让您知道SQL本身是否工作。您是否尝试打印查询的SQL,用您尝试插入的实际参数替换命名参数,然后运行NI从命令行删除它
异常的文本意味着SQL语句有问题,而不是PDO连接有问题,从命令行运行它会让您知道SQL本身是否工作。除了andrewsi关于“”的注释之外。。。
[ssl确实是MySQL保留字!]
就目前情况而言,CREATETABLE语句也会按原样失败,但格式是这样的;不会
CREATE TABLE `smtp_servers` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`host` VARCHAR( 50 ) NOT NULL ,
`port` INT( 11 ) NOT NULL ,
`ssl` SMALLINT( 11 ) NOT NULL ,
`auth` SMALLINT( 11 ) NOT NULL ,
`username` VARCHAR( 50 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;
尽管如此,在我写这篇文章时,我注意到StackOverflow
使用
因此,总之,将“准备”语句行更改为以下内容:
$stmt = $this->dbh->prepare("INSERT INTO `smtp_servers`
(`host`, `port`, `ssl`, `auth`, `username`, `password`)
VALUES(:host, :port, :ssl, :auth, :username, :password)");
注意:仅为便于阅读而采用这种格式:)除了andrewsi对“”的评论之外。。。
[ssl确实是MySQL保留字!]
就目前情况而言,CREATETABLE语句也会按原样失败,但格式是这样的;不会
CREATE TABLE `smtp_servers` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`host` VARCHAR( 50 ) NOT NULL ,
`port` INT( 11 ) NOT NULL ,
`ssl` SMALLINT( 11 ) NOT NULL ,
`auth` SMALLINT( 11 ) NOT NULL ,
`username` VARCHAR( 50 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;
尽管如此,在我写这篇文章时,我注意到StackOverflow
使用
因此,总之,将“准备”语句行更改为以下内容:
$stmt = $this->dbh->prepare("INSERT INTO `smtp_servers`
(`host`, `port`, `ssl`, `auth`, `username`, `password`)
VALUES(:host, :port, :ssl, :auth, :username, :password)");
注意:仅以这种方式格式化以便于阅读:)尝试将异常更改为通用的异常
。PDO应该引发一个PDO异常,但可能会以某种方式引发另一个异常。此外,您的所有字段都是字符串吗?bindParam的第三个参数是data_type,默认为PDO::PARAM_STR。您可能需要PDO::PARAM_INT或其他内容。错误消息很特殊-尤其是这部分:'ssl,auth,username,password FROM smtp_server'
。这看起来像是SELECT语法,这不是您在这里要做的。SELECT之前失败了吗,在您发布代码之前它不会抛出异常。什么位于第13行的`/var/www/isms/php/communication/Mail.php`?尝试将异常更改为通用的异常
。PDO应该引发一个PDO异常,但可能会以某种方式引发另一个异常。此外,您的所有字段都是字符串吗?bindParam的第三个参数是data_type,默认为PDO::PARAM_STR。您可能需要PDO::PARAM_INT或其他内容。错误消息是特殊的-