我的插入语句不起作用,我正在学习PDO,我很确定这与我如何处理引号和双引号有关,但我尝试了很多场景,但都不起作用。我的主要问题是,如果插入中断,我不能像用普通的旧mysql那样打印字符串,我不确定用PDO解决插入问题的最佳方法是什么,因为这是我在中很久没有使用过的函数
让我先展示一下我的代码:
$insert_array = array(
"item_date" => "$todays_date",
"item_name" => "$username",
"item_user" => "$item_desc",
"item_description" => "$item_game_type",
"item_rating" => "0",
"total_ratings" => "0"
);
$insert_db = $database->insert_sql("item_table",$insert_array);
// loop through and bind the values in preperation for inserting
foreach ($insert_array as $field => $item) {
$database->bind(':'.$field,$item);
}
//execute the insert
$database->execute();
以下是功能:
// compile list of escaped fieldnames
// will return `user_name`, `user_password_hash`, `user_email`, `user_activation_hash`
function dbFieldList($fields) {
$set = '';
foreach ($fields as $field => $item) {
$set .= "`".$field."`,";
}
return rtrim($set, ',');
}
// compile list of values
// will return :user_name, :user_password_hash, :user_email, :user_activation_hash
function dbValuePList($fields) {
$set = '';
foreach ($fields as $field => $item) {
$set .= ":".$field.",";
}
return rtrim($set, ',');
}
// take data from arrays, clean the values in the
// dbFieldList and dbValuePList functions
// and create the insert query
// example INSERT INTO `users` (`user_id`,`user_name`,`address`) VALUES (:user_id, :user_name)
public function insert_sql($table="item_table",$insert_array="",$debug=false){
$this->query("
INSERT INTO `".$table."`
(". $this->dbFieldList($insert_array) .")
VALUES (". $this->dbValuePList($insert_array) .")
");
}
}
// prepare the query
public function query($query){
$this->stmt = $this->dbh->prepare($query);
}
现在我也有一些错误代码
if(!$insert_db){
echo "result of prepared insert statement: " . print_r($database->stmt) . "<br /><br />The result of the insert array values to be passed: " . print_r($insert_array) . "<br /><br />";
}
输出为:
PDOStatement Object
(
[queryString] =>
INSERT INTO `item_table`
(`item_date`,`item_name`,`item_user`,`item_description`,`item_rating`,`total_ratings`)
VALUES (:item_date,:item_name,:item_user,:item_description,:item_rating,:total_ratings)
)
Array
(
[item_date] => 2013-12-17 03:19:32
[item_name] => testing
[item_user] => test user
[item_description] => All
[item_rating] => 0
[total_ratings] => 0
)
所以我的问题是,我知道插入失败,但我不知道如何检查错误,使用我的旧mysql代码,我可以使用mysql_error();但正如您所看到的,输出看起来相当不错,但它不是确切的字符串,所以我唯一可以认为错误的是数组周围的容器。与其说"$username",也许应该是"'.$username.'"之类的东西,但我尝试了一系列变体,但都失败了,PDO肯定有办法获得有意义的错误消息,或者故意让它变得如此困难。
我认为您没有将值绑定并执行到正确的对象。那里:
foreach ($insert_array as $field => $item) {
$database->bind(':'.$field,$item);
}
//execute the insert
$database->execute();
它实际上是包含PDOS语句的CCD_ 1。试试这个:
foreach ($insert_array as $field => $item) {
$insert_db->bind(':'.$field,$item);
}
//execute the insert
$insert_db->execute();
否则,您的代码甚至不需要将$insert_db =
放在$database->insert_sql("item_table",$insert_array);
前面
而不是使用
mysql_error();
您可以使用try-catch来查找错误。
例如:
try
{
$q=$db->prepare("INSERT INTO table (`user`,`pass`) VALUES (:user,:pass)");
$q->execute(array(":user" => $user, ":pass" => $pass));
}
catch(Exception $e)
{
var_dump($e->getMessage());
var_dump($q->debugDumpParams());
}
这就是我捕捉错误的方式。