Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PDO在PHP中执行_Php_Sql_Pdo - Fatal编程技术网

PDO在PHP中执行

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

我在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', $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或其他内容。错误消息是特殊的-