sprintf()函数,为什么要使用它?

时间:2013-07-04 17:41:56

标签: php mysql

我是一个总菜鸟,格式化字符串的想法对我来说并不清楚。为什么我要格式化我的字符串,如下例所示?请给出一个简短明了的答案,不像手册中那样,我不知道手册试图说的是什么。

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

5 个答案:

答案 0 :(得分:2)

在您的特定示例中,您将格式化字符串,以便您可以将其传递给需要有效SQL的mysql调用。当然还有其他格式化命令的方法,但sprintf允许格式化更复杂,而不会增加代码的复杂性。

编辑:正如@Joni评论,你真的想要使用sprintf来制作SQL语句。这是因为通常在执行此操作时,您无法简单地控制sprintf到命令中的内容,这使得攻击者很容易注入您不期望的内容。

答案 1 :(得分: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);

相信我,我记得我花在试图破解wtf printf的日子里,在其他人的代码中完成了这些日子。然后它只是点击了一天,感觉还有更多的工作要做任何其他方式。

Read the docs.

答案 2 :(得分:0)

docs对我来说很清楚。

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

它允许您指定所需的格式。对于您提供的示例,它实际上不是一个很好的方法。您可能希望使用支持预准备语句的pdo或mysqli以及绑定参数的功能。

答案 3 :(得分: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

答案 4 :(得分:0)

因为它使得结果字符串看起来非常简单明了,并为您节省了许多显式的强制转换和数据格式化功能。比较:

echo 'Foo bar baz (' . number_format($num, 2) . ') \'quotes\''. (int)$var . ': ' . someFunction($baz);

VS

printf("Foo bar baz (%.2f) 'quotes'%d: %s", $num, $var, someFunction($baz));

我不了解你,但第一个版本让我的眼睛流血。