背景
我正在为自己编写一个小的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
PDO编码:ALTER TABLE japanese_words CONVERT TO CHARACTER SET utf8;
并尝试:$db = new PDO('mysql:host=localhost;dbname=japanese;charset=utf8', '****', '****');
在PHP中指定日语单词有效。我可以在我的网页上转储并定期显示日语单词。这意味着我的HTML和PHP设置正确。所以在将它插入数据库之前没有错误。
当我在数据库中手动插入日语单词时,它就工作了。
当我试图使用$db->exec("set names utf8");
将字符插入数据库时,字符会被“转换”。
试图显示PDO
生成的查询不起作用。我得到的查询带有绑定参数,而不是实际的单词。
代码PDO
(一切正常):
$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);
add_word.php
方法,我认为问题在于(或者介于它和实际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设置?如有任何帮助,我们将不胜感激。
最佳答案
问题是我在我的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();
该死的,我明目张胆的抄写/粘贴(当然,我一发帖就知道了)。
关于php - PDO将日语字符错误插入数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28527477/