2012-07-21 56 views
0

我一直在想如果綁定整個值的列表是好的做法。例如,我有以下查詢:php PDO - 你綁定所有參數嗎?

INSERT INTO messages 
    (thread_id,message,from_id,to_id,to_viewed,notified,from_deleted,to_deleted,created) 
    SELECT :threadId,:msg,:fromId,:toId,0,0,0,0,:createdTime FROM messages 
    WHERE thread_id = :threadId AND to_id=:toId LIMIT 1 

在這種情況下會有什麼也結合notifiedfrom_deletedto_deleted領域,因爲這是靜態值,始終爲0插入新的味精時,有意義嗎?


我需要修改我的問題。我知道,出於安全原因,沒有理由也綁定不是由用戶生成的字段/值。在我的情況下,沒有理由綁定文件notified,from_deletedto_deleted,因爲它們總是0.但我真正的問題是我應該爲其他原因(緩存)綁定這些字段。 mysql會緩存整個查詢語句還是隻綁定parms?

+0

你試圖運行哪個查詢?你有插入查詢的一部分,然後是不正確的選擇查詢 – 2012-07-21 08:16:06

+0

你爲什麼認爲這是不正確的?僅當thread_id與此用戶相關時,才使用此查詢來插入消息。在這種情況下,我不需要額外的查詢來驗證這個tread_id是否屬於這個用戶。 – user1324762 2012-07-21 08:39:00

+0

對。我沒有意識到這是一個子查詢 – 2012-07-21 08:48:48

回答

1

確實只需要像您說的那樣綁定來自外部源(您也應該去掉html字符,腳本)的變量的參數(準備好的查詢)。當您執行準備好的查詢時,PDO將轉換引號以防止sql注入。你可以直接將你的靜態變量放入查詢中,因爲你(開發人員)知道查找0或1是安全的,或者甚至是一些靜態字符串。剩下的只是一個語法正確的查詢。

您可以運行此查詢使用sequelpro,phpMyAdmin的,MySQL的CLI或任何其他SQL工具插入測試行(假設你正在運行的MySQL)

INSERT INTO messages 
    (thread_id,message,from_id,to_id,to_viewed,notified,from_deleted,to_deleted,created) 
    VALUES (1, 'Blah', 1, 2, 3, 0, 0, 0, '2012-07-21'); 

PDO實例

try { 
    $dbh = new PDO($dsn, $user, $password); 
    $sth = $dbh->prepare('SELECT * FROM messages WHERE thread_id = :threadId AND to_id=:toId LIMIT 1'); 
    $sth->execute(array(':threadId' => $id, ':toId' => $to_id)); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 
+0

不僅僅是用戶,來自任何你沒有直接控制的外部來源的數據應該被視爲敵對的。我有Web服務等。 – vascowhite 2012-07-21 08:15:49

+0

對。這就是我的意思 – 2012-07-21 08:17:06

+0

但是,準備好的查詢還有其他一些優勢,它們只與安全性無關嗎? – user1324762 2012-07-21 08:40:44