运行此代码会停止我的 while 循环


running this code halts my while loop

$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'];

在上面的代码中,"$e_id"是用于指定用户的普通id,"$dts"是格式为YYYY-MM-DD 的日期。但是当我使用此代码时,它会停止我的父 while 循环,如果我注释此代码,我的 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);
}

我已经注释了停止整个while循环的代码,以便可以轻松查看

由于数组中不存在in_timeout_time,您的脚本可能已停止。否则,除非您告诉我们您分配给变量的内容,否则您的查询没有问题。

正如我在注释中提到的,签入error_log文件,该文件与此 PHP 脚本位于同一目录中。

另外,您的父循环是否也类似于:

while ($foo = @mysql_fetch_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))

请注意,您使用$q1来引用查询。现在,在该段代码中,在嵌套的while循环中:

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

你又用了$q1。解释器认为您打算更改变量值,但您想初始化另一个名为 $q1 的变量。

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

$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'];

只需在其他任何地方更改您的引用即可。

您说您的查询在父循环中。这意味着您正在多次运行查询。出于这个原因,最好不要将查询放在循环中。

例如,下面的(坏(代码段将运行 1000 个查询。

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

由于上面的代码段未使用预准备语句,因此每个查询都需要往返MySQL服务器。

您是否必须在循环中运行该查询?您不能先将所有 $e_id 变量作为数组获取并将查询更改为 select in_time, out_time from $att_tbl where fk_eid IN (... all your $e_id values formatted for SQL...) and a_date='$e_id' .然后,您将遍历结果集,而不是向MySQL发送(可能(数百个SELECT。

您可以使用以下内容格式化 $e_id 数组:

$sqlString = implode("','", $e_id);
$sql = "select in_time, out_time  from $att_tbl where fk_eid IN ('$sqlString') and a_date='$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'];
}