【问题标题】:ZendFramework cuts strings from first non a-z char when inserting to mysqlZendFramework 在插入 mysql 时从第一个非 a-z 字符中剪切字符串
【发布时间】:2010-01-15 19:01:37
【问题描述】:

当我将一些带有Zend_Form 的数据插入到带有非a-z 字符(如chrząszcz)的数据库中时,它会剪切我这个字符串,并且在数据库中我只保存了chrz

MySql中的Everything设置为utf8_general_ci,与MySql连接时我调用SET CHARACTER SET 'utf8',文件也是UTF-8

我不知道该怎么办。

我还编写了独立脚本,它插入并正确读取了我的字符串。 ZendFramework 读起来也是正确的。问题仅在于插入。

有人知道怎么解决吗?

更新:

如果我插入数据:

$db->query("INSERT INTO unit SET name = 'chrząszcz'");

ZendFramework 中有效。问题在于以这种方式插入:

$unitTable = new Model_Unit_Table();
$unit = $unitTable->createRow();
$unit->setFromArray($form->getValues());
$unit->save();

更新 2:

问题在于使用Zend_Filter_StringToLower - 它将字符串chrząszcz 修改为chrz�szcz
如何让这个过滤器正常工作?

【问题讨论】:

  • $form->getValues() 是否返回正确的字符串?
  • 没有。 $form->getValue()var_dump 给出 chrz�szcz。当var_dump a $_POST superglobal 它给出正确的chrząszcz

标签: php mysql zend-framework utf-8 character-encoding


【解决方案1】:

回复您的评论:

没有。 $form->getValue() 的 var_dump 给出 chrz�szcz。当 var_dump 一个 $_POST superglobal 它给出了正确的 chrząszcz.

这行得通吗?

$testArray = array('name' => 'chrząszcz');

$unitTable = new Model_Unit_Table();
$unit = $unitTable->createRow();
$unit->setFromArray($testArray);
$unit->save();

如果是,您的问题可能与 Zend_Form 相关。

编辑:

您的过滤器需要使用mb_strtolower() 而不是strtolower()

编辑2:

试试这个:

$filter = new Zend_Filter_StringToLower();
$filter->setEncoding('UTF-8');

【讨论】:

  • 是的。我发现了问题 - 请查看UPDATE 2
  • 是否可以为所有形式的所有过滤器永久设置编码为UTF-8
  • 很抱歉,我不知道任何内置方法可以做到这一点。但是您可以使用自己的过滤器扩展Zend_Filter_StringToLower,该过滤器使用 UTF-8 作为默认编码。
【解决方案2】:

我很确定这是一个编码问题。在第一个非标准(即高于 ASCII 字符集)字符处丢失的字符串通常是由在非 UTF8 上下文中插入 UTF-8 数据引起的,所以我的第一个怀疑是数据库连接的编码设置不正确。

  • 您可以在调用插入命令之前尝试$db->query("SET NAMES utf8"); 吗?
  • Zend_form 使用的连接肯定是$db 吗?
  • 您是否 100% 确定您的表单所在的页面是 UTF-8 编码的?

【讨论】:

  • 1. SET NAMES utf8 什么都没改变。 2.如何检查/做? 3. 是的,我 100% 确定。
  • 2.我不是 Zend 人,所以我不知道,抱歉。但我想这些类有一个$db 对象? --- 你能发布一个活生生的例子吗?
猜你喜欢
  • 2011-08-22
  • 2023-03-14
  • 1970-01-01
  • 2015-06-13
  • 2011-07-26
  • 2023-03-19
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
相关资源
最近更新 更多