我有一个 PHP 函数可以将数据保存到数据库。该数据包含ñ 和重音符号,并且该数据是从第三方页面中提取的。我尝试了很多方法,但它不起作用。
这是我的功能:
public function agregarProduct($name,$brand,$price){
$sql ="CALL spAddProduct('$name','$brand',$precio);";
$result= $this->_BD->query($sql);
$resultado->close();
$this->_BD->next_result();
}
我尝试过的是:
- 将标头放在指示 utf-8 的文件中。
- 我用过
$name = utf8_encode($name);
。 - 我也用过这个功能
mb_convert_encoding
。 - 我使用的另一个是
iconv(mb_detect_encoding($name, mb_detect_order(), true), "UTF-8", $name)
. - 我尝试将数据库排序规则更改为
utf8_general_ci
,utf8_spanish_ci
,uft8_default collation
. - 同样在我的连接中,我使用过
$BD->query("SET NAMES 'utf8'");
并且$BD->set_charset("utf8");
以上都没有在数据库中为我工作。因为,例如,如果它$name
出现在参数Maíz
中,它在数据库中保存为Maíz
,但如果我在屏幕上打印它,它看起来很好(玉米)。
我尝试默认放置$name
表单的值,$name = "Maíz";
以便将其正确添加到数据库中。
我发现的一个区别如下:
echo mb_detect_encoding($name = 'Maíz');
//esto devuelve UTF-8 y se ingresa correctamente a la BD
echo mb_detect_encoding($name); //$name viene como argumento de la funcion.
//esto devuelve ASCII y se ingresa con los caracteres raros
有了这个观察,我想看看它在使用函数更改变量时返回了相同的函数utf8_encode
,mb_convert_encoding
并且iconv
所有的结果都是ASCII
。
我还能如何解决这种情况?
问题
很高兴您在提问之前检查了所有字符编码(数据库编码、PHP 等)并且您使用的是 UTF-8。因此,更容易看到您正在接收带有HTML 实体(如
á
、í
等)的数据。直接从 HTML 中提取,并且它不是编码错误。此外,您肯定会在屏幕上很好地看到它,因为浏览器本身会相应地向您显示它。解决方案
要解码(获取相应字符)HTML 实体,我们使用html_entity_decode函数。
代码
这样,我们就可以将它用于您从服务器接收到的所有数据。在您的示例中
$name
:安全提示:您使用的代码存在严重的安全问题。请阅读如何使用准备好的语句来构建查询,始终使用改进
mysqli
的MySQL 扩展。连接到服务器后,只需输入一行,如下例所示:
从这里您已经可以放置您的查询和您想要使用的其他内容
注意:我的 mysql 字段是带有排序规则的文本
latin1_swedish_ci
。另一种选择是,你用
utf8_decode()
,你用utf8_encode()
。例如例如,您在输入中输入的内容(stork -> 有 Ü 和 Ñ)您将其保存在变量中。然后在 sql 查询中使用此变量之前,将 utf8_decode() 应用于它。例如 $variable = utf8_decode($variable);
在保存到数据库之前(未指定整理),您可以将字符转换为 HTML 实体
然后在 php 文件中,添加以下标头
这样,就无需在可视化数据之前再次转换数据。