2012-06-18 60 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);

另外從安全角度來看,以及觀點的錯誤點。格式是你的代碼的一部分(不只是數據)。如果允許它從輸入派生,則代碼的任意用戶可以影響其執行。

相關問題