数据库中存储的HTML / PHP字符串在检索和回显时不会进行评估

时间:2015-04-17 16:29:11

标签: php html

这是存储在数据库中之前的HTML / PHP:<li><a href="<?= dots('duo/'); ?>"><?= $item->item['Manufacturer']; ?></a> <span class="divider">|</span></li>

这是存储在数据库中的HTML / PHP:

&lt;li&gt;&lt;a href=&quot;&amp;lt;?= dots(&#39;duo/&#39;); ?&amp;gt;&quot;&gt;&amp;lt;?= $item-&amp;gt;item[&#39;Manufacturer&#39;]; ?&amp;gt;&lt;/a&gt; &lt;span class=&quot;divider&quot;&gt;|&lt;/span&gt;&lt;/li&gt;

我将此结果分配给变量:

$crumbles = $details['Crumbs'];

我如此回应结果:

<?php echo html_entity_decode($crumbles); ?>

但是当我查看源代码时会返回此信息。它没有评估字符串中的任何PHP。

<li><a href="&lt;?= dots('duo/'); ?&gt;">&lt;?= $item-&gt;item['Manufacturer']; ?&gt;</a> <span class="divider">|</span></li>

它在浏览器中显示为<?= $item->item['Manufacturer']; ?> |

如何让它来评估PHP以及正确显示html?

编辑:这是处理数据库输入的代码。它序列化表单数据(url,crumbs,meta info等)并将其添加到ajax队列。

$("form#seo_add").submit(function(e) {
    console.log(this);
    var data            = $(this).serializeArray(),
        $commitBtn      = $(this).find("button"),
        form_incomplete = false,
        queueData       = ['seo_add', data];

触发后,队列控制器运行$this->seo->add($seo_add, $user); 其模型如下:

function add($data = null, $username = null) {
    if (!is_array($data) || is_null($username)) die("Expecting new pageinfo");

    //if a single item is being inserted, add it to a parent array so iteration works
    if (!is_array($data[0]))
    {
        $data = array($data);
    }

    foreach ($data as $key => $page)
    {
        if (isset($page['section'])) unset($page['section']);
        if (isset($page['action'])) unset($page['action']);

        $add = $this->db->insert('pageinfo', $page);


        $page = array_merge(array('id'=>$this->db->insert_id()), $page);

        $last_queries[$key]['type'] = 'seo_add';
        $last_queries[$key]['html'] = "New page: <b>" . $page['page'] . "</b>";
        $last_queries[$key]['data'] = $page;
    }

    if ($this->db->_error_message())
        $this->db_error('Unable to insert page');

    return log_changes($last_queries, $username, $this->site);
}

2 个答案:

答案 0 :(得分:1)

我建议使用占位符。

$html = '<li><a href="[href]">[item]</a> <span class="divider">|</span></li>';

我建议不要保存html编码。我猜你会这样做:

$html = str_replace(['href','item'],[dots('duo/'),$crumbles],$html);

如果用户输入的话,你可能需要编码$ crumbles或dots('duo /')。

答案 1 :(得分:1)

您的PHP标记在您的PHP标记&amp;lt;上进行了双重编码,因此您可以在其上运行html_entity_decode两次。

即使您的php标签已被解码,它们也永远不会被PHP解释,因为您可以立即回复它们,解决这个问题的方法是运行数据库通过eval返回的内容,如下所示:< / p>

$crumbles = html_entity_decode(html_entity_decode($crumbles), ENT_QUOTES);
eval("?>{$crumbles}<?");