2011-01-08 147 views
7

我發現這在一些代碼示例,而谷歌搜索:這是什麼意思?

$sql = 'INSERT INTO users (username,passwordHash) VALUES (?,?)'; 

它是新的給我,但我猜想,這一個替代方法和相當於

$sql = "INSERT INTO users (username,passwordHash) VALUES ($username,$passwordHash)";` 

$sql = 'INSERT INTO users (username,passwordHash) VALUES (' . $username . ',' . $passwordHash . ')';` 

會是正確的嗎?這是一個實際的PHP語法,還是他只是想簡化他的例子?


感謝您的反饋,人們

回答

12

這是prepared statements很常見的。該?只是作爲一個佔位符,從PHP文件如下所示:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); 
$stmt->bindParam(1, $name); 
$stmt->bindParam(2, $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
+6

此外,很少需要``> bindParam`列表。你可以簡單地用` - > execute(array($ name,$ value))``調用所有參數。 – mario 2011-01-08 06:48:59

2

它是不一樣的。問號用於準備好的語句查詢。這些基本上允許您多次運行相同的查詢,而只讓系統解析查詢一次。

4

問號是準備好的SQL語句中值的佔位符 - 並且是針對SQL Injection Attacks的重要保護。除非每個用戶都將他們的名字用引號*括起來,並將密碼散列用引號引起來,否則第一種方法將無法正常工作。你的第二個選擇很容易受到SQL注入攻擊。

使用佔位符時,您在執行SQL時傳遞佔位符的值。

* Tim O'Reilly知道他真的必須鍵入「'Tim O''Reilly'」。