插入数据库时是不是没有用 addslashes() 啊?

解决方案 »

  1.   

    to:alexxing    用了这个函数。不过它不能完全的原样显示,    只有一些空行。空段而已。    不知你试过没有。如果全是输入的英文的话。根本就是一行。
      

  2.   

    进库的时候不用替换任何字符,也不用addslashes函数,因为php默认已经加了。显示的时候先用htmlspecialchars,然后替换空格为&nbsp;替换\n为<BR>不过还是有些问题
      

  3.   

    这个根本就是输入文章时候能否实现所见即所得的问题嘛.分几种情况啦,一是在中文文章中,如果不使用html,那么基本可以把所有\r\n换为<br>,然后把空格换成&nbsp;,把特殊字符也替换.这样基本可以完全和输入的效果相同.
    如果文章使用html,那么就要复杂点.而且现在我所知的方法都不能完全实现100%的所见即所得的恢复.我现在用的方法是进库的时候转换为html,然后编辑的时候把html转换(把空格回车和特殊字符转换回来).下面的是我使用的转换函数.
    finput()是进库的时候把文章转换为html的,使用finput($string,1)就是系统允许文章使用html的时候用的过滤函数.
    foutput是把html的文档转换回textarea中供编辑用的函数.
    最后那个是finput的辅助函数.function finput($str,$withhtml=0){
    if(!$withhtml){
    $str=htmlspecialchars($str);
    $str=str_replace(" ","&nbsp;",$str);
    $str=str_replace("\r\n","<br>",$str);
    }else{
    $str=str_replace(" ","&nbsp;",$str);
    $str=str_replace("\r\n","<br>",$str);
    $str=preg_replace_callback("/(<)(.*)(>)/iU",repspace,$str);
    $str=ereg_replace(">(<br>| )+(<[/]?[^<>]+>)",">\\2",$str);
    }
    return $str;
    }function foutput($str,$mode=0){
    $str=str_replace("&nbsp;"," ",$str);
    $str=str_replace("<br>","\r\n",$str);
    if($mode==0){
    $str=str_replace("&amp;","&",$str);
    $str=str_replace("&lt;","<",$str);
    $str=str_replace("&gt;",">",$str);
    $str=str_replace("&quot;","\"",$str);
    $str=str_replace("&#039;","\'",$str);
    }
    return $str;
    }function repspace($array){
    return $array[1].preg_replace("/&nbsp;/iU"," ",$array[2]).$array[3];
    }
      

  4.   

    同意楼上的楼上的入库转换的话,会增大数据库,而且有时候取数据的时候用到substr等函数的时候还可能会出问题。
    所以建议出库的时候再转换
      

  5.   

    我觉得要是每次出库的时候都转换一次效率太低了.
    如果一个文章被读取10000那么就要被转换10000次...简直就是浪费CPU资源嘛。
    对于数据库增大,其实根本就大不了多少,最多就是空格和回车(空格多了4个字符,回车多了2个字符...)只要算算一篇文章下来文字和特殊字符的比值就知道这个值几乎可以忽略了。
    用substr函数的问题也只要在处理的时候先把文章反转换在处理就好了。
    我建议先转换再入库好。
      

  6.   

    如果在繁体或者简体页面中输入简体或繁体,用html转换就会就会成为乱码。不转换倒不会
      

  7.   

    打个比方,你在一个繁体页面的文本框中输入简体,会将部分中文转换为&#21323之类的编码,如果你用htmlspecialchars转换,就将其中的&也转换了,那不就成了乱码?再说如果某些字段需要显示一部分,那就要用到substr或者mb_substr来截取,这样就完全有可能将...&nbsp;截取成为...&nb....,人家看得懂吗?
      

  8.   

    第一个问题比较麻烦,但是好像没很少机会会遇上这种情况吧,我做了N个客户的文章更新系统,还没遇到过这种问题,就算遇到其实也可以有办法解决,比如我不用htmlspecialchars,而直接用str_replace()转换我需要的字符,因为其实不是所有字符都有转换的必要的。
    第二个问题,到这种情况的时候,只要先把&nbsp;等字符先转换回来就行。一般使用这种东西的是在列文章标题的时候用得多吧。文章的标题比起正文少了N倍,要对文章标题的反转换花费的运算量也比对正文进行正转换花费的运算量少很多吧。算下来这种情况也应该入库前先转换。
      

  9.   

    第一个问题那不是解决办法,因为你不转换&就不会出现乱吗显示问题,但是截取字符串还是不可避免会出现问题。完全有可能将&#22223从中间分开。
    对于第二个问题,你入库的时候转,出库的时候也转,不觉得麻烦吗?正文如果长了,而且很多都是html之类的代码,如果转换的话,要增长很多
      

  10.   

    但是不转换&的话,&quot;就会显示成",等等类推。看看楼主的要求,要完全一样
      

  11.   

    这就不是了,在文本框中出库我们要把"<>等字符转换,"要转换为&quot;。&会被转为&amp;(如果没记错的话),如果不转&和上面说得有什么关系?
    把&quot;转换为"只是反转换文字到文本框中的情况而已嘛。
    况且,如果真的存在这个问题,用正规表达式实现判断性转换也很简单嘛。因为所有unicode都是&#开头的。
      

  12.   

    转&的话,就会将&#23232之类的转成乱码
    不转的话,我如果输入&quot;,那将来就会显示成"你能同时都解决吗
      

  13.   

    打个比方,我在繁体页面里面输入很多简体,然后中间输入一些&quot; &amp; &lt; &gt;之类的,你能全部回显正常吗?注意是繁体页面如果能,将代码帖出来
      

  14.   

    我这里没有测试的环境,以下语句你试试能不能用咯.
    方法1:
    <?
    $input="&amp;&#23232;&lt;";
    echo $input."<br>";
    $input=ereg_replace("&([^#])","&amp;\\1",$input); //把所有&转换但是对&#就不转换.
    echo $input;
    ?>
      

  15.   

    你也太有针对性了要是别人输入&#23232之类的呢,我说的&gt;等只是打个比方而已。
      

  16.   

    你这种纯粹是在找bug嘛,其实做每样事情都有个精度要求,达到某种精度就够了,做多了就是浪费资源.
    我给别人做AD-DA转换,要求转换的精度就是8位,你给客户做,只要达到8位精度就可以了,要是做多1位精度,成本就要上升,客户还叼你.
    这里也是这种情况,你要考虑一下有多少人在输入的时候会出现这种问题,起码我在做了几十个企业的这种文章输入系统,还没有客户因为这个问题而投诉过.
    如果你说一点要没这种bug,也可以阿,我就不信不能把这种转换的语句一一都写出来,就好像滤波器一样而已嘛,一个一个频段滤波,肯定可以把需要的东西过滤出来,只是成本问题.
    我觉得这个问题再讨论下去也没什么意思了,说了这么多,该不该转换大家心里也有个底.反正最重要还是要看具体需求.
      

  17.   

    你可以在写入Mysql前,把所有的\n转成<br>,或者是在读出时,用
    $msgs=explode("\n",$msg);
    while(list($key,$val)=$msgs){
    echo $val;
    }