Php 为什么在我改成sessions后,MySql数据库中的特殊字符会变得很奇怪?

Php 为什么在我改成sessions后,MySql数据库中的特殊字符会变得很奇怪?,php,sql,mysql,html,encoding,Php,Sql,Mysql,Html,Encoding,我有一个分类网站,最近我改变了分类广告的插入,使用php会话变量,而不是大量的帖子和表单 所以,首先在切换到会话之前,它运行良好,所有特殊角色都正确显示 现在我改成了会话,我得到了有趣的角色,而不是特殊的角色 这里有一些代码可以更好地解释 首先是在切换到会话之前: 下面是显示验证页面(预览)的第一页,用户可在其中按“确定”或“返回并更改”: 以上内容将标题中的所有字符更改为相应的HTML实体 我在这里该怎么办 在我的MySql标题字段中,没有HTML实体,只有正确的文本。但在我的网页和分类中,特

我有一个分类网站,最近我改变了分类广告的插入,使用php会话变量,而不是大量的帖子和表单

所以,首先在切换到会话之前,它运行良好,所有特殊角色都正确显示

现在我改成了会话,我得到了有趣的角色,而不是特殊的角色

这里有一些代码可以更好地解释

首先是在切换到会话之前: 下面是显示验证页面(预览)的第一页,用户可在其中按“确定”或“返回并更改”:

以上内容将标题中的所有字符更改为相应的HTML实体

我在这里该怎么办

在我的MySql标题字段中,没有HTML实体,只有正确的文本。但在我的网页和分类中,特殊字符显示得很有趣,尽管它们来自同一个mysql字段(在phpmyadmin中看起来不错)

有什么想法吗


谢谢

请确保您与mysql的连接是utf8安全的。首先,我会在您连接后向数据库发出一个
SET NAMES utf8
。另外,通过设置表排序规则,确保表字段也是utf-8


希望这有助于

您在将提交的标题放入会话之前对其进行HTML编码。然后从会话中获取编码值并将其插入数据库

会话存储和数据库都不是HTML,因此您不应该在此处对值进行编码。在将文本输出到HTML页面时,应该只对文本进行HTML编码(如第一个示例中的
)。此外,您可能应该优先使用
htmlspecialchars()
,而不是
htmllentities()
,后者会毫无意义地尝试对某些(但不是全部)Unicode字符使用HTML实体引用

确保您的页面被用作UTF-8(具有
内容类型
标题和/或
),您的数据库连接被设置为使用UTF-8(使用
mysql\u set\u charset()
,最好不是
集名称
),并且每个表的每个文本列都被设置为使用UTF-8排序规则


无论如何,我不会在这里使用会话。对于多阶段的形式,使用隐藏的值来传递以前的输入是更可靠的:考虑当用户打开两个浏览器窗口并试图同时输入两个分类时会发生什么。一个表单中的值将覆盖另一个表单中的值,从而混淆了这两个过程。(另一种选择是使用带有客户端脚本的单页表单,以便一次只显示其中的一部分。)

请显示“有趣角色”的示例。另外,你正在做一个
htmlentities()
,如果你重新提交表单(你也在那里做一个),可能是一个双字符,所以这看起来很像是设计的,不是吗?字符在一些浏览器(chrome)中是简单的html实体,如“auml”等。但在其他浏览器中,它们显示为正方形,例如。。。
  //VERIFICATION PAGE:
  <form>
   <input type="text" value="<?php echo htmlentities($_POST['annonsera_headline'], ENT_QUOTES, 'utf-8'); ?>">

  //IF OK, THEN TO THE PAGE WHERE THE CLASSIFIED IS INSERTED
   $headline= mysql_real_escape_string($_POST['headline']);
    //VERIFICATION PAGE:
    $headline = htmlentities($_POST['annonsera_headline'], ENT_QUOTES, 'utf-8');
    $_SESSION['headline'] = $headline;                 

  //IF OK, THEN TO THE PAGE WHERE THE CLASSIFIED IS INSERTED
  $headline= mysql_real_escape_string($_SESSION['headline']);