【问题标题】:PHP and MYSQL cannot display double quotes properly when also displaying ñ correctlyPHP 和 MYSQL 在正确显示 ñ 时也无法正确显示双引号
【发布时间】:2014-08-03 01:58:02
【问题描述】:

在我的 mysql 数据库中插入双引号时遇到问题。

我必须将标题更改为 UTF8,因为我将显示西班牙语(ñ,重音符号)。

我运行一个页面 (PHP) 在我的数据库中插入一条消息:

header('Content-Type: text/html; charset=utf-8');
$newMessage = $_POST['newChatMessage'];
$currentUser = $_SESSION['mundialUser'];
$currentUserId = $_SESSION['idPlayer'];
$newMessage = $_POST['newChatMessage'];
date_default_timezone_set('America/New_York');
$messageDate = date( "Y-m-d H:i:s", time());

$chatMessageQuery = "INSERT INTO chat (message, user, user_id, date) values (:message, :user, :user_id, :date)";
$con->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
$chatMessage = $con->prepare($chatMessageQuery);
$chatMessage->execute(array(':message'=>$newMessage, ':user'=>$currentUser, ':user_id'=>$currentUserId, ':date'=>$messageDate));

当我检查数据库时,双引号会像 \" 而不是简单的 "。西班牙语 ñ 插入如下:ñ。

然后显示,我的主页在 Head 中有这个:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

然后我使用 utf8_decode 打印从数据库中检索到的消息。

结果是:西班牙语 ñ 显示正确,但双引号显示为 \" 而不是 "

插入数据库或显示时我遗漏了什么?

【问题讨论】:

  • 在执行“SET NAMES 'utf8'”时,您可以尝试不简单引用“utf8”吗?你也可以检查你的文件编码是 UTF-8 吗?
  • 同样的事情。 ñ 没关系,“出来\”
  • 一个不好的解决方案是在你的 utf8_decode 周围添加一个带斜杠,但这很难看。我可以看到你没有清理你的 $_SESSION 和 $_POST 数据,也许 $_POST 值在添加到你的数据库之前很糟糕......你的 apache 是否禁用了 magic_quote_gpc?
  • magic_quote_gpc 似乎已开启
  • ow,所以如果可以,请将其设置为 OFF。 magic_quote_gpc 将“神奇地”在所有 $_GET、$_POST 和 $_COOKIE 数据(gpc = Get、Post、Cookie)的引号前添加一个反斜杠。现在这是不推荐使用的用法。如果不能,唯一的处理方法是使用 stripslashes PHP 函数从反斜杠中清除所有 $_GET、$_POST 或 $_COOKIE 数据。如果您删除了 mqgpc,请不要忘记重新启动您的 apache。

标签: php mysql pdo character-encoding special-characters


【解决方案1】:

双引号像 \" 而不是简单的 "

您的一些代码正在添加这些斜杠。或者魔法行情的古老功能被关闭。两者都应该被禁用。

西班牙语的ñ插入如下:ñ。

当实际的初始化已经完成时,发送 mysql init 命令意义不大。

SET NAMES 不是需要一些特殊舞蹈才能表演的魔术圣歌,而是简单明了的 SQL 查询。因此,您可以通过query() 方法运行它。或者,更好的是,在 DSN 中设置字符集。

【讨论】:

    【解决方案2】:

    您应该查看表/数据库的字符集。至少在葡萄牙语中可能会让人头疼

    【讨论】:

    • 这个小sn-p救了我一次:mb_internal_encoding('UTF-8');,但它真的是在黑暗中开枪;网络应用程序中有很多要点可能会弄乱您的编码
    • 我应该在哪个阶段添加这个?插入前?
    • 这些 mb_* 方法在处理多字节编码时很有用,但我在您的代码中看不到任何 mb_* 调用。所以 mb_internal_encoding() 在这里没有帮助,也不应该放在 PHP 源代码中,而应该放在你的 php.ini 中。使用指令 mbstring.internal-encoding
    • 正如我所说,这是在黑暗中拍摄的。看不到拒绝投票的原因,因为错误的字符集是此类问题的常见原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2023-03-29
    • 2018-12-10
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多