【问题标题】:Why are special characters being jumbled when my HTML form is submitted to a PHP script?当我的 HTML 表单提交到 PHP 脚本时,为什么特殊字符会混乱?
【发布时间】:2011-09-22 20:58:22
【问题描述】:

基本上,我有一个表格,餐馆老板可以填写该表格(除其他事项外)要求提供公司名称。

如果输入类似 "Foobar Café" 的内容,它会以 "Foobar Café" 的形式存储在 MySQL 数据库中。为什么这样做?

HTML 页面和数据库表都设置为 UTF-8 编码(“business_name”字段的排序规则为“utf8_unicode_ci”)。这不应该照顾一切吗?究竟是什么原因导致特殊字符 "é" (&etilde;) 在数据库中存储为 "é"?没有意义。

【问题讨论】:

  • 如果您向前端用户显示相同的内容,它将完美显示。出于某种特定原因,您是否希望它们以精确的波浪线/尖线存储在数据库中?
  • 你试过调试PHP吗?让 AJAX 返回 POST/GET 变量并检查它在 firebug 中的内容。这会给你一个提示,它是发生在 HTML 和 PHP 之间,还是发生在 PHP 和数据库之间。
  • 在表单“action”属性调用的PHP页面上,我直接回显了POST的内容,它正确显示为“Café”。所以问题一定出在将它存储到 MySQL 数据库中。希望有帮助。此外,当添加新业务时,会向站点管理员发送一封电子邮件,并且电子邮件中的名称显示不正确的字符。这就是为什么我需要数据库中的正确信息。我为什么不呢?
  • 其他有趣的事情...我将公司名称输出到一个 .txt 文件中,但那里也不正确 (dbfl.xylotdesign.com/vendor/input.txt)!那是怎么回事?
  • 此外(对多个 cmets 感到抱歉,但编辑有时间限制),电子邮件是使用 POST 数据发送的,而不是来自数据库数据。所以看来问题出在数据的发送上。根据 Firefox,带有表单的页面具有 UTF-8 编码 (dbfl.xylotdesign.com/vendor/register.php)。我被难住了。

标签: php mysql html forms special-characters


【解决方案1】:

您的数据库连接可能未设置为 UTF-8。

在连接开始时,发出以下查询:

SET NAMES 'utf8';

这会将连接字符集设置为 utf8,这将匹配您的表、代码和客户端页面的编码和排序规则。

【讨论】:

  • 仅此一项并不能解决我的问题,但现在我的连接脚本在每次建立连接和数据库选择后都会调用此查询。
  • 我遇到了同样的问题,这一行解决了我的问题!非常感谢!
【解决方案2】:

我猜它来自表单而不是 mysql,因为电子邮件来自那里。调查一下。也许你有某种“预处理器”。

只是想知道,当您向用户显示该信息时,为什么要存储 html 字符?这是灾难的秘诀。跨站脚本。

快速修复,尝试在打开 uft-8 的数据上使用 htmlentites。以 html 格式发送电子邮件,您应该没问题。

但是,请尝试找出问题的原因。

编辑。 echo htmlentities($str, ENT_QUOTES, "UTF-8");

这应该可以解决您的问题。必须定义 utf 8 的字符集

【讨论】:

  • 您的最后评论说得通。在 htmlentities 中添加 utf-8 作为您的语言环境。
  • 成功了!非常感谢!我从来没有注意到htmlentities() 选择了指定字符集。另外,你建议我做什么来防止 XSS?
  • 你已经在这样做了。我最初以为您没有使用 htmlentities。你最后的评论说得很清楚。很高兴我能帮上忙。
  • 再次感谢您的帮助。为了正确存储和显示数据,需要这样做似乎很奇怪。
  • 其实就是转义。我的存储和一切都很好。 PHP 只是混淆了 utf8。但是,是的,它应该自动检测,甚至将 UTF8 设为默认 IMO,因为 UTF8 现在几乎无处不在。我等待php6。
【解决方案3】:

检查各个db表或db的设置,将其设置为utf-8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多