$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'是用于指定用户和' $ dts'的常规ID。日期格式为YYYY-MM-DD。但是当我使用这段代码时,它会在循环时暂停我的父级,如果我评论这段代码,我的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> </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> </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循环的代码,以便可以很容易地看到它
答案 0 :(得分:0)
由于数组中不存在in_time
和out_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'];
只需在其他地方更改您的参考资料。
答案 1 :(得分:0)
你说你的查询在父循环中。这意味着您多次运行查询。由于这个原因,最好不要在循环中放置查询。
例如,下面的(坏)代码将运行1000个查询。
$i = 0;
while($i <= 1000){
mysql_query("SELECT name FROM user WHERE user_id = '$i'");
$i++;
}
因为上面的代码段没有使用预处理语句,所以每个查询都需要往返于MySQL服务器。
答案 2 :(得分:0)
试试这个:
$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'];
}
答案 3 :(得分:0)
您是否必须在循环内运行该查询?您不能首先将所有$ 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'
。然后,您将循环遍历结果集,而不是将数百个SELECT(可能)发送到MySQL。
您可以使用以下格式设置$ 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';
出于调试目的,您应始终打开错误报告。我想你可以立即看到问题所在。