Php 运行此代码将停止while循环

Php 运行此代码将停止while循环,php,mysql,select,Php,Mysql,Select,在上述代码中,“$e_id”是用于指定用户的普通id,“$dts”是格式为YYYY-MM-DD的日期。但当我使用这段代码时,它会停止我的父while循环,如果我对这段代码进行注释,我的while循环运行良好。我从未见过这种行为。为什么会这样?这个代码有什么问题 编辑:这是完整的粗略代码 $q1 = mysql_query("select in_time, out_time from $att_tbl where fk_eid = '$e_id' and a_date = '$dts'"); $

在上述代码中,“$e_id”是用于指定用户的普通id,“$dts”是格式为YYYY-MM-DD的日期。但当我使用这段代码时,它会停止我的父while循环,如果我对这段代码进行注释,我的while循环运行良好。我从未见过这种行为。为什么会这样?这个代码有什么问题

编辑:这是完整的粗略代码

$q1 = mysql_query("select in_time, out_time  from $att_tbl where fk_eid = '$e_id' and a_date = '$dts'");
$r1 = mysql_fetch_array($q1);
$intime = $r1['in_time'];
$outtime = $r1['out_time'];
$q1=mysql\u查询(“从$emp\u数据中选择id,其中lft='0'按emp\u id排序”);
而($r1=mysql\u fetch\u数组($q1))
{
$e_id=$r1['id'];
$htmldata='';
$filename=“$e_id-$months-$years.html”;
$date=time();
$day=日期('d',$date);
$month=日期('m',$date);
$year=日期('Y',$date);
$first_day=mktime(0,0,0,$month,1,$year);
$title=日期('F',$first_day);
$day\u of_week=日期('D',$first\u day);
$today=日期('Y-m-d',标准时间('today');
$Dayed=日期('Y-m-d',标准时间('Dayed');
$day_before_day=日期('Y-m-d',标准时间('day-1天');
交换机($day\u of\ u week)
{   
案例“Sun”:$blank=0;中断;
案例“Mon”:$blank=1;中断;
案例“Tue”:$blank=2;中断;
案例“Wed”:$blank=3;中断;
案例“Thu”:$blank=4;中断;
案例“Fri”:$blank=5;中断;
案例“Sat”:$blank=6;中断;
}
$days_in_month=cal_days_in_month(0,$month,$year);
$htmldata.=“”;
$htmldata.=“$title$year”;
$htmldata.=“SunmontueWedshufrisat”;
$day_count=1;
$htmldata.=“”;
而($blank>0)
{ 
$htmldata.=“”;
$blank=$blank-1;
$day_count++;
} 
$day_num=1;
而($day_num 7)
{
$htmldata.=“”;
$day_count=1;
}
} 

虽然($day\u count>1&&$day\u count由于数组中不存在
in\u time
out\u time
这两个事实,您的脚本可能已停止。否则,除非您告诉我们您为变量分配了什么,否则查询不会有问题

正如我在评论中提到的,检查
error\u log
文件,该文件与此PHP脚本位于同一目录中

此外,您的父循环是否也遵循以下内容:

while($foo=@mysql\u fetch\u array($q1))

如果是,则可能是您的错误。您正在while循环内重置
$q1
的值,因此可能会终止循环

更新:既然您发布了代码,我知道您的确切错误:

这是前两行代码,用于运行主
while
循环:

$q1 = mysql_query("select ids from $emp_data where lft = '0' order by emp_id");
while($r1 = mysql_fetch_array($q1))
{
$e_id = $r1['ids'];
$htmldata = '';
$filename = "$e_id-$months-$years.html";
$date =time () ;
$day = date('d', $date) ;
$month = date('m', $date) ;
$year = date('Y', $date) ;
$first_day = mktime(0,0,0,$month, 1, $year) ;
$title = date('F', $first_day) ;
$day_of_week = date('D', $first_day) ; 
$today = date('Y-m-d', strtotime('today'));
$yesterday = date('Y-m-d', strtotime('yesterday')); 
$day_before_yesterday = date('Y-m-d', strtotime('yesterday - 1 day'));

switch($day_of_week)
{   
 case "Sun": $blank = 0; break; 
 case "Mon": $blank = 1; break; 
 case "Tue": $blank = 2; break; 
 case "Wed": $blank = 3; break; 
 case "Thu": $blank = 4; break; 
 case "Fri": $blank = 5; break; 
 case "Sat": $blank = 6; break; 
}
$days_in_month = cal_days_in_month(0, $month, $year) ; 
$htmldata.="<link rel=\"stylesheet\" href=\"/cal.css\" type=\"text/css\"><table id=\"mct1\" class=\"ct1 cl1 cp4 cd2 mct\" cellspacing=0>";
$htmldata.="<tr><th> $title $year </th></tr>";
$htmldata.="<tr><td class=\"cbm cba cmi\"><table class=\"ca ca2\"><tr class=\"cl\"><td>Sun</td><td>Mon</td><td>Tue</td><td>Wed</td><td>Thu</td><td>Fri</td><td class=\"cr\">Sat</td></tr>";
$day_count = 1;
$htmldata.="<tr>";
while ( $blank > 0 ) 
{ 
    $htmldata.="<td>&nbsp;</td>"; 
    $blank = $blank-1; 
    $day_count++;
} 
$day_num = 1;
while ( $day_num <= $days_in_month ) 
{ 
    $dts = date("Y-m-d", strtotime("$year-$month-$day_num"));
    if(strtotime($dts) <= strtotime($today))
    {
        // $q1 = mysql_query("select in_time, out_time  from $att_tbl where fk_eid = '$e_id' and a_date = '$dts'");
        // $r1 = mysql_fetch_array($q1);
        // $intime = $r1['in_time'];
        // $outtime = $r1['out_time'];
    }
    $bgclr = '';
    $weekday = date('D', strtotime($year."-".$month."-".$day_num));
    if($weekday == 'Sun')
    {
        $bgclr = "bgcolor = \"pink\"";
    }
    $htmldata.="<td class=\"cr\" $bgclr><div class=\"ccd co4\">$day_num <br><font size=\"2\"> $intime <br> $outtime </font></div></td>"; 
    $day_num++; 
    $day_count++;
    if ($day_count > 7)
    {
        $htmldata.="</tr><tr>";
        $day_count = 1;
    }
} 
while ( $day_count >1 && $day_count <=7 ) 
{
    $htmldata.="<td>&nbsp;</td>"; 
    $day_count++; 
} 
$htmldata.="</tr></tbody></table></td></tr></table>"; 

$myFile = "$filename";
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = $htmldata;
fwrite($fh, $stringData);
fclose($fh);
}
$q1 = mysql_query("select ids from $emp_data where lft = '0' order by emp_id");
while($r1 = mysql_fetch_array($q1))
请注意,您使用了
$q1
来引用查询。现在,在这段代码中,在嵌套的
while
循环中:

$q1 = mysql_query("select ids from $emp_data where lft = '0' order by emp_id");
while($r1 = mysql_fetch_array($q1))
{
$e_id = $r1['ids'];
$htmldata = '';
$filename = "$e_id-$months-$years.html";
$date =time () ;
$day = date('d', $date) ;
$month = date('m', $date) ;
$year = date('Y', $date) ;
$first_day = mktime(0,0,0,$month, 1, $year) ;
$title = date('F', $first_day) ;
$day_of_week = date('D', $first_day) ; 
$today = date('Y-m-d', strtotime('today'));
$yesterday = date('Y-m-d', strtotime('yesterday')); 
$day_before_yesterday = date('Y-m-d', strtotime('yesterday - 1 day'));

switch($day_of_week)
{   
 case "Sun": $blank = 0; break; 
 case "Mon": $blank = 1; break; 
 case "Tue": $blank = 2; break; 
 case "Wed": $blank = 3; break; 
 case "Thu": $blank = 4; break; 
 case "Fri": $blank = 5; break; 
 case "Sat": $blank = 6; break; 
}
$days_in_month = cal_days_in_month(0, $month, $year) ; 
$htmldata.="<link rel=\"stylesheet\" href=\"/cal.css\" type=\"text/css\"><table id=\"mct1\" class=\"ct1 cl1 cp4 cd2 mct\" cellspacing=0>";
$htmldata.="<tr><th> $title $year </th></tr>";
$htmldata.="<tr><td class=\"cbm cba cmi\"><table class=\"ca ca2\"><tr class=\"cl\"><td>Sun</td><td>Mon</td><td>Tue</td><td>Wed</td><td>Thu</td><td>Fri</td><td class=\"cr\">Sat</td></tr>";
$day_count = 1;
$htmldata.="<tr>";
while ( $blank > 0 ) 
{ 
    $htmldata.="<td>&nbsp;</td>"; 
    $blank = $blank-1; 
    $day_count++;
} 
$day_num = 1;
while ( $day_num <= $days_in_month ) 
{ 
    $dts = date("Y-m-d", strtotime("$year-$month-$day_num"));
    if(strtotime($dts) <= strtotime($today))
    {
        // $q1 = mysql_query("select in_time, out_time  from $att_tbl where fk_eid = '$e_id' and a_date = '$dts'");
        // $r1 = mysql_fetch_array($q1);
        // $intime = $r1['in_time'];
        // $outtime = $r1['out_time'];
    }
    $bgclr = '';
    $weekday = date('D', strtotime($year."-".$month."-".$day_num));
    if($weekday == 'Sun')
    {
        $bgclr = "bgcolor = \"pink\"";
    }
    $htmldata.="<td class=\"cr\" $bgclr><div class=\"ccd co4\">$day_num <br><font size=\"2\"> $intime <br> $outtime </font></div></td>"; 
    $day_num++; 
    $day_count++;
    if ($day_count > 7)
    {
        $htmldata.="</tr><tr>";
        $day_count = 1;
    }
} 
while ( $day_count >1 && $day_count <=7 ) 
{
    $htmldata.="<td>&nbsp;</td>"; 
    $day_count++; 
} 
$htmldata.="</tr></tbody></table></td></tr></table>"; 

$myFile = "$filename";
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = $htmldata;
fwrite($fh, $stringData);
fclose($fh);
}
$q1 = mysql_query("select ids from $emp_data where lft = '0' order by emp_id");
while($r1 = mysql_fetch_array($q1))
您再次使用了
$q1
。解释器认为您想更改变量值,但您想初始化另一个名为
$q1
的变量

好的,在所有这些之后,您需要做的就是为您的代码编写以下代码:

$q1 = mysql_query("select in_time, out_time  from $att_tbl where fk_eid = '$e_id' and a_date = '$dts'");

只需在其他任何地方更改引用。

您说过您的查询位于父循环内。这意味着您要多次运行查询。因此,最好不要将查询置于循环内

例如,下面的(错误)代码段将运行1000个查询

$q2 = mysql_query("select in_time, out_time  from $att_tbl where fk_eid = '$e_id' and a_date = '$dts'");
$r2 = mysql_fetch_array($q2);
$intime = $r2['in_time'];
$outtime = $r2['out_time'];
$i=0;
而($i试试这个:

$i = 0; 
while($i <= 1000){
    mysql_query("SELECT name FROM user WHERE user_id = '$i'");
    $i++;
}

您必须在循环中运行该查询吗?您不能先将所有$e_id变量作为数组,然后将查询更改为
select in_time,out_time from$att_tbl,其中fk_eid in(…您所有的$e_id值格式化为SQL…)和a_date='$e_id'
。然后您可以在结果集中循环,而不是触发(可能的)数以百计的用户选择MySQL

您可以使用以下命令格式化$e_id数组:

$q1 = mysql_query("select in_time, out_time  from $att_tbl where fk_eid = '$e_id' and a_date = '$dts'");
while($r1 = mysql_fetch_array($q1))
{
$intime = $r1['in_time'];
$outtime = $r1['out_time'];
}

出于调试目的,您应该始终打开错误报告。我认为,您将能够立即看到问题所在。

什么是
$att_tbl
?如果没有任何错误,您可以始终检查
错误日志
文件。如果您直接在数据库上运行SQL命令,是否快速?您的脚本由于数组中不存在
in_time
out_time
这一事实,可能已暂停。如果您也添加父循环的代码,则会更好:| ya查询只花了0.0004秒。我还检查了mysql_错误,但没有错误此代码正在生成一个类似于考勤日历的日历,用于首先,我需要检查用户的表中是否有该特定日期的某些数据,这就是为什么此查询在循环中,并且它将在24小时内运行一次,以得到$days_in_month=cal_days_in_month(0,$month,$year)的结果;只是确定一下。$days_in_month显示的值与本月相同,即30,当前$emp_数据表中只有7行,$att_tbl表中只有10行,因为我刚刚在这里做了一些粗略的工作。有查询实际工作吗?例如:脚本运行后,它正确吗?是的,现在运行良好。我在h中犯了这么愚蠢的错误urry-我给两个查询分配了相同的$q1,在内部while循环程序中,我把它当作是想用新值初始化$q1,这就是停止主while循环的原因。我已经更改了变量,它开始正常运行。谢谢!!OMG!!我太傻了:p我总是使用不同的变量,但正如我所做的那样只是做了些粗糙的工作,所以我没有在意,看看我在上面浪费了多少时间,谢!!非常感谢think123我的代码现在运行良好:D@user1654147很高兴知道。如果还有任何问题,Stack Overflow社区将乐于提供帮助。