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()or创建 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

尽管我对 Binds 没有那么丰富的经验,但您的绑定手册与您所做的背道而驰。

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 回答