PDO将错误的日文字符插入数据库

时间:2015-02-15 15:09:10

标签: php mysql pdo utf-8 character-encoding

背景


我正在为自己编写一个小型Web应用程序来测试我的日语。它包括看到一个日语单词,然后用荷兰语给出正确的翻译。我有一个小设置,我可以用荷兰语翻译指定一个日语单词,它将被插入到数据库中。

问题

<小时/> 当插入某些日文字符时,例如“お”(或那些想知道的“O”),它将作为“ず”(或“Zu”)插入数据库。还有更多的角色也会被改造,但我忘记了(我清理了数据库以查看某些解决方案是否有效)。

我尝试了什么


我确保我认为需要UTF-8的所有内容都设置为UTF-8。我已将以下内容设置为UTF-8

  • HTML页眉:
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • PHP标题(第一行):
    header('Content-Type: text/html; charset=utf-8');
  • MySQL表japanese_words
    ALTER TABLE japanese_words CONVERT TO CHARACTER SET utf8;
  • PDO编码:
    $db = new PDO('mysql:host=localhost;dbname=japanese;charset=utf8', '****', '****');
    并试过:
    $db->exec("set names utf8");

指定日语单词在PHP中有效。我可以在我的网页中转储并定期显示日语单词。这意味着我的HTML和PHP设置正确。因此在将其插入数据库之前没有错误。

当我在数据库中手动插入日语单词时,它可以工作。

当我尝试使用PDO将其插入数据库时​​,字符会被“转换”。

尝试显示生成的查询PDO不起作用。我得到带有bound参数的查询,而不是实际的单词。

代码


add_word.php(一切正常):

$japanese_word = $_POST['japanese_word'];
$dutch_word = $_POST['dutch_word'];

$word = new Word();
$word->setDutchWord($dutch_word);
$word->setJapaneseWord($japanese_word);

$wordDAO = new WordDAO($db);
$success = $wordDAO->addWord($word);

WordDAO方法,我认为问题是(或者在那里和实际的MySQL数据库之间):

$query = "insert into `japanese_words` (`word`) values(:word)";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':word', strtolower($word->getJapaneseWord()));
$stmt->execute();
$japanese_word_id = $this->db->lastInsertId();

问题


我在这做错了什么?我是否忘记设置更多编码,或指定特定的PDO设置?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

问题是我在strtolower()中使用bindParam。这改变了日语单词的值。将代码更改为以下内容:

$query = "insert into `japanese_words` (`word`) values(:word)";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':word', $word->getJapaneseWord());
$stmt->execute();
$japanese_word_id = $this->db->lastInsertId();

该死的我的公然副本/粘贴(当然我在发布问题时就发现了)。

答案 1 :(得分:1)

PDO

mb_internal_encoding('UTF-8');

$dbh = new PDO("mysql:host=localhost;dbname=japanese;charset=utf8");
$dbh->exec("set names utf8");

$query = "insert into `japanese_words` (`word`) values(:word)";
$stmt = $this->db->prepare($query);

// use mb_* function for japanese string 
$stmt->bindParam(':word', mb_strtolower($word->getJapaneseWord()));

$stmt->execute();

$japanese_word_id = $this->db->lastInsertId();

更改数据库和表的字符集和整理

ALTER DATABASE japanese CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE japanese_words CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

设置页面的字符集

<?php
ini_set("default_charset", "UTF-8");
header('Content-type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...

您可能必须检查您的文件是否使用正确的字符集保存!