Php 函数,为什么要使用它?

Php 函数,为什么要使用它?,php,mysql,Php,Mysql,我是一个彻头彻尾的傻瓜,格式化字符串的想法对我来说并不清楚。为什么我要像下面的例子一样格式化我的字符串?请给出一个简短、清晰的答案,与手册中的答案不同,我不知道手册想说什么 $query=sprintf("SELECT COUNT(id) FROM users WHERE UPPER(username) = UPPER('%s')", mysql_real_escape_string($name)); 在您的特定示例中,您可以这样格式化字符串,以便将其传递到需要有效SQL的mysql

我是一个彻头彻尾的傻瓜,格式化字符串的想法对我来说并不清楚。为什么我要像下面的例子一样格式化我的字符串?请给出一个简短、清晰的答案,与手册中的答案不同,我不知道手册想说什么

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

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

编辑:作为@Joni注释,您确实不想使用sprintf来创建SQL语句。这是因为通常在执行此操作时,您无法简单地控制将sprintf添加到命令中的内容,这使得攻击者很容易注入您意想不到的内容。

我很清楚

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


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

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);
相信我,我记得那些日子,我花了很多时间试图破译wtf printf在其他人的代码中所做的事情,却被完全弄糊涂了。然后有一天它点击了一下,感觉用其他方式做起来要做很多工作


因为它使结果字符串看起来非常简单和清晰,并为您节省了大量显式转换和数据格式设置函数。比较:

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


我不知道你的情况,但是第一个版本让我眼冒金星。

你不会想用sprintf来做SQL语句的。你可能会想用事先准备好的陈述来代替。我不知道,我觉得这个问题很清楚;这将让您了解它的用途。因为它比使用字符串连接更具可读性。假设
$name
值为
user2534840
,则sprintf将返回
“从用户中选择COUNT(id)WHERE up(username)=UPPER('user2534840')”
$query
,这是一种动态准备SQL查询的技术,所以我可以删除sprintf,然后这样写$query=“SELECT COUNT(id)FROM users WHERE UPPER(username)=UPPER”,?@user2534840 yes,如果username不包含任何转义字符。注意,代码使用了非常重要的
mysql\u real\u escape\u string()
函数!我试过使用mysqli,但它不起作用。准备好的语句和绑定参数的能力,这两个是什么?@user2534840签出。这将帮助您理解。@user2534840甚至为
printf("Foo bar baz (%.2f) 'quotes'%d: %s", $num, $var, someFunction($baz));