php 5.2.17到php 5.4.4编码问题

时间:2014-03-04 15:59:31

标签: php

我在更新到php 5.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)."' ");

好的,在php 5.2.17上,我的mysql记录就像“áÃÃÃÃóú”

在php 3.4.4上我的mysql记录是这样的“áéíóú”

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

注意如果我不在PHP 5.4.4中将第三个参数添加到htmlspecialchars,我的字符串变为空(如果我改为UTF-8它也变空),在5.2.17中它没有问题就进入数据库。 / p>

1 个答案:

答案 0 :(得分:2)

我的有根据的猜测(鉴于您令人担忧的代码缺失)是您正在使用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

所以,对不起,我完全迷失了。如果您认为这个答案不合适,我很乐意删除这个答案。