Yahoo奇摩知識+ 將於 2021 年 5 月 4 日 (美國東部時間) 終止服務。自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+ 網站將會轉為唯讀模式。其他 Yahoo奇摩產品與服務或您的 Yahoo奇摩帳號都不會受影響。如需關於 Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

php點名系統比對問題

下面是我的程式碼:

while (($row2=mysql_fetch_array($res2)))

{

$row3=mysql_fetch_array($res3);

if ($row2['NAME'] == $row3['name'])

{

$j="有到";

}

else

{

$j="未到";

}

echo "<tr><td>".$row2['ID']."</td><td>".$row2['NAME']."</td><td>".$j."</td></tr>";

}

很奇怪的是~只要有一個比對到未到,後面剩下的全都顯示未到

到底是怎麼了???是我的邏輯有問題嘛??

拜託各位高手幫我看一下~"~

已更新項目:

dns的資料表:

dnid name

1 鄭傳新

1 李俊儀

student的資料表

CID NAME

i01 鄭傳新

i01 陳凱貞

i01 李俊儀

i01 董乃嘉

2 個已更新項目:

sql:

$sql2="select * from student where CID = '$cid' order by ID asc";

$res2=mysql_query($sql2);

$sql3="select * from dns where dnid = '$dnid'";

$res3=mysql_query($sql3);

2 個解答

評分
  • Lv 6
    1 0 年前
    最佳解答

    問一下,$row2,$row3其資料分別是什麼?

    2007-04-04 17:52:25 補充:

    因為,比對方式出錯了!

    while (($row2=mysql_fetch_array($res2)))

    {

    $row3=mysql_fetch_array($res3);

    if ($row2['NAME'] == $row3['name'])

    ....略

    while的部份你的想法是取出每一筆有到的名字,然後與student資料表中相關資料比對,但所比對的資料卻只是用 mysql_fetch_array取出一次,這個部份也應該用 while取出資料才是。

    依你程式目前的寫法,比對的資料的次序會如下:

    1 $row2['NAME'] = 鄭傳新 $row3['name'] = 鄭傳新 ==>結果if成立

    2 $row2['NAME'] = 李俊儀 $row3['name'] = 陳凱貞 ==>結果if不成立

    看出來了嗎?假設$row2['NAME']的下一筆是 董乃嘉,則該次比對會是如下:

    3 $row3['NAME'] = 董乃嘉 $row3['name'] = 李俊儀

    $row3 的資料並沒有從頭到尾比對,且每次都只取一筆資料出來比對。當然這樣的程式跑出來會是錯誤的。

    解決方式可以將

    $row3=mysql_fetch_array($res3);

    也改成while方式,也就是寫成雙迴圈的方式,但這又有個問題,你用 mysql_fetch_array取出資料後,若沒有將dataseek設定回一開頭,則$row3的資料於 $row2迴圈執行一次後就取不到了。

    因此在$row3迴圈開始前先用

    mysql_data_seek($row3,0);

    將dataseek指回一開始。

    另外在$row3迴圈中,if成立(即有到)時,增加一個 break 指令,如此就可以減少不必要的比對。

    參考資料: 自己
  • 1 0 年前

    我覺得您可以使用SQL的JOIN語法,

    才合併$res2與$res3,

    再搭配SQL的CASE的語法,

    應該是可以達成的!

    若是可以,

    請將您的資料表及SQL語法貼上來!

    參考資料: 自己
還有問題?馬上發問,尋求解答。