2011-09-07 86 views
3

mysqli php庫中,在bind_param()方法中,將參數綁定到查詢。 bind_param()的第一個參數是types,這是一個字符串,其中每個字符表示數據類型pass,例如,'s'表示字符串。使用mysqli來防止sql注入,如何設置NULL或CURRENT_DATE?

 
    $query = "update users set update_usr_id = ? where user_id = ?"; 
    $arg1 = ($update_usr_id=$usr_id) ? '2011-01-01' : 'CURRENT_DATE'; 
    $arg2 = $update_usr_id; 

如何將NULL或CURRENT_DATE表示爲參數?

例如,嘗試'CURRENT_DATE'作爲字符串,但發佈爲「0000-00-00」。 (據我可以告訴「0000-00-00」,一個非法的日期,對於不使用NULL的人來說,它是一個用於NULL的mysqlism,這顯然是相當多的)。

使用參數,如何使用NULL和CURRENT_DATE?


@Johan指出,NULL 工作。在測試中,這似乎是真實的,但不是。會發生什麼情況是,從第一個NULL參數開始,所有參數都設置爲NULL!

默認值與此無關。有很多次我希望在UPDATE中將列設置爲NULL或CURRENT_DATE - 而不是INSERT - 因此默認值在事務中不起作用。

另外,編寫觸發器以覆蓋mysqli的不足之處的想法是相當不好的編程 - 在我的日子裏寫了意大利麪條觸發器,我是一個可以說話的人。觸發器更新日誌是一回事 - 像這樣的觸發器將會是一個持續的維護噩夢,而代碼幾乎不會被正確維護。

+1

與其試圖在您的PHP代碼中執行此操作,不如設計數據庫模式更好,以便這些值是給定列的默認值。那樣你所需要做的只是不提供你的php代碼中的數據。 – shawty

+0

由於兩個原因不起作用:第一,如果試圖更新現有值,第二,只要值可能爲空,就不得不提供兩個(或多個)完全不同的查詢。 –

回答

0

mysqli參數有限且難以使用。它們不僅不接受NULL和像CURRENT_DATE這樣的內部函數作爲參數,每個參數都通過引用傳遞。 (這意味着需要爲每個參數創建一個參數 - 這對INOUT過程參數或SELECT INTO可能是必需的,但對於正常的dml只是浪費時間。)最重要的是,它們顯然不會被會話存儲或db以使後續調用更有效。 (比較Postgres預先準備好的語句,例如,這個語句被命名並且我被重用(儘管只在會話級別)。這意味着數據庫不需要重新講授聲明;這也意味着該語句已經「計劃好」,所以不僅語義學,而且執行計劃被學習和重複使用以提高速度。)

目前正在爲MySQL編寫一些東西,我希望它實際上可用。稍後將發佈。

1

如果您想要一個默認參數,您可以在數據庫模式中指定一個默認參數。
對於current_date,您需要將數據類型設置爲timestamp而不是date,這樣MySQL會在丟失數據時自動將now()插入字段。

,或者如果你想通過null剛纔設置的VAR爲null創建觸發器

DELIMITER $$ 

CREATE TRIGGER BEFORE INSERT ON FOR EACH ROW 
BEGIN 
    IF new.mydate IS NULL THEN SET new.mydate = NOW(); 
END $$ 

DELIMITER ; 

$var = null; 

鏈接
http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html

+0

由於兩個原因而不起作用:首先,如果嘗試更新現有值,其次,必須提供兩個(或多個)完全不同的查詢,只要值可能爲空即可。 –

+0

設置爲NULL _does_正常工作,甚至設置爲NULL,而不是整數 - 我的報告不正確。謝謝! –

+0

實際上,設置爲NULL確實不工作。如果它是最後一個參數,則它設置爲空;但如果沒有最後一個參數,它和它後面的所有參數都設置爲NULL –