繁体   English   中英

奇怪的PHP字符串错误

[英]Strange PHP string error

这是一个非常奇怪的错误,它随机发生。 因此,我将尽力解释这一点。 我正在尝试大幅减少代码以查明问题,而不必引用框架,也无需在框架外处理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变量重新编码。 几轮后,即使$ var实际上是一个字符串,它也会返回bool(false)值。 非常非常奇怪。 有人遇到过吗? 这是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);

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

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

返回值

返回提取的字符串部分,如果失败或为空字符串,则返回FALSE。

您应该测试这种情况,然后在搜索到的字符串中var_dump以查看其包含的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM