代码之家  ›  专栏  ›  技术社区  ›  Pluda

php 5.2.17到php 5.4.4编码问题

php
  •  0
  • Pluda  · 技术社区  · 11 年前

    我在更新到php5.4.4时遇到问题,因为我的数据库记录在浏览器中显示错误。 我搜索过,很多人说他们必须对代码进行修复,但没有人说他们做了哪些修复。

    因此,由于我不是php专家,我在这里寻求帮助,以正确的方式指导我。

    我想要什么“”

    我已经

    <form id="editar" accept-charset="UTF-8" action="javascript:void(0)" method="post">
    

    在提交时,我的php会这样做

    $txt_edi = htmlspecialchars($_POST['text_to_edit'], ENT_QUOTES, 'ISO-8859-1');
    $query = $ligacao -> prepare("UPDATE mytable SET description = '".utf8_encode($txt_edi)."' ");
    

    好的,在php5.2.17上,我的mysql记录类似于“”

    在php3.4.4上,我的mysql记录如下“”

    所以我假设utf8_encode中发生了一些变化,否则我的记录在两个php转换中都是相同的。。。

    注意,如果我不在php5.4.4中的htmlspecialchars中添加第三个参数,我的字符串将变为空(如果我更改为UTF-8,它也会变为空),在5.2.17中,它将毫无问题地进入数据库。

    1 回复  |  直到 11 年前
        1
  •  2
  •   Álvaro González    11 年前

    我的猜测(考虑到你惊人的代码缺乏)是你正在使用 htmlspecialchars() 。该函数已将PHP/5.4中第三个参数的默认值从 ISO-8859-1 UTF-8 :

    编码

    从PHP 5.6.0开始, default_charset 值用作默认值。 在PHP 5.4.0中,UTF-8是默认值。5.4.0之前的PHP,默认使用ISO-8859-1。 虽然这个论点在技术上是可选的,但你是 强烈建议您为代码指定正确的值。

    解决方案:始终提供第三个参数。


    编辑:关于更新问题的一些随机想法

    应用程序(据称)使用ISO-8859-1,但您强制浏览器转换为UTF-8:

    accept-charset="UTF-8"
    

    当您收到表格时,您会将其处理为ISO-8859-1(实际上不是):

    htmlspecialchars($_POST['text_to_edit'], ENT_QUOTES, 'ISO-8859-1')
    

    最后,您将从假的ISO-8859-1转换为UTF-8:

    utf8_encode($txt_edi)
    

    …然后将不受信任的输入注入SQL语句:

    "UPDATE mytable SET description = '".utf8_encode($txt_edi)."' "
    

    …即使您的数据库类显然支持准备好的语句:

     $query = $ligacao -> prepare(...)
    

    此代码中的任何内容都不能说明原始问题中的问题( 显示 数据),但我的印象是,要么它在PHP/5.2中工作纯属偶然,要么数据库中的东西已经损坏(或两者都损坏)。

    在这一点上,我通常建议将所有内容都切换到UTF-8,并永远忘记编码和转换。但还有一个额外的问题:您转换为HTML 之前 存储在数据库中。

    所以,对不起,我完全迷路了。如果你认为这个答案不有用,我很乐意删除它。