Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 - Fatal编程技术网

Php 循环执行时间

Php 循环执行时间,php,Php,我的数据库包含200个数据,我正在尝试执行for loop,以检查用户的下线,并根据他们的下线分配给他们的级别进行检查,但这占用了太多的执行时间,因此服务器没有及时响应。我该怎么办 $query2 = mysqli_query($conn,"SELECT * FROM members LIMIT 1"); $row3 = mysqli_fetch_assoc($query2); $id=$row3['id']; for ($i=$id; ; $i++) { $query2 =

我的数据库包含200个数据,我正在尝试执行for loop,以检查用户的下线,并根据他们的下线分配给他们的级别进行检查,但这占用了太多的执行时间,因此服务器没有及时响应。我该怎么办

$query2 = mysqli_query($conn,"SELECT * FROM members LIMIT 1");
$row3 = mysqli_fetch_assoc($query2);
$id=$row3['id']; 

for ($i=$id;  ; $i++) {  
    $query2 = mysqli_query($conn,"SELECT * FROM members WHERE d!=0 AND id=".$i);
    $row3 = mysqli_fetch_assoc($query2);
    $level1=$row3['level'];
    $d=$row3['d'];
    $downline1=$row3['downline'];
    if ($d!=$downline1) {
        switch ($level1) {
        case 1:
            $downline1=($d-3);
            mysqli_query($conn,"UPDATE members SET downline='$downline1' WHERE id=".$i);
            break;
        case 2:
            $downline1=($d-12);
            mysqli_query($conn,"UPDATE members SET downline='$downline1' WHERE id=".$i);
            break;
        case 3:
            $downline1=($d-39);
            mysqli_query($conn,"UPDATE members SET downline='$downline1' WHERE id=".$i);
            break;
        case 4:
            $downline1=($d-120);
            mysqli_query($conn,"UPDATE members SET downline='$downline1' WHERE id=".$i);
            break;
        case 5:
            $downline1=($d-363);
            mysqli_query($conn,"UPDATE members SET downline='$downline1' WHERE id=".$i);
            break;

        }

        $query1=mysqli_query($conn,"SELECT * FROM downline");
        while($row = mysqli_fetch_assoc($query1)) {
            $level=$row['level'];
            $downline=$row['total_downline'];
            if ($downline1==$downline){
                mysqli_query($conn,"UPDATE members SET level='$level' WHERE id=".$i);
            }
        }   
    }

for循环是一个无限循环,因为您没有定义结束条件:
for($i=$id;;$i++){

最好是获取所有成员并使用while循环对其进行迭代:

$query2 = mysqli_query($conn,"SELECT * FROM members");
while($row3 = mysqli_fetch_assoc($query2)){
    $id = $row3['id'];
    // do what you used to do in for-loop here
} 
通过这种方式,您可以循环数据库中的所有成员,即使它们的ID中存在如Barmar提到的间隙

在旁注中,将更新查询从切换案例中移动到切换之后。对于每个案例,更新查询总是相同的


编辑:修复了从DB获取成员的问题

如果您试图更新所有成员,则无需执行
选择和循环,只需将所有逻辑放入SQL:

UPDATE members
SET downline = d - CASE level
                    WHEN 1 THEN 3
                    WHEN 2 THEN 12
                    WHEN 3 THEN 39
                    WHEN 4 THEN 120
                    WHEN 5 THEN 363
                END
WHERE d BETWEEN 1 AND 5 AND d != downline
第二次更新可以是:

UPDATE members AS m
JOIN downline AS d ON m.downline = d.total_downline
SET m.level = d.level
WHERE m.d BETWEEN 1 AND 5
实际上,您可以同时执行两个更新:

UPDATE members AS m
LEFT JOIN downline AS d 
ON m.d = d.total_downline +
    CASE level
        WHEN 1 THEN 3
        WHEN 2 THEN 12
        WHEN 3 THEN 39
        WHEN 4 THEN 120
        WHEN 5 THEN 363
    END
SET m.level = IFNULL(d.level, m.level), 
    m.downline = m.d - CASE level
                        WHEN 1 THEN 3
                        WHEN 2 THEN 12
                        WHEN 3 THEN 39
                        WHEN 4 THEN 120
                        WHEN 5 THEN 363
                    END
WHERE m.d BETWEEN 1 AND 5 AND m.d != m.downline

欢迎访问。请考虑访问这个问题,看看如何问好问题,并从社区得到帮助答案。<代码>限制1 < /代码>没有<代码>由< /代码>意味着您只是从<代码>成员< /代码>表中挑选出一个不可预测的行。您想用这个查询做什么?为什么不将第二个查询改为
从下线选择级别,其中total_downline=$downline 1
,而不是在测试
total_downline
的所有行中循环,或者加入两个查询:
更新成员在成员上加入下线。downline=downline.total_downline SET members.level=downline.level其中members.id=$i
。循环计数的成员不一定能找到所有的成员ID。如果有10个成员,ID从101到110会怎么样?