【问题标题】:Really weird bug with a for loop PHP [closed]带有for循环PHP的非常奇怪的错误[关闭]
【发布时间】:2012-08-10 19:35:14
【问题描述】:

所以这个错误对我来说似乎很奇怪。我有一个带有两个必需参数的方法,但是当脚本进入第一个 for 循环时,两个参数中的一个似乎不再存在。

下面是一段代码:

public function getOptionsForParameters($params, $product){
    // here the value of $product is 105
    for($i = 0; $i<count($params); $i++){
        // but here, $product no longer exists, so in the SQL query, it is empty

        $sql = "SELECT *
                FROM [table_name]
                WHERE prm_id = ".(int)$params[$i]['prm_id']."
                  AND prd_id = ".(int)$product."
                  AND opt_status = 'active'";
    } 
// ... 
}

我真的不明白为什么,因为在方法的开头和 for 循环之间绝对没有脚本。

另外,如果我在所有 for 循环之后打印变量,就在方法的“返回”之前,它的值为 105...在我看来 PHP 以某种方式为我的变量提供了一个范围,这很奇怪..

我已经为此苦苦挣扎了太久,但我在 Google 或 PHP.net 上没有找到与此相关的任何内容

有人知道我的脚本为什么会这样做吗?

顺便说一句:我的 PHP 版本是 5.3.10

非常感谢

【问题讨论】:

  • 无法使用您发布的代码。请发布演示此行为的完整代码 sn-p,最好在 codepad.org 之类的地方。
  • cmets 在循环内的位置发生了什么?您是否正在擦除可变内容?它不存在还是为空?有区别。
  • 缺少哪个变量,$product 或 $param,如果是 $param,它只是“内部”$param 还是整个变量...
  • 如果将var_dump($params) 放在循环之前会产生什么?
  • @Orbling -> 我在我的代码 sn-p 中发布的 cmets 甚至不在我的脚本中。绝对没有比您在此处看到的代码更多的代码。 (除了其余的方法,但问题在这之前)

标签: php loops for-loop scope


【解决方案1】:

这不应该发生。你100%确定它已经消失了吗? isset($product) 能给你什么?

下面的代码是做什么的?

public function getOptionsForParameters($params, $product){
    var_dump($product);
    for($i=0; $i<4; $i++){
        var_dump(isset($product));
    }
}

如果这仍然导致外部函数中的 $product 设置和内部循环中的未设置 $product ,那么 PHP 本身就存在非常错误的问题,可能是一些错误...

另外说明:

$i<count($params);

在您的 for 循环语句中效率低下,因为它执行 count($params) every 迭代。最好计算一次并使用该计算值

$count = count($params);
$i<$count

【讨论】:

  • isset($product) 在 for 循环中返回 false
  • 如果你只是有一个带有 isset($product) 的 for 循环,而没有任何其他命令(比如构造 SQL)呢?
  • 和上面更新答案中的简化代码?
  • 我都试过了,在循环之前,$product 有一个值,而在循环的开始,它甚至都不存在..
  • 那我没主意了……这根本不应该发生!
【解决方案2】:

按照正常的数组声明,你试过了吗:

WHERE prm_id = ".(int)$params['prm_id'][$i]."

至少根据我提出的关于数组声明语法的问题,这似乎是declare an array 的正常方式?

【讨论】:

  • 我相信这应该可以解决它。您当前的索引位置错误,这让事情变得有些混乱。
  • 不一定。像这样构造数组是完全有效的。除此之外,OP 抱怨“失踪”的是$product,而不是$params
  • @Jeremy1026 这取决于数组的声明方式——尽管似乎大多数人以我发布的代码所描述的方式声明数组。 OP 可能已经以[column][row] 的方式创建了它,或者具有这样做的功能。我只是提供一个建议。
  • @DaveRandom +1 来自我。我只是对这个答案吐口水。这似乎合乎逻辑,但很可能完全没用。直觉上它似乎是正确的,但不能保证。
  • 问题出在 $product 而不是 $params..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多