PDO插入语句无效


PDO insert statement not working

我的插入语句不起作用,我正在学习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());
}

这就是我捕捉错误的方式。