Php 循环执行时间
我的数据库包含200个数据,我正在尝试执行for loop,以检查用户的下线,并根据他们的下线分配给他们的级别进行检查,但这占用了太多的执行时间,因此服务器没有及时响应。我该怎么办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 =
$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会怎么样?