2016-01-10 74 views
5

這是後形式:PHP PDO bindParam型管理

$funcname->name= htmlentities($_POST['name']); 
$funcname->insert(); 

這將是對類funcname的的功能插件,該插件將數據插入到名爲名稱列

$this->conn->beginTransaction(); 
$stmt = $this->conn->prepare("INSERT INTO nameTBL (name) values (:name)"; 
$stmt->bindParam(':name', $this->name, PDO::PARAM_INT); 
if ($stmt->execute()) { 
     $this->conn->commit(); //This will save your changes 
     $this->conn->exec('UNLOCK TABLES ' . self::$table_name); 
     header('Location: ../'); 
     exit(); 
} else { 
     $this->conn->rollBack(); //This will undo your changes 
     $this->conn->exec('UNLOCK TABLES ' . self::$table_name); 
     header('Location: ../'); 
     exit(); 
} 

現在問題是我已經設置PDO :: PARAM_INT哪些不應該允許字符,但只有整數爲什麼我能夠發佈文本到數據庫(表)?

是否有任何我可以高度限制bindParam的數據類型在這裏。

在此先感謝。

回答

1

你的代碼有幾處錯誤。

但是,我們來看看PDO::PARAM_INT,PDO::PARAM_STRPDO::PARAM_NULL正在告訴MySQL做什麼。

這些值告訴PDO如何處理處理的輸入,而不是不允許輸入。如果您發送文本,但該列爲int,則MySQL將嘗試將數據強制轉換爲int。它不會告訴你「你輸入了abcd,但期望值是整數」。在將數據傳遞給PDO之前,您必須自己進行檢查。

現在到其他問題:

  • 不要使用bindParambindParam接受參考的值。這適用於調用存儲過程時,並且變量應該根據過程的輸出進行修改。使用bindValue。如果你試着做下面有bindParam,它不會工作,你會得到一個錯誤:

    $stmt->bindParam(':my_column', 1, PDO::PARAM_INT); // It fails and yields an error

  • 不要鎖定表。您已經在使用事務,不需要鎖定表,MySQL爲您處理併發和訪問。

底線 - 使用PDO用於插入之前執行驗證PDO可幫助您根據連接信息(除其他外)清理輸入。它不會執行驗證。

+0

親愛的,但與bindParam我沒有得到任何錯誤,只是文本值進入數據庫,即使MySQL列的類型是文本在這裏它不應該執行該語句,因爲我已經設置PDO類型爲int。所以你的意思是我應該使用bindValue,哪一個更好更安全,或者兩者都是相同的? – user3286490

+0

'bindValue'和'bindParam'是不一樣的。兩者同樣「安全」,並且都將清理輸入以插入查詢。兩者都有類似的功能簽名。在你的情況下,你可以簡單地用'bindValue'切換'bindParam'。這兩個函數以不同的方式處理** 2nd **參數。如果你只做簡單的查詢(如果你從不調用存儲過程),那麼使用'bindValue'。如果該列是文本類型,則不要**使用「PDO :: PARAM_INT」。這不是它的工作原理,也不是爲了這個目的。如果你想要一個整數,在php中執行強制轉換(使用'(int)$ variable')。 –

+0

與$ stmt-> bindValue(':name',$ this-> name,PDO :: PARAM_INT); ,,,當我插入文本時,它會插入(0),而不是..?好嗎? – user3286490