0

我这里发生了一个奇怪的场景。

在我运行 WAMP 服务器(Apache、MySQL、PHP)的本地主机上,我创建了一个网页,该网页显示来自我的数据库中的表的消息列表。

假设 DIV 容器被调用:#message-list

该列表会正确显示(当页面启动时,PHP 会呈现整个页面)。
PHP 回显的 HTML 标记工作得很好。
因此,MySQL 数据库查找也有效!伟大的。

现在...

借助一点 AJAX 和 jQuery 魔法,我创建了一个表单来即时添加更多消息,方法是向 PHP 脚本发送POST请求,该脚本使用生成初始#message-list DIV的相同底层代码。

AJAX 的 PHP 脚本做了两件事:

  • 为来自用户的新消息添加记录;
  • 回显列表(现在应该用新消息更新);

当 AJAX 响应返回浏览器时,JavaScript 端将旧列表替换为新的#message-list内容。

现在这......部分有效。

出了什么问题 - 在一个给定的页面上,我以前的一些帖子似乎以某种方式“破坏”了 PHP 端 AJAX 请求中的某些内容,导致响应为(基本上没有生成 HTML 代码来替换#message-list DIV标签)。

不过,在其他一些页面上,AJAX 响应工作正常。

所以我的问题是:

  • 数据库中的某些字符串数据是否可能由于某些无效字符、编码错误或引号/双引号而中断我的 PHP 脚本的执行?

我尝试使用 PHP 的htmlentities()mysql_real_escape_string()函数来解决这个问题,但是在收到 AJAX 响应后,我的一个页面仍然没有正确刷新列表。

难道只是我只需要清理/清理表中的现有内容吗?
如果是这样,我可以使用任何简单的脚本/查询来执行此操作吗?

谢谢!


编辑#1:

  • MySQL 版本 = 5.5.24-log
  • 通过使用mysql_client_encoding,这显示“ latin1 ”(啊哈!那可能是问题所在!)
  • 在 PHP 中,使用mysql_...方法(如 mysql_connect、mysql_select_db、mysql_query 等);

可能存在问题的数据库表示例:http: //pastebin.com/PjLVmXEF

从外观上看,许多开发人员表示推荐使用 PDO。我会试一试,看看所有错误是否都消失了。非常感谢大家迄今为止的帮助!


编辑#2:

我目前的解决方案是这样的:

我已经使用这些查询来修改我的数据库和存在编码问题的表:

// SQL queries:
ALTER DATABASE timegrasp charset=utf8;
ALTER TABLE tg_messages CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

其次,我注意到特定记录中的某些字符显示不正确(一些双引号句子周围的Â )。所以我在MySQL 查询浏览器中手动退格并重新插入双引号,以确保它完全消失了。

在 PHP 方面,我只在“进入”数据库的过程中对消息进行编码,如下所示:

$htmlConverted = htmlentities( $pMessage, ENT_COMPAT | ENT_HTML401, "UTF-8" );
return mysql_real_escape_string( $htmlConverted );

并确保我以此开始我的 MySQL 连接:

mysql_set_charset("utf8", $DB_LINK);

然后,我可以直接从表中读取字符串,无需任何解码/转换。

最后,为了测试这一点——我从具有特殊字符的源(与我的客户的 Skype 聊天)复制了相同的消息,将其粘贴到我的 Web 表单中,现在它工作正常!:)

我不确定上述所有步骤和参数都是必要的,但这有助于解决我的问题。

在处理 MySQL 表中的特殊字符时,如果这是不好的做法或常见的“不要”错误,最好知道以供将来参考。

4

1 回答 1

0

PHPjson_encode函数拒绝处理在 UTF-8 中无效的字符串:它返回null. 如果您没有为数据库连接设置字符编码,则可能正在使用其他一些编码——不是 UTF-8——并且您传递给此函数的数据实际上不是有效的 UTF-8。

如果您提到详细信息,例如您使用的数据库 API 和连接参数,我可以提供进一步的建议......

于 2013-06-25T17:37:23.733 回答