我是一个总菜鸟,格式化字符串的想法对我来说并不清楚。为什么我要格式化我的字符串,如下例所示?请给出一个简短明了的答案,不像手册中那样,我不知道手册试图说的是什么。
$query=sprintf("SELECT COUNT(id) FROM users WHERE UPPER(username) = UPPER('%s')",
mysql_real_escape_string($name));
答案 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的日子里,在其他人的代码中完成了这些日子。然后它只是点击了一天,感觉还有更多的工作要做任何其他方式。
答案 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只猴子”
答案 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));
我不了解你,但第一个版本让我的眼睛流血。