2013-07-04 74 views
-1

我是一個總noob和格式化字符串的想法不清楚給我。爲什麼我要像下面的例子那樣格式化我的字符串?請給出一個簡短明確的答案,不像手冊中的答案,我不知道手冊的內容。sprintf()函數,爲什麼使用它?

$query=sprintf("SELECT COUNT(id) FROM users WHERE UPPER(username) = UPPER('%s')", 
    mysql_real_escape_string($name)); 
+10

你不想使用sprintf來製作SQL語句。你會想使用預處理語句。 – Joni

+0

我不知道,[docs](http://php.net/manual/en/function.sprintf.php)對我來說似乎很清楚。 – j08691

+0

查看[sprintf]手冊頁上的一些示例(http://php.net/manual/en/function.sprintf.php);這會讓你瞭解它的用途。 –

回答

2

在您的特定示例中,您將格式化字符串,然後將其傳遞給期望有效SQL的mysql調用。當然還有其他的格式化命令的方法,但是sprintf允許格式化更復雜而不增加代碼的複雜性。

編輯:作爲@Joni評論,你真的是不是想用sprintf來製作SQL語句。這是因爲通常在執行此操作時,您不能簡單地控制正在sprintf到您的命令中的內容,這使攻擊者很容易注入您沒有想到的內容。

+0

所以我可以刪除sprintf並像這樣寫$ query =「SELECT COUNT (id)FROM users WHERE UPPER(username)= UPPER「,? – Orangutan

+0

@ user2534840是的,如果用戶名不包含任何轉義字符。注意代碼使用重要的'mysql_real_escape_string()'函數。 –

0

docs對我來說很清楚。

返回根據格式化字符串格式生成的字符串。

它允許您指定所需的格式。對於你提供的例子來說,這並不是一個好辦法。你會想使用支持預處理語句的pdo或mysqli以及綁定參數的能力。

+0

我用mysqli嘗試過,它不起作用。編寫語句和綁定參數的能力,這兩者是什麼? – Orangutan

+0

@ user2534840檢查[this](http://php.net/manual/en/pdo.prepared-statements.php)。它會幫助你理解。 – SeanWM

+0

@ user2534840 [bindParam](http://php.net/manual/en/pdostatement.bindparam.php)甚至爲[數據類型]提供了第三個參數(http://www.php.net/manual/en/ pdo.constants.php) – SeanWM

0

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只猴子在樹上」

更多的瞭解,請參閱:http://php.net/manual/en/function.sprintf.php

1

因爲它的方式更容易閱讀[和寫]代碼如:

$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天在別人的代碼,並要求完全糊塗做了。然後,它只需點擊一天,感覺就像做其他任何工作一樣。

Read the docs.

+0

哇,這是更好看,謝謝你的這個例子! – Orangutan

0

因爲這使得它非常簡單明瞭的結果字符串將是什麼樣子,併爲您節省了數顯式類型轉換和數據格式功能。比較:

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)); 

我不瞭解你,但第一個版本讓我的眼睛流血。

相關問題