2009-07-21 15 views
1

最終編集:私はこの疑問を新しい質問に要約し、簡略化しました。再度、感謝します!PHP関数が2回呼び出されました、面白い警告メッセージ

NEW:

は、あなたが私にこののあなたの意見を伝え、そしてあなたはそれを再作成することができた場合、おそらく見ることができます:

を現在、$ポスト> POST_CONTENT変数が含まれています

"before <img src="/path/to/valid_img.gif" /> after" 

このコードは、テーマheader.phpの先頭に配置されています。

------ Code -------- 
    1: $str = $post->post_content; 
    2: assert(isset($str)); 
    3: assert(is_string($str)); 
    4: echo $str; 
    5: $str = 'before <img src="/path/to/nonexistant.gif" /> after'; 
    6: assert(isset($str)); 
    7: echo $str; 
-------------------- 
これらの警告で

出力この...

------ Output ------ 
before <img src="/path/to/valid_img.gif" /> after 
before <img src="/path/to/nonexistant.gif" /> after 
-------------------- 

...

--- PHP Warnings --- 
PHP Warning: assert() [<a href='function.assert'>function.assert</a>]: Assertion 
failed in /path/to/header.php on line 2 
PHP Warning: assert() [<a href='function.assert'>function.assert</a>]: Assertion 
failed in /path/to/header.php on line 3 
-------------------- 

は、なぜ私は100%それが必要知っているときのassertは()を2回失敗した場合、4が正常に$ strをエコーラインでしょう成功?

変数$ strを設定または解除する際に壊れた画像srcとは何が関係していますか?ワードプレスバグ/奇妙?今すぐクレイジー一部

...ライン5-7は、このようにnonexistant.gifを排除し、コメントアウトされている

は、アサート()警告が表示されず、出力はまだこれを適切に作成します。.. 。

------ Output ------ 
before <img src="/path/to/valid_img.gif" /> after 
-------------------- 

あなたはこれを再現し、あなたの考えを教えてください。私はPHPを初めて使っていますが、私はこれが狂っていると確信しています。 :)

OLD:

私はPHPに比較的新しいだと私はこのコードを持っている:私は上記のコードを実行すると、それは罰金(FOO-ショートをやっている

$str = $post->post_content; // hi -- [hw] -- bye <img src="foobar.png" /> 
$str = core_wp('foo_shortcode', $str); 
echo $str; // return $str; produces the same warning message 
// If there is no echo or return, the warning message is not produced. 
// The warning disappears when I statically set (as object) the initial $str to 
// "hi -- [hw] -- bye <img src="foobar.png" />". 

作品それは仕事です)。出力は次のとおりです。

hi -- Hello World -- bye <img src="foobar.png" /> 

私はいつもの$ strが存在しない場合、そのFOO-ショートは約二時間を除いて、自身二度目を実行しようとしているように見える私に言って、この警告メッセージを、取得が。

catch ... $ strに存在しないsrcを指し示すHTML imgタグが含まれている場合にのみ、この警告メッセージが表示されます。

PHP Warning: Missing argument 1 for foo_shortcode() in ... 

そしてここでは、コア-WP()とFOO-ショート()である:

function core_wp($function, $a = NULL, $b = NULL) 
{ 
    $wrap = array 
    (
     'foo_shortcode'    => 'foo_shortcode', 
    ); 
    $args = array(); 
    if (isset($a)) $args[] = $a; 
    if (isset($b)) $args[] = $b; 

    return call_user_func_array($wrap[ $function ], $args); 
} 

function foo_shortcode($content) { 
    return str_replace('[hw]', 'Hello World', $content); 
} 
まず、なぜコード作業罰金が、その後、同時に自分自身をもう一度実行しようとするように思われる

$ strには無効なimgが含まれていますが、これはWordPressが$ post-> post_contentを生成する方法と関係があると思われます。

EDIT 1(ウェッズ、8:55 @ 7月22日)

は、私が(エラーログを追加しました)このようなあなたの指示に従って:

error_log('done1'); 
$str = $post->post_content; 
error_log('done2'); 
$str = core_wp('foo_shortcode', $str); 
error_log('done3'); 

...、それは私の誤りでこれを生産

[22-Jul-2009 08:52:49] done1 
[22-Jul-2009 08:52:49] done2 
[22-Jul-2009 08:52:49] PHP Warning: Missing argument 1 for foo_shortcode() in 
/home/path/to/header.php on line 23 
[22-Jul-2009 08:52:49] done3 

を...と、ブラウザ(正しく)に送られ、出力されました::ログイン

hi -- Hello World -- bye <img src="foobar.png" /> 

...警告メッセージが生成されました。

EDIT 2(ウェッズ、9:18午前@ 7月22日)

私は、この主張を試してみました:

59: $str = $post->post_content; 
60: assert(isset($str)); 
61: $str = core_wp('foo_shortcode', $str); 
62: assert(isset($str)); 

...とPHPログが示しています

[22-Jul-2009 09:16:55] PHP Warning: assert() [<a 
href='function.assert'>function.assert</a>]: Assertion failed in 
/home/path/to/header.php on line 60 
[22-Jul-2009 09:16:55] PHP Warning: Missing argument 1 for foo_shortcode() in 
/home/path/to/header.php on line 23 

。 ..しかし、出力は正しいですが、警告はまだ発行されています。

PHPは当初は$ str = $ post-> post-contentを設定していないようですが、core-wp( 'foo-shortcode'、$ str)を実行して「ああ! $ str = $ post-> post-content ... "を設定する必要がありますが、戻ってそれを設定し、正しいデータを出力します。

+0

ありがとうEineki、$ argsを配列として初期化しても、そのトリックはありませんでした。 – Jeff

+0

あなたは$ str = $ post-> post_contentですか? Nullとは何か違うものを評価する? – Eineki

+0

はい、100%確信しています。$ post-> post_contentに "hi - [hw] - bye "という文字列が含まれています。 – Jeff

答えて

1

代わり

$str = $post->post_content; 

のあなたはtemporarilly置く場合:

$str = 'some string you believe to trigger the error'; 

それでもエラーが発生しますか?もしそうなら、それは我々に確かにcore_wp()を見るように導く。そうでない場合は、$post->post_contentが原因である可能性があります。

EDITは:$post->post_contentがNULLであるかどうかを確認するには、次の行を追加します。

echo "post_content:"; 
var_dump($post->post_content); 
$str = $post->post_content; 

は、エラーが発生したときに、それがNULLだ場合、私たちは知ってみましょう。

EDIT2:$post->post_contentではないので、ではないので、投稿後すぐにコードの後に​​error_log("done");をお試しください。 「完了」の前後に警告が表示されますか?また、error_log()ステートメントを "functionname"と呼ばれる問題のすべての機能の先頭に追加し、それらが2回呼び出されているかどうかを判断するのに役立ちます。

+0

あなたが提案したものを正確に試したので、犯人は最も間違いなく$ post-> post_contentです。警告を出すテキストを含む静的な$ strを設定しました。これが私がとても混乱している理由です。私は次に何を確認するか分からない。 – Jeff

+0

これは$ post-> post_contentがNULLでなければならないと言います。 – Josh

+0

ちょっとジョシュ、私はPHPを初めて使っているので、正しい結果が返されても$ post-post_contentがNULLになることを説明できますか?それが私の主な質問です。 – Jeff

1

私はarrayと同じように$ argsを初期化しようと思います。 この問題はあなたの問題を解決します。

私は二重実行に関する何も言えません。投稿するコードはその責任を負いません。

+0

いいえ、私はテストしました問題はまだそこにあります。 $ str = $ post-> post_contentですか? Nullとは何か違うものを評価する? – Eineki

関連する問題