0

現在、データベーステーブルから次のコードを取得しています。

<h1 class="widgetHeader">My Friends</h1>
<div class="widgetRepeater">            
    <p class="widgetHeader">Random Selection</p>
<?php 
    $friends = $user->getFriends(); 
?>
    <p class="widgetContent">
<?php 
        for ($i=0; $i<count($friends);$i++) { 
            $friend = $friends[$i]; 
?>
                <span class="friendImage" style="text-align:center;">
                    <?php print $friend->username; ?>
                </span> 
<?php 
        }
?>      
    </p>

</div>

ここで、php で eval 関数を使用しようとしましたが、予期しない '<' という解析エラーが発生します。出力バッファ メソッド (ob_start) も使用してみましたが、成功しませんでした。エラーを出さずにこのコードを評価する方法についてのアイデアはありますか?

注: データベース コードは、 という変数に格納されます$row['code']

4

3 に答える 3

4

PHP eval 関数は、HTML ではなく、PHP コードがパラメーターとして実行されることを想定しています。DB 値を PHP の終了タグと開始タグで囲みます。

eval('?>' . $row['code'] . '<?php');
于 2010-01-17T11:53:09.187 に答える
3

評価=悪!

特に、評価されたコードがデータベースからのものである場合... 1 つの mysql インジェクション = 完全な php 実行 = 完全な制御。

代わりに、いくつかのプレースホルダーを使用して置き換えます (他の優れたテンプレート システムが行うように)。

これをデータベースに保存できます:

<h1 class="widgetHeader">My Friends</h1>
<div class="widgetRepeater">            
    <p class="widgetHeader">Random Selection</p>
    {%friendstemplate%}
</div>

次に、プレースホルダーを必要なコンテンツで str_replace します。あなたの例では、次のように友人ごとにサブテンプレートも追加します。

<span class="friendImage" style="text-align:center;">
    {%username%}
</span>

...ループして {%friendstemplate%} に挿入できます。

于 2010-01-17T12:37:53.420 に答える
0

evalマークアップ コードでは使用できません。コードを一時ファイルに保存して含めることができるようにするか、次のようにコードを書き直してマークアップにならないようにします。

print "<h1 class=\"widgetHeader\">My Friends</h1>";
print "<div class=\"widgetRepeater\">";
print "<p class=\"widgetHeader\">Random Selection</p>";
$friends = $user->getFriends(); 
print "<p class=\"widgetContent\">";
for ($i=0; $i<count($friends);$i++) { 
   $friend = $friends[$i];
   print "<span class=\"friendImage\" style=\"text-align:center;\">";
   print $friend->username;
   print "</span>";
}
print "</p>";
print "</div>";
于 2010-01-17T11:57:07.320 に答える