遇到撇号时,工具提示被破坏


Tooltip is broken when encountering apostrophe

我想显示图像的link s,它们的title属性来自MySQL数据库:

for ($i=0; $i<$ret['cnt']; $i++)
{
    $html .= "<td width='15'><a href='" . HTTP_MAIN . $ret[$i]['menu_url'] . "?action=".$ret[$i]['menu_action']."'><img src='" . HTTP_ICONES . $ret[$i]["menu_icone_img"] . "' title='".$ret[$i]["menu_icone_title"] . "' width='12' height='12'></a></td>";
}

正如您所看到的,title属性来自$ret[$i]["menu_icone_title"]。以下是查询:

$sSQL = "SELECT menu_icone_img, menu_icone_title, menu_url, menu_action
                FROM menu 
                WHERE menu_icone_flag = 1
                ORDER BY menu_icone_ordre";
        $this->db->query($sSQL) ;
        $ret['cnt'] = $this->db->num_rows();
        $i = 0;
        while ( $this->db->next_record() ) {
            $ret[$i]["menu_icone_img"]  = stripslashes($this->db->f('menu_icone_img'));
            $ret[$i]["menu_icone_title"] = stripslashes($this->db->f('menu_icone_title'));
            $ret[$i]["menu_url"]    = stripslashes($this->db->f('menu_url'));
            $ret[$i]["menu_action"] = stripslashes($this->db->f('menu_action'));
            $i++;
        }

问题是当"menu_icone_title"列内部有撇号时,如Initialisation des niveaux d'activités

因此在运行时工具提示被破坏:Initialisation des niveaux d

那么如何显示所有文本呢?

只替换:

$ret[$i]["menu_icone_title"]

通过

str_replace("'","'''",$ret[$i]["menu_icone_title"]);

HTML实际上应该在任何PHP之外。例如

<?php 
function cleantext ($string) {
  return htmlentities($string);
}
for ($i=0; $i<$ret['cnt']; $i++)
{
    ?>
    <td width="15">
       <a href="<?php echo HTTP_MAIN . cleantext($ret[$i]['menu_url']); ?>?action=<?php echo $ret[$i]['menu_action'];?>">
         <img src="<?php echo HTTP_ICONES . cleantext($ret[$i]["menu_icone_img"]); ?>" title="<?php echo cleantext($ret[$i]["menu_icone_title"]); ?>" width="12" height="12" />
       </a>
    </td>
  <?php
}
?>

它使您的代码可读性更强/更易于维护。

我还为任何输出添加了一个函数,它将为您清理输出。目前,这个函数所做的只是对字符串执行htmlentite,但如果需要,您可以很容易地扩展它。