2012-05-06 190 views
6

我只是需要確保我已經正確地使用了PDO準備語句,下面的代碼是否會被SQL注入保護?PDO準備好聲明,正確使用?

$data['username'] = $username; 
$data['password'] = $password; 
$data['salt'] = $this->generate_salt(); 
$data['email'] = $email; 

$sth = $this->db->prepare("INSERT INTO `user` (username, password, salt, email, created) VALUES (:username, :password, :salt, :email, NOW())"); 
$sth->execute($data); 
+4

似乎沒問題。這樣可以防止SQL注入。這個問題更多的是codereview然後stackoverflow的東西。 – Arend

+0

完全同意,與@Arend。我會發佈一個跟進。 – Rob

+0

密鑰是否需要冒號前綴?正如'$ data [':username'] = $ username;' 請參見[PDOStatement :: execute()]中的示例2(http://www.php.net/manual/en/pdostatement.execute.php ) –

回答

7

是的,你的代碼是安全的。但是可以縮短:

$data = array($username, $password, $this->generate_salt(), $email); 

// If you don't want to do anything with the returned value: 
$this->db->prepare(" 
    INSERT INTO `user` (username, password, salt, email, created) 
    VALUES (?, ?, ?, ?, NOW()) 
")->execute($data); 
+0

如果你希望它更短,你可以像執行'$ sth = $ this-> db-> prepare(「INSERT INTO user(username,password,salt,email,created)VALUES(?,?,? ,?,NOW()「) - > execute($ data);':) – Rob

+1

呵呵,編輯後添加你的建議:-) –

+0

非常感謝。其實我總是傾向於鏈接很多代碼來縮短代碼長度。 :) – Rob

1

你可以用一個空數組就爲你們$data

// start with an fresh array for data 
$data = array(); 

// imagine your code here 

你的代碼看起來好爲止。

編輯:我錯過了你的NOW()電話。 Imho你應該加上一個綁定變量,就像

// bind date 
$data['created'] = date("Y-m-d H:i:s"); 

// updated prepare statement 
$sth = $this->db->prepare("INSERT INTO `user` (username, password, salt, email, created) VALUES (:username, :password, :salt, :email, :created)"); 
+1

爲什麼?這並沒有多大意義... – Shoe

+2

NOW()不是一個PHP函數,所以這會引發錯誤。如果你真的想使用PHP服務器的時間戳而不是數據庫服務器,你應該使用'date(「Ymd H:i:s」)'http://stackoverflow.com/questions/1995562/now-function-in -php – shanethehat

+0

你是完全正確的。 – Rob