2

PDOを使用してMySQLテーブルに挿入しようとしています。コード:

public function sendMail($to, $body) {
    /* this all works
     *
    error_reporting(E_ALL);
    ini_set('display_errors', '1');
    $stmt = $this->database->prepare("SELECT * FROM users");
    $stmt->execute();
    $fetch = $stmt->fetchAll();
    print_r($fetch);
     */

    $stmt = $this->database->prepare("INSERT INTO 
        inbox_unread (date, body, to, from) VALUES (:date, :body, :to, :from)");
    echo $stmt->bindParam(":date", date("Y-m-d H:i:s"));
    echo $stmt->bindParam(":body", $body);
    echo $stmt->bindParam(":to", $to);
    echo $stmt->bindParam(":from", $_SESSION['username']);
    if ($stmt->execute()) {
        echo "yes";
    } else {
        print_r($this->database->errorInfo());
    }
}

これは私が得る出力です:

1111Array ( [0] => 00000 [1] => [2] => )

データベース:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `sandbox`
--

-- --------------------------------------------------------

--
-- Table structure for table `inbox_unread`
--

CREATE TABLE IF NOT EXISTS `inbox_unread` (
  `mail_id` int(11) NOT NULL AUTO_INCREMENT,
  `date` datetime NOT NULL,
  `body` text NOT NULL,
  `to` varchar(255) NOT NULL,
  `from` varchar(255) NOT NULL,
  PRIMARY KEY (`mail_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

「00000」は明らかに成功を意味しますが、成功した場合は印刷されないはずです。データベースには何も挿入されません。タイプミスだと思いますが、見つかりません。

SQLステートメント:

INSERT INTO inbox_unread (date, body, to, from) VALUES ('2013-01-04 23:40:58', 'test', 'will', 'will')
4

4 に答える 4

3

クエリに予約語があります:

   $stmt = $this->database->prepare("INSERT INTO 
    inbox_unread (date, body, to, `from`) VALUES (:date, :body, :to, :from)");

Stackoverflow構文ハイライトは実際にそれを明らかにしました。そのような一般的な列名では、おそらくそれらすべてをバッククォートに入れることをお勧めします。

于 2013-01-04T23:53:12.140 に答える
2

値がすべて空でなく有効であると仮定します(var_dump()値が期待どおりに収集されていることを確認するためにすでに使用しています)…</ p>

まず、プリペアドステートメントを使用しているので、 $stmt->errorInfo()代わりに使用したい場合があります。「戻り値」セクションの最後の段落にあるドキュメントには、次のように書かれています。$this->database->errorInfo()

PDO::errorInfo()データベースハンドルで直接実行された操作のエラー情報のみを取得します。PDO::prepare()またはを介してPDOStatementオブジェクトを作成PDO::query()し、ステートメントハンドルでエラーを呼び出した場合、ステートメントハンドルPDO::errorInfo()からのエラーは反映されません。PDOStatement::errorInfo()特定のステートメントハンドルで実行された操作のエラー情報を返すには、を呼び出す必要があります。

あなたができるもう一つのことは、あなたがそれが何を返すかについて正確な考えを持つようにvar_dump、電話をすることです。$stmt->execute()

最後に、マリオはエラー報告をオンにすることについて正しいです。これらの詳細情報が必要な場合は、ドキュメントのPDOエラーとエラー処理を参照してください。

于 2013-01-04T23:39:54.247 に答える
1

この行を置き換えます:

echo $stmt->bindParam(":date", date("Y-m-d H:i:s"));

これらと:

$date = date("Y-m-d H:i:s");
echo $stmt->bindParam(":date", $date);

変数を値ではなく参照bindParam()でバインドするためです。

于 2013-01-04T23:29:15.527 に答える
0

私はバインドの経験はあまりありませんが、バインドのマニュアルはあなたが行ったことに反します。

http://php.net/manual/en/pdostatement.bindparam.php

echoスクリプトを次のように削除してみてください。

   $stmt->bindParam(":date", date("Y-m-d H:i:s"));
   $stmt->bindParam(":body", $body);
   $stmt->bindParam(":to", $to);
   $stmt->bindParam(":from", $_SESSION['username']);
于 2013-01-04T23:09:42.577 に答える