php - PDO 在 PHP 中执行

标签 php sql pdo

我在使用 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 ;

现在我收到此错误:

Fatal error: Uncaught 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 'ssl, auth, username, password FROM smtp_servers' at line 1' in /var/www/isms/php/communication/Mail.php on line 13 PDOException: 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 'ssl, auth, username, password FROM smtp_servers' at line 1 in /var/www/isms/php/communication/Mail.php on line 13 Call Stack: 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

最佳答案

除了安德鲁西关于“MySQL reserved words”的评论...... [ssl确实是MySQL的保留字!]

就目前情况而言,您的创建表语句也按原样失败,但格式如下;没有

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 使用 spacing grave用于格式化! (`)(`)

因此,最后将您的准备语句行更改为以下内容:

$stmt = $this->dbh->prepare("INSERT INTO `smtp_servers` 
    (`host`, `port`, `ssl`, `auth`, `username`, `password`) 
    VALUES(:host, :port, :ssl, :auth, :username, :password)");

注意: 仅以这种方式格式化以便于阅读 :)

关于php - PDO 在 PHP 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339626/

相关文章:

php - 在php中使用bootstrap发生错误时如何显示错误

mysql - SQL:计算两个值之间出现的次数

php - 当存在索引问题时,查询/准备语句中未使用索引

php - PDO select 语句中的特殊字符

php - 如何一次性阻止多个查询

php - woocommerce 变体

php - multi_query 在 mysqli 中无法通过 sphinxql 更新实时 sphinx 索引

php - 从 json 数组中检索消息

mysql - 如何从fld_Date的引用字段中获取下一个日期字段?

php - PDO_mysql 不适用于doctrine2 和MAMP