无法使用 PDO 插入 MySQL 数据库....没有错误
Posted
技术标签:
【中文标题】无法使用 PDO 插入 MySQL 数据库....没有错误【英文标题】:Cannot insert into MySQL database using PDO....No errors 【发布时间】:2013-10-13 20:10:37 【问题描述】:我有一个问题,我无法使用 PDO 将任何内容插入 mysql 数据库。
我没有收到任何错误,但是每当我检查数据库是否已插入行时,表都是空的。
我知道我已经连接到数据库,因为我可以选择但不能插入。
这是我的 PDO 课程
class Database extends PDO
public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS)
parent::__construct($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME, $DB_USER, $DB_PASS);
//parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTIONS);
/**
* select
* @param string $sql An SQL string
* @param array $array Paramters to bind
* @param constant $fetchMode A PDO Fetch mode
* @return mixed
*/
public function select($sql, $array = array(), $fetchMode = PDO::FETCH_ASSOC)
$sth = $this->prepare($sql);
foreach ($array as $key => $value)
$sth->bindValue("$key", $value);
$sth->execute();
return $sth->fetchAll($fetchMode);
/**
* insert
* @param string $table A name of table to insert into
* @param string $data An associative array
*/
public function insert($table, $data)
/*ksort($data);
$fieldNames = implode('`, `', array_keys($data));
$fieldValues = ':' . implode(', :', array_keys($data));
$sth = $this->prepare("INSERT INTO $table (`$fieldNames`) VALUES ($fieldValues)");
foreach ($data as $key => $value)
$sth->bindValue(":$key", $value);
*/
$sth = $this->prepare("INSERT INTO user (`login`, `password`, `role`) VALUES (:login, :password, :role)");
$sth->bindValue(':login', 'username');
$sth->bindValue(':password', 'password');
$sth->bindValue(':role', 'owner');
$sth->execute();
/*if ($sth->errorCode() != 0)
$arr = $sth->ErrorInfo();
throw new Exception('SQL failure:'.$arr[0].':'.$arr[1].':'.$arr[2]);
*/
$sth->debugDumpParams();
这是我的表结构(保持简单以便调试)。
CREATE TABLE IF NOT EXISTS `user` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(25) NOT NULL,
`password` varchar(64) NOT NULL,
`role` enum('default','admin','owner') NOT NULL DEFAULT 'default',
PRIMARY KEY (`userid`)
) ENGINE=InnoDB
编辑:
我发现了问题所在。问题出在数据数组上。如果我在调用 insert() 函数时使用 $data['first_name'] ,它会失败,但如果我用硬代码值替换所有这些 $data[] 值,它会起作用,所以问题在于 $data[]
我创建了一个 POST 变量数组
// get all the post data from the registration form
$data = array();
$data['first_name'] = $_POST['first_name'];
$data['last_name'] = $_POST['last_name'];
$data['gender'] = $_POST['gender'];
$data['email'] = $_POST['email'];
$data['interests'] = $_POST['interests'];
$data['username'] = $_POST['username'];
$data['password'] = $_POST['password'];
$data['newsletter'] = $_POST['newsletter'];
$data['terms'] = $_POST['terms'];
$data['captcha'] = $_POST['captcha'];
这被传递给创建函数
public function create($data)
$this->db->insert('users', array(
'first_name' => $data['first_name'], //this won't work
'first_name' => 'whatever the name is', //this will work
'last_name' => $data['last_name'],
'email' => $data['email'],
'username' => $data['username'],
'password' => $password,
'user_salt' => $user_salt,
'sex' => $data['gender'],
'interests' => $data['interests'],
'signup_date' => date('Y-m-d H:i:s'),
'verification_code' => $code
));
这就是它被插入的地方
public function insert($table, $data)
ksort($data);
$fieldNames = implode('`, `', array_keys($data));
$fieldValues = ':' . implode(', :', array_keys($data));
$sth = $this->prepare("INSERT INTO $table (`$fieldNames`) VALUES ($fieldValues)");
foreach ($data as $key => $value)
$sth->bindValue(":$key", $value);
$sth->execute();
【问题讨论】:
你的数据库用户有插入记录的权限吗? 我怎么知道?我刚刚尝试使用另一个数据库类进行插入,它插入很好,所以我看不出问题是什么 你没有得到任何错误?通常这总是意味着 INSERT 本身真的很成功。您可能希望确保您的代码不会删除您刚刚插入的行,或者在插入后删除并重新创建表。您还应该确保您实际上选择了正确的数据库。或者您可能使用了错误的主机。 您的数据库调用都没有检查错误情况,并且您已禁用异常模式,因此您只是假设您正在连接和/或实际执行查询。 @AdRock 出现什么错误? 【参考方案1】:试试这个,
$fieldNames = implode(', ', array_keys($data));
$fieldValues = ':' . implode(', :', array_values($data));
$sth = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues)");
【讨论】:
我试过这个,但我收到了错误Connection failed: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound1
。我的功能可以在这个粘贴中找到:pastie.org/8612517。任何想法为什么?【参考方案2】:
$fieldValues = implode(':,', array_keys($data));
【讨论】:
以上是关于无法使用 PDO 插入 MySQL 数据库....没有错误的主要内容,如果未能解决你的问题,请参考以下文章
无法选择最后插入的 id 为 [Mysql, php pdo oop] [重复] 的行
使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库