2014-12-27 88 views
1

這讓我瘋狂......我試圖插入使用預先準備的語句,並且這個事情默默地失敗了。 這裏是代碼:PHP PDO默默不插入

$sql = 'INSERT INTO payments (id_fix, name, date, comment, timestamp) VALUES (:id_fix, :name, :date, :comment, :timestamp)'; 
$q = $this->PDO->prepare($sql); 

$a = array(
'id_fix' => $r['id'], 
'name' => $r['name'], 
'date' => $r['evt_date'], 
'comment' => $this->comment, 
'timestamp' => $r['timestamp']); 

$q->execute($a) or die ('NAPAKA'); 

$ r是來自另一個查詢。 我知道我應該做簡單的子查詢,但我想解決這個問題。

如果我改變

'id_fix' => 0 

它的作品!如果我回顯$ r ['id']這是一個有效的數字。

'id_fix' => intval($r['id']) 

將不起作用。

任何想法? :-S

+1

你能用'die($ q-> errorInfo())'代替'die('NAPAKA')'並且在這裏報告錯誤嗎? – Mureinik 2014-12-27 16:08:51

+1

From [http://php.net/manual/en/function.intval.php] - var成功時的整數值,或者失敗時爲0。空數組返回0,非空數組返回1.' 如果打印轉換的輸出,它會返回什麼? – 2014-12-27 16:10:00

+1

試着打開錯誤,你會得到什麼? – julienhaversano 2014-12-27 16:10:14

回答

1
$sql = 'INSERT INTO payments (id_fix, name, date, comment, timestamp) VALUES (:id_fix, :name, :date, :comment, :timestamp)'; 
$q = $this->PDO->prepare($sql); 

$q->bindParam(':id_fix',$r['id_fix']); 
$q->bindParam(':name',$r['name']); 
$q->bindParam(':date',$r['date']); 
$q->bindParam(':comment',$r['comment']); 
$q->bindParam(':timestamp',$r['timestamp']); 

$q->execute() or die ('NAPAKA'); 
+0

沒有解釋,你有什麼改變?我希望它不只是半分區cuz,不會幫助 – meda 2014-12-27 17:50:59

+0

它不能在數據庫表中id_fix,你得到$ r ['id'],這就是爲什麼它失敗,我認爲。我還沒有看到有關$ r的所有腳本 – 2014-12-27 18:42:13

+0

您是否可以再次嘗試上述代碼。這是正確的,我認爲它失敗,因爲你使用$ r ['id']而不是$ r ['id_fix'] – 2015-01-05 14:14:12

1

的東西靜靜地失敗 - OP

你需要檢查錯誤,閱讀上Errors and error handling

try { 
    $this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $sql = ' 
    INSERT INTO payments 
       (id_fix, 
       NAME, 
       date, 
       comment, 
       timestamp) 
    VALUES  (:id_fix, 
       :name, 
       :date, 
       :comment, 
       :timestamp) 
    '; 
    $q = $this->PDO->prepare($sql); 

    $a = array(
    'id_fix' => $r['id'], 
    'name' => $r['name'], 
    'date' => $r['evt_date'], 
    'comment' => $this->comment, 
    'timestamp' => $r['timestamp']); 

    $q->execute($a); 

} catch (PDOException $e) { 
    echo 'Query failed: ' . $e->getMessage(); 
} 
0

如果我改變

'id_fix' => 0 

它的工作原理!如果我回顯$ r ['id']這是一個有效的數字。

'id_fix' => intval($r['id']) 

不起作用。

會解釋這些症狀的一個簡單的解釋是這樣的:你正在插入的表上id_fix一個PRIMARY INDEX AUTO_INCREMENT。發送0具有使參數爲空的效果,這意味着自動生成新的ID。它的工作原理。

您嘗試插入的其他ID已經存在,並導致錯誤。

我不是說 - 我不能保證 - 這是解釋,但它是一個解釋,沒有更詳細的錯誤消息,恐怕是最好的,可以做到。

您需要激活錯誤報告,使用PDO exceptions,並用try/catch包圍查詢。