Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的PHP字符串错误_Php_Mysql_Regex - Fatal编程技术网

奇怪的PHP字符串错误

奇怪的PHP字符串错误,php,mysql,regex,Php,Mysql,Regex,这是一个非常奇怪的错误,随机发生。因此,我将尽可能地解释这一点。我试图在不引用框架的情况下大幅减少代码,以找出问题所在,也不需要在框架之外处理500行代码——因此,我会尝试在我这样做时回来更新这个问题。好的,我们开始吧 基本上说,我在函数中取一个字符串,然后像这样进行preg_替换: $table = '/something'; print $table; $table = preg_replace("@^(/)@",'prefix_',$table); print $table; 输出将类似

这是一个非常奇怪的错误,随机发生。因此,我将尽可能地解释这一点。我试图在不引用框架的情况下大幅减少代码,以找出问题所在,也不需要在框架之外处理500行代码——因此,我会尝试在我这样做时回来更新这个问题。好的,我们开始吧

基本上说,我在函数中取一个字符串,然后像这样进行preg_替换:

$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\u转储变量来重新编码。几轮之后,它返回一个
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”,这是随机发生的。这意味着,如果我在看似无关的函数之外注释代码,它将在它所打断的字符串上工作

---解决方案----

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

基本上,函数需要一个
null
array()
值,而传递的是一个数字。我们已经关闭了通知,所以我打开了它们并开始修复所有的通知和警告,这就是我发现这个奇怪错误的原因。我不知道到底是什么内部机制造成了这个问题。但是,我可以将症状定义为一个字符串分配问题,该问题将发生在代码中的某个其他位置,当它不使用上面详述的新preg_replace值重新分配$table变量时,我们发现了这个问题。现在你知道了。该函数类似于以下内容:

function format_something($one, $two, $three = array()){
    if ($three['something'] == 'Y') {
    /** etc... */
}
...
format_something('one','two',3);
循环一段时间后,这种类型的转换开始在代码中随机出现问题。

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

返回值

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


您应该测试这种情况,并对正在搜索的字符串进行var_转储,以查看它在这种情况下包含的内容。

是否可能将
/somethinges/somethingese
作为字符串,因为您的正则表达式将只替换第一个实例。No。不是这样。从输出中可以看到,第一个是原始字符串,第二个是操作后的字符串。基本上,变量并没有重新分配给preg_replace值,因为我可以稍后在代码中用一个新值进行preg_replace,它实际上会工作。这很奇怪。我们应该看到一个完整的代码示例,但失败了。@Erik我会提供一个代码示例,但它是功能性的,大约有500行。我已经解决了这个问题,解决方案就在上面。是的,我认为var_在字符串上从substr转储bool(false)是在说明什么。如果字符串总是'/something',substr($var,0,1)不应该总是返回'/'吗?如果$var是'/something',并且它从substr($var,0,1)返回bool(false),那么这里还发生了其他事情。。。我说的对吗?理论上是的,但可能遇到了一个空字符串?对不起,按enter键。-如果我var_dump变量和substr,我得到变量的字符串值和长度>1,然后substr值为bool(false)。如果这是PHP的自然现象,那么我认为这将是一种有严重缺陷的编程语言。这听起来像是一些更具体的例子,我不知道如何帮助不知道确切的字符串内容,并能够重现问题。如果你碰巧发现了它,请张贴;我很好奇是什么原因造成的。