我在更新到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>
答案 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 。
所以,对不起,我完全迷失了。如果您认为这个答案不合适,我很乐意删除这个答案。