2013-09-01 48 views
0

我試圖用一些值插入一個窗體到使用PDO的MySQL數據庫中。用PDO插入的空條目,bindparam失敗

/*** Values for the form ***/ 
    $date = date_create(); 
    $time = date('Y-m-d H:i:s'); 
    $message = $_POST['message']; 
    $uid = $_SESSION['SESS_MEMBER_ID']; 
    $admin = 1; 

    /*** prepare the SQL statement ***/ 
    $stmt = $db->prepare("INSERT INTO messages (message_id, timestamp, uid, admin, read, edited, message) VALUES ('',':time',':uid',':admin','','',':message')"); 

    /*** bind the paramaters ***/ 
    $stmt->bindParam(':time', $time, PDO::PARAM_STR); 
    $stmt->bindParam(':uid', $uid, PDO::PARAM_STR); 
    $stmt->bindParam(':admin', $admin, PDO::PARAM_INT, 1); 
    $stmt->bindParam(':message', $message, PDO::PARAM_STR); 

    /*** execute the prepared statement ***/ 
    $stmt->execute(); 

結果是:
只用MESSAGE_ID集和消息仍然與它的佔位符空項:mesagge

(message_id, timestamp, uid, admin, read, edited, message)  
15 | 0000-00-00 00:00:00 | 0 | 0 | 0 | 0 |:bericht 

有什麼不對的佔位符或INSERT查詢?

+0

你不需要在你的SQL中引用參數 - ':time'就是你需要的。 '':time''將包含':time'的字符串作爲值傳遞給數據庫,而不是創建佔位符 – andrewsi

+1

@andrewsi爲什麼不將它作爲答案發布? –

回答

1
$stmt = $db->prepare("INSERT INTO messages (message_id, timestamp, uid, admin, read, edited, message) VALUES ('',':time',':uid',':admin','','',':message')"); 

當您使用佔位符時,不需要引用它們。當你的SQL中有':time'時,它將一個字符串:time傳遞給數據庫。你的SQL應該像:

$stmt = $db->prepare("INSERT INTO messages (message_id, timestamp, uid, admin, read, edited, message) VALUES ('',:time,:uid,:admin,'','',:message)"); 

(編輯,基於IMSOP的評論)

你也不一定需要有領域在INSERT,如果有不添加任何數據。如果缺少一列,則將根據表的設計使用該列的默認值添加該行;如果沒有,則爲NULL。如果它是AUTO_INCREMENT字段,那麼它不應該在您的INSERT語句中,因爲它會導致問題。你不能在設置爲NOT NULL的字段上使用它,並且記住NULL和''是不同的值很重要,所以使用這將取決於你如何編寫其餘的代碼;但是你可以用代碼儘可能短:

$stmt = $db->prepare("INSERT INTO messages (timestamp, uid, admin, message) VALUES (:time,:uid,:admin,:message)"); 
+0

插入'''',插入'NULL',並省略語句中的列* *不等同。首先,''''和'NULL是不同的值;其次,省略列將使用列的DEFAULT值(如果已指定),並且如果不指定,則只返回到「NULL」(列允許爲NULL)。在Postgres中,一個自動增量字段在技術上只是一個'DEFAULT',它從'SEQUENCE'中提取下一個數字,這就是爲什麼通常需要忽略該列的原因。我同意你的建議,但重要的是要知道它實際上會做什麼。 – IMSoP