奇怪的PHP字符串错误

时间:2011-05-12 19:33:38

标签: php mysql regex

这是一个随机发生的非常奇怪的错误。所以我会尽力解释这个问题。我试图大幅减少代码来查明问题,而不必引用框架,也不处理框架之外的500行代码 - 所以当我这样做时,我会尝试回来更新这个问题。好的,我们走了。

所以基本上我说我正在函数和preg_replace中使用字符串,如下所示:

$table = '/something';
print $table;
$table = preg_replace("@^(/)@",'prefix_',$table);
print $table;

输出看起来像

...
/something - prefix_something
/something - prefix_something
/something - /something

You have an error in you sql query... blah blah somewhere around SELECT * FROM /something

在滚动代码之后,这简单地停止工作并且sql错误消失了。更奇怪的是,如果我开始在函数之外注释掉代码,那么它就可以工作了。我把那些代码放回去了,它就破了。

我尝试通过substr($var,0,1)和var_dumping变量重新编码。在几轮之后,它返回bool(false)值,即使$ var实际上是一个字符串。这很奇怪。有没有人遇到这个?这是一个PHP错误吗?它看起来像我。

- 编辑 -

示例:

foreach ( $user as $id => $user ) {
  get_data("/table_name","*", "user_id = '$id'");
}


#in the function $_table_ holds "/table_name"
    $_table_ = trim($_table_);
    $tmp = explode(',', $_table_);
    $tables = array();
    foreach ($tmp as $c => $n) {
        $n = trim($n);
        $a = substr($n, 0, 1);
        $b = substr($n, 1);
        if ($a == false) {
            var_dump($n);
            $a = substr($n, 0, 1);
            var_dump($b);
            var_dump($a);
        }
        if ($a == '/') { etc...

输出:

string(11) "/table_name" string(10) "table_name" bool(false)

如果我切换到原来的preg_replace功能,它只是不preg_replace和同样的事情发生“/ table_name”返回而不是“prefix_table_name”,这是随机发生的。这意味着如果我在看似无关的函数之外注释代码,它将对它打破的字符串起作用。

--- 解决方案 ----

我发现它与另一个导致这个奇怪错误的函数中的字符串到数组的转换有关。

基本上,函数需要nullarray()值,而是传递了一个数字。我们已经关闭了通知,所以我打开它们并开始修复所有通知和警告,这就是我发现这个奇怪的错误。现在究竟是什么内部工作创造了问题我不知道。但是,我可以将症状定义为字符串赋值问题,该问题将出现在代码中的某些其他位置,当我们不使用上面详述的新preg_replace值重新分配$ table变量时,我们会捕获该问题。现在你知道了。该函数看起来与此类似:

function format_something($one, $two, $three = array()){
    if ($three['something'] == 'Y') {
    /** etc... */
}
...
format_something('one','two',3);

在循环中经过一段时间后,这种类型的转换开始在代码中随机出现问题。

1 个答案:

答案 0 :(得分:4)

substr并不总是返回一个字符串。如果找不到子字符串,则返回false。

  

返回值

     

返回字符串的提取部分,或者失败时返回FALSE或空字符串。

你应该测试这个条件,var_dump你正在搜索的字符串,看看它在这种情况下包含的内容。