2

Iamは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]:構文エラーまたはアクセス違反:1064SQL構文にエラーがあります。13行目の/var/www/isms/php/communication/Mail.phpの1行目の「ssl、auth、username、password FROM smtp_servers」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。 PDOException:SQLSTATE [42000]:構文エラーまたはアクセス違反:1064SQL構文にエラーがあります。13行目の/var/www/isms/php/communication/Mail.phpの1行目にある「ssl、auth、username、password FROM smtp_servers」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。スタック:0.0002 649056 1. {main}()/var/www/isms/index.php:0 0.0023 867336 2. include('/ var / www / isms / php / settings / ismsSettings.php'

4

4 に答える 4

2

「 MySQLの予約語」に関するandrewsiのコメントに加えて...[sslは確かにMySQLの予約語です!]

現状では、create tableステートメントもそのまま失敗しますが、そのようにフォーマットされています。ではない

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を使用していることに気づきました!(`)(&#096)

したがって、結論として、prepareステートメントの行を次のように変更します。

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

注: 読みやすくするために、この方法でのみフォーマットされています:)

于 2012-04-26T23:04:37.887 に答える
1

コード例でfailは、問題が発生した場合にのみ、tryブロック内のスクリプトによって例外がスローされたときに出力が発生するはずです。

すべてがスムーズに進み、クエリが成功したと仮定すると、行が表示されないことは良い兆候です。


クエリが成功せず、それでもエラーメッセージが表示されない場合は、エラーに対してのみPDOExceptionsをスローするようにPDOに指示してみてください。

$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

PDOオブジェクトをインスタンス化した直後。

于 2012-04-26T18:56:50.047 に答える
1

クエリのSQLを出力し、名前付きパラメーターを挿入しようとしている実際のパラメーターに置き換えて、コマンドラインから実行してみましたか?

例外のテキストは、PDO接続ではなくSQLステートメントに問題があることを示しており、コマンドラインから実行すると、SQL自体が機能するかどうかがわかります。

于 2012-04-26T19:51:13.650 に答える
0

これは、現在特定の名前空間にいることが原因である可能性があります。に置き換え} catch (PDOException $e) {てみて} catch (\PDOException $e) {、何かが変わるかどうかを確認してください。

于 2012-04-26T19:38:26.170 に答える