2013-12-17 3 views
0

Моя инструкция для вставки не работает, я изучаю PDO и им довольно уверен, что это как-то связано с тем, как im обрабатывает кавычки и двойные кавычки, но ive попробовал множество сценариев, и ни одна из них не работает. Моя основная проблема заключается в том, что я не могу просто напечатать строку, как я мог, с помощью простого старого mysql, если вставка сломалась, im не уверен, что лучший способ устранить проблемы с вставкой с PDO, поскольку это функция, которую я использовал в течение длительного времениPDO insert statement не работает

Позвольте мне показать первый мой код:

$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_error(); но, поскольку вы можете видеть, что результат выглядит нормально, но это не точная строка, поэтому единственное, что я могу предположить, ошибочно - это контейнеры вокруг массива. Вместо «$ username», возможно, это должно быть «». Username. »Или что-то в этом роде, но ive попробовал кучу вариаций и потерпел неудачу, конечно, есть способ с PDO получить осмысленное сообщение об ошибке или намеренно сделать это будет трудно.

+1

Проверьте [документы PDO на обработку ошибок] (http://www.php.net/manual/en/pdo.error-handling.php). По умолчанию он ошибочно звучит, но вы можете и должны настраивать его для исключения исключений через 'setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION)' –

+0

Запрос, похоже, синтаксически действителен, кстати. –

+1

Что в методах 'bind' и' query'? – Phil

ответ

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

Вместо использования

mysql_error(); 

Вы можете использовать попытке поймать, чтобы найти ошибку.

Например:

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

Это, как я ловлю ошибки.

Смежные вопросы