0
$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ループ全体を停止しているコードにコメントしました

4

4 に答える 4

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

デバッグの目的で、エラー報告を常にオンにする必要があります。何が問題なのかすぐにわかると思います。

于 2012-09-07T10:41:14.287 に答える
0

in_timeout_timeが配列に存在しないために、スクリプトが停止した可能性があります。それ以外の場合は、変数に何を割り当てているかを指定しない限り、クエリに問題はありません。

コメントで述べたように、error_logこのPHPスクリプトと同じディレクトリにあるファイルをチェックインします。

また、あなたの親ループも次のようなものですか?

while ($foo = @mysql_fetch_array($q1))

もしそうなら、それはあなたのエラーかもしれません。$q1whileループ内の値をリセットしているため、ループが終了している可能性があります。

更新:あなたがあなたのコードを投稿したので、私はあなたの正確なエラーを知っています:

これらは、メインwhileループの実行に使用される最初の2行のコードです。

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

そして、他の場所で参照を変更するだけです。

于 2012-09-07T10:31:49.047 に答える
0

クエリは親ループ内にあるとおっしゃいました。これは、クエリを複数回実行していることを意味します。このため、ループ内にクエリを配置しないことをお勧めします。

たとえば、以下の(悪い)コードは1000個のクエリを実行します。

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

上記のコードはプリペアドステートメントを使用していないため、各クエリにはMySQLサーバーへのラウンドトリップが必要です。

于 2012-09-07T10:33:36.720 に答える
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'];
}
于 2012-09-07T10:39:50.153 に答える