PDO插入语句不起作用

时间:2013-12-17 03:58:17

标签: php pdo

我的插入语句不起作用,我正在学习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获得有意义的错误信息或者故意使用这很难。

2 个答案:

答案 0 :(得分:0)

我认为你没有绑定并执行正确对象的值。有:

foreach ($insert_array as $field => $item) {
        $database->bind(':'.$field,$item);
}   

//execute the insert
$database->execute();

实际上$insert_db包含PDOStatement。试试这个:

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);

前面

答案 1 :(得分:-1)

而不是使用

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());
}

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