2012-06-18 30 views
4

参数太少,我得到了错误为什么我得到:警告:printf()函数在PHP

Warning: printf() [function.printf]: Too few arguments 

望着我看到的代码:

function twentyten_posted_on() { 
    printf( 
     sprintf('<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>', 
      get_permalink(), 
      esc_attr(get_the_time()), 
      get_the_date() 
     ) 
    ); 
} 

出了什么问题?

回答

6

printf()sprintf()功能是相同的;他们的行为唯一的区别是一个是陈述(它做某事),另一个是函数表达式(它评估为某事)。 (请参阅this StackOverflow answer以获取有关区别的说明。)它们都采用格式作为第一个参数,然后将零个或多个其他参数作为格式字符串中特殊字符的替换字符串。

您的sprintf()功能正常。你已经为你的格式字符串编号,你有替换字符串作为参数来匹配格式字符串。一切都很好。

但请考虑printf()函数正在做什么。它得到一个字符串,恰好是sprintf()的输出。如果sprintf()包含%字符,则printf()需要替换字符串,该字符串不包含在您的代码中。

正如其他人所说的,你可能会忽略代码中的sprintf()。但你也应该明白为什么会发生这种情况。

例如:

$fmt = "%%d\n"; 
printf($fmt); 
printf(sprintf($fmt)); 
printf(sprintf($fmt), "Hello world"); 

第一个printf作品,并打印 “%d”。第二个printf失败,因为它的格式字符串意味着它应该有一个替换字符串,但没有提供。第三个输出一个零,因为当你试图评估“Hello world”为十进制整数(%d)时,这就是你得到的。

看看你的变量,你可能会发现至少有一个变量有一个%字符。

+0

+1尼斯文档.... :) – Baba

-2
sprintf('<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>', 
      get_permalink(), 
      esc_attr(get_the_time()) 

在这里,您拨打的sprintf有两个参数,当你有三个占位符,%1$s%2$s%3$s

如果你要打印你可以离开的sprintf出来的:

printf( 
    '<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>', 
     get_permalink(), 
     esc_attr(get_the_time(), 
     get_the_date() 
); 
+0

有3个参数。我数了它们。 –

0

你,如果你想从字面上使用它们,或者使用过程中的的printf切莫%字符的两倍。

+1

替换参数在sprintf函数上。如果他将%字符翻倍,那么他将没有用于替换sprintf的格式化字符。 – ghoti

+0

你是对的......无论如何,你给出的答案比我的要好得多,谢谢! –

+0

我看格式化程序没有错,但是这个输入可能会引入%。这就是为什么一个formater应该被用作格式化器而没有别的。切勿在formater中使用输入数据。 –

0

不要在格式化程序中使用输入数据。

printf("%1$s", calculated input value);

另外从安全角度来看,以及观点的错误点。格式是你的代码的一部分(不只是数据)。如果允许它从输入派生,则代码的任意用户可以影响其执行。

相关问题