字符串变量显示错误的长度

时间:2012-03-09 18:30:05

标签: php

所以我有一个函数从表单中获取一些字符串变量(在提交表单之后),然后使用这些变量运行查询并返回结果行。 我有几个条件可以正常工作,除了一个,我无法弄清楚什么是错的。 当我打印出查询并在phpMyadmin中运行它 - 它工作正常(例如返回3行),但它不在页面上运行(显示返回0 rwos)。 我注意到的一件事是,当我执行var_dump时,它会给出正确的类型(字符串),但长度不正确。修剪没有任何区别。 例如

$name2 = "John Doe";
var_dump($name1);
var_dump($name2);

name2返回字符串(8) 但是当name1返回string(9)时,即使name1也是“John Doe” - 我也不知道那个额外的字符是什么。 该变量来自一个表单,来自select元素。选择是从表中填充的。在分配给name1之前,我修剪了结果POST值。对于select元素中的名称来自的表和我运行查询的表,字符编码是相同的。 如果我不添加名称,表单中的所有其他变量都正常传递并且查询正确运行。再次,如果我打印出查询(包括名称条件)并复制并粘贴到phpMyAdmin - 它运行正常。 我在这里疯了。

3 个答案:

答案 0 :(得分:1)

初看起来这可能是字符编码问题。

我不知道发生了什么(我的数据很少)但是我建议扫描两个字符串(实际的字符串和你正在等待的字符串)并返回字符以供进一步调查:< / p>

function compare($s1, $s2) {
    $i = 0;
    while ($s1[$i]) {
        if ($s1[$i] != $s2[$i]) return array($s1[$i], $s2[$i]);
        $i++;
    }
}

var_dump(compare($name1, $name2));

编辑: 也许一些php行将帮助我更好地解释我的意思。字符串看起来是等于,但它们不是第二个中的A是在{1}上呈现的 屏幕为A(但计算两个字节,因此不同的strlen)

 mb_internal_encoding('UTF-8');
 $plainOldAscii = 'TASTE';
 $aBitOfCyrillic = html_entity_decode('T&#1040;STE', ENT_NOQUOTES,'UTF-8');
 echo "$plainOldAscii  -> " . strlen($oldPlainAscii)  
    . " -> "                  . mb_strlen($oldPlainAscii)
    . "\n$aBitOfCyrillic -> " . strlen($aBitOfCyrillic) 
    . " -> "                  . mb_strlen($aBitOfCyrillic)
    . "\n";

答案 1 :(得分:0)

可能你的$ name1就像“John Doe”,末尾有空格或者开头有空格......

答案 2 :(得分:0)

好的,这是一个数据库问题。 仍然不知道这怎么可能 - 数据库中的名称或奇怪的字符中没有额外的空格。编码是正确的,虽然在数据库中是相同的,但是在屏幕上打印出名称,然后复制并插入名称表中修复它。即使没有明显的区别。怪异。