-1

I am a total noob and the idea of formatting strings is not clear to me. Why would I want to format my string like the one in the example below? Please give a short, clear answer, not like the one in the manual, I have no idea what the manual is trying to say.

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

5 回答 5

2

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

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

于 2013-07-04T17:45:21.113 回答
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 在其他人的代码中所做的那些日子,并且完全感到困惑。然后它只是点击了一天,感觉要以其他方式完成它需要做更多的工作。

阅读文档。

于 2013-07-04T17:48:00.870 回答
0

文档对我来说很清楚。

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

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

于 2013-07-04T17:46:21.733 回答
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

于 2013-07-04T17:46:52.267 回答
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));

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

于 2013-07-04T17:48:05.920 回答