我是一個總noob和格式化字符串的想法不清楚給我。爲什麼我要像下面的例子那樣格式化我的字符串?請給出一個簡短明確的答案,不像手冊中的答案,我不知道手冊的內容。sprintf()函數,爲什麼使用它?
$query=sprintf("SELECT COUNT(id) FROM users WHERE UPPER(username) = UPPER('%s')",
mysql_real_escape_string($name));
我是一個總noob和格式化字符串的想法不清楚給我。爲什麼我要像下面的例子那樣格式化我的字符串?請給出一個簡短明確的答案,不像手冊中的答案,我不知道手冊的內容。sprintf()函數,爲什麼使用它?
$query=sprintf("SELECT COUNT(id) FROM users WHERE UPPER(username) = UPPER('%s')",
mysql_real_escape_string($name));
在您的特定示例中,您將格式化字符串,然後將其傳遞給期望有效SQL的mysql調用。當然還有其他的格式化命令的方法,但是sprintf
允許格式化更復雜而不增加代碼的複雜性。
編輯:作爲@Joni評論,你真的是不是想用sprintf來製作SQL語句。這是因爲通常在執行此操作時,您不能簡單地控制正在sprintf到您的命令中的內容,這使攻擊者很容易注入您沒有想到的內容。
所以我可以刪除sprintf並像這樣寫$ query =「SELECT COUNT (id)FROM users WHERE UPPER(username)= UPPER「,? – Orangutan
@ user2534840是的,如果用戶名不包含任何轉義字符。注意代碼使用重要的'mysql_real_escape_string()'函數。 –
我用mysqli嘗試過,它不起作用。編寫語句和綁定參數的能力,這兩者是什麼? – Orangutan
@ user2534840檢查[this](http://php.net/manual/en/pdo.prepared-statements.php)。它會幫助你理解。 – SeanWM
@ user2534840 [bindParam](http://php.net/manual/en/pdostatement.bindparam.php)甚至爲[數據類型]提供了第三個參數(http://www.php.net/manual/en/ pdo.constants.php) – SeanWM
sprintf根據格式化字符串格式返回格式化的字符串。
格式是:
string sprintf (string $format [, mixed $args [, mixed $... ]])
這裏您在查詢中使用「%s」的,以後你給它的價值。
例如:
<?php
$num = 5;
$location = 'tree';
$format = 'There are %d monkeys in the %s';
echo sprintf($format, $num, $location);
?>
輸出: 「有5只猴子在樹上」
因爲它的方式更容易閱讀[和寫]代碼如:
$query = sprintf(
"SELECT * FROM table WHERE id = %d AND name LIKE '%s' AND age > %d",
mysql_real_escape_string($id),
mysql_real_escape_string($name),
mysql_real_escape_string($age)
);
不是:
$query = "SELECT * FROM table WHERE id = ".mysql_real_escape_string($id)
." AND name LIKE '".mysql_real_escape_string($name)
."' AND age > " . mysql_real_escape_string($age);
相信我,我記得我花了試圖破譯跆拳道的printf天在別人的代碼,並要求完全糊塗做了。然後,它只需點擊一天,感覺就像做其他任何工作一樣。
哇,這是更好看,謝謝你的這個例子! – Orangutan
因爲這使得它非常簡單明瞭的結果字符串將是什麼樣子,併爲您節省了數顯式類型轉換和數據格式功能。比較:
echo 'Foo bar baz (' . number_format($num, 2) . ') \'quotes\''. (int)$var . ': ' . someFunction($baz);
與
printf("Foo bar baz (%.2f) 'quotes'%d: %s", $num, $var, someFunction($baz));
我不瞭解你,但第一個版本讓我的眼睛流血。
你不想使用sprintf來製作SQL語句。你會想使用預處理語句。 – Joni
我不知道,[docs](http://php.net/manual/en/function.sprintf.php)對我來說似乎很清楚。 – j08691
查看[sprintf]手冊頁上的一些示例(http://php.net/manual/en/function.sprintf.php);這會讓你瞭解它的用途。 –