我正在尝试使用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 */;
<00>'00000'显然意味着成功,但如果成功则不应该打印。没有任何内容插入数据库。我确定这是一个错字,但我找不到它。
SQL语句:
INSERT INTO inbox_unread (date, body, to, from) VALUES ('2013-01-04 23:40:58', 'test', 'will', 'will')
答案 0 :(得分:3)
您的查询中有一个保留字:
$stmt = $this->database->prepare("INSERT INTO
inbox_unread (date, body, to, `from`) VALUES (:date, :body, :to, :from)");
Stackoverflow语法高亮显示实际上显而易见。对于这样的通用列名,可能建议将它们全部放在反引号中。
答案 1 :(得分:2)
假设您的值都非空且有效(您已使用var_dump()
确保其值按预期收集)...
首先,您可能希望使用$stmt->errorInfo()
而不是$this->database->errorInfo()
,因为您正在使用预准备语句。 The documentation,在“返回值”部分的最后一段中写着:
PDO::errorInfo()
仅检索直接在数据库句柄上执行的操作的错误信息。如果您通过PDO::prepare()
或PDO::query()
创建PDOStatement对象并在语句句柄上调用错误,PDO::errorInfo()
将不会反映语句句柄中的错误。您必须调用PDOStatement::errorInfo()
以返回对特定语句句柄执行的操作的错误信息。
您可以做的另一件事是var_dump
$stmt->execute()
来电,以便您对其返回的内容有一个确切的了解。
最后,mario关于启用错误报告是正确的。如果您想了解有关这些内容的详细信息,请查看文档中的PDO Errors and error handling。
答案 2 :(得分: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()
通过引用绑定变量而不是按值绑定。
答案 3 :(得分: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']);