ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingถาม PHP กับ mysql ครับ select ออกมาได้ผลไม่ตรงกับใน database
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: ถาม PHP กับ mysql ครับ select ออกมาได้ผลไม่ตรงกับใน database  (อ่าน 2517 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
quickrich2
Newbie
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 54



ดูรายละเอียด
« เมื่อ: 27 มิถุนายน 2012, 19:34:26 »

ผมเขียน web หน้านึงไว้เป็นแบบนี้ครับ

if(command == 'A')
{
      // เพิ่มข้อมูลในฐานข้อมูล 1 แถว โดยการ run sql insert

}
else if (command == 'B')
{
        ลบข้อมูล 1 แถวในฐานข้อมูล โดยการ run sql delete
}

แสดงข้อมูลในตาราง โดยคำสั่ง select from table

-----------------------------------------------------------------------------------

แต่ปัญหามันเกิดเวลาที่ผม run ถ้า run ครั้งแรก ให้ command = 'A'
ผมใช้ phpmyadmin ไปดูข้อมูลใน database มีข้อมูลเพิ่มเข้ามา 1 แถวถูกต้อง และข้อมูลหน้านั้น show ข้อมูล 1 แถว ถูกต้อง

หลังจากนั้นผม run ครั้งที่สอง ให้ command = ' '

ปรากฎว่าหน้าตา webมันจะ show ว่าไม่มีข้อมูลในฐานข้อมูลครับ แต่ถ้าไปดูใน database โดยใช้ phpmyadmin จะมีข้อมูลอยู่ 1 แถว

แต่ถ้าผมรอสักประมาณ 10 - 20 วินาที

ผมรันครั้งที่สามหลังจากนั้น ให้ command = ''
ปรากฎว่าหน้าตา web มันจะ show ว่ามีข้อมูล 1 แถว และใช้ phpmyadmin ดูก็มีอยู่ 1 แถว

ซึ่งผมแปลกใจครับว่าทำไมมันรอตั้ง 10-20 วินาที ผลของหน้า web ถึงตรงกับที่มีอยู่จริงในฐานข้อมูล

มีใครเคยเจอแบบนี้เปล่าครับ

----------------------------------------------------------------------------------------------------------------
ครั้งนี้ผมเลยลอง echo ตัวแปร ออกมาดูครับ เพื่อ check

โดย echo ตัวแปร mysql_thread_id($conn) ;
echo จำนวนแถวที่ได้จากการ select ใช้ mysql_num_rows() ครับ

ปรากฎว่าได้แบบนี้ครับ
เริ่มแรกก่อน run แถว = 0 แถว mysql_thread_id = 66307

ครั้งที่ 1 หลังจากให้ command = 'A'

ผลที่แสดง จำนวนแถว = 1  แถว mysql_thread_id = 66545

ครั้งที่ 2 หลังจากให้ command == ' '

ผลที่แสดง จำนวนแถว = 0 แถว mysql_thread_id = 66307

ครั้งที่ 3 หลังจากให้ command == ' '
ผลที่แสดง จำนวนแถว = 1 แถว mysql_thread_id = 66782

จะเห็นว่าครั้งที่ 2 มันผิดครับ เหมือนกับ select ออกมาก็นับจำนวนแถวผิดแล้ว ทั้งๆที่ฐานข้อมูลมีอยู่จริง
และ mysql_thread_id มันย้อนกลับเป็นจำนวนที่น้อยกว่าครับ เหมือนกับว่ามันจำผลก่อนที่จะเรียกเพจเพื่อเพิ่มข้อมูลในตารางครับ

และข้อสังเกตอีกอย่างคือ การ run คำสั่งเพิ่มหรือลดตาราง จะทำให้ mysql_thread_id เปลี่ยนไปทุกครั้ง คือเพิ่มทุกครั้ง ซึ่งค่าที่ได้จะถูกต้อง
แต่ถ้า run คำสั่ง '' โดยการ show ตารางเฉยๆ ไม่ได้ไปเพิ่มหรือ update กับ database จะทำให้ mysql_thread_id มีตัวเลขน้อยลง แล้วเหมือนกับจำค่าเก่ามาแสดงครับ


ผมใช้ browse google chrome และ IE ลองรันดูครับ ผลเป็นแบบเดียวกันคือมันจำค่าเก่าเหมือนกัน ต้องรอสักพัก เหมือนกับมัน query มาผิดครับ ไป query ของที่ยังไม่ update มา




« แก้ไขครั้งสุดท้าย: 27 มิถุนายน 2012, 19:58:56 โดย quickrich2 » บันทึกการเข้า

 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
kppser
ก๊วนเสียว
*

พลังน้ำใจ: 36
ออฟไลน์ ออฟไลน์

กระทู้: 413



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 27 มิถุนายน 2012, 19:42:51 »

ใช้ switch ง่ายกว่ามั้ยครับ

ผมเคยใช้ switch นำหน้าแล้วที่เหลือก็เขียนคำสั่งตามปกติครับ Tongue
บันทึกการเข้า

quickrich2
Newbie
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 54



ดูรายละเอียด
« ตอบ #2 เมื่อ: 27 มิถุนายน 2012, 20:06:26 »

ครับ แต่ปัญหาตอนนี้ผมไม่แน่ใจว่าเป้นเพราะอะไร ทำไม database ถึงไม่นำข้อมูลใหม่มาแสดง และตัว mysql_thread_id ก็ใช้ของเก่าครับ
บันทึกการเข้า

 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
kppser
ก๊วนเสียว
*

พลังน้ำใจ: 36
ออฟไลน์ ออฟไลน์

กระทู้: 413



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 27 มิถุนายน 2012, 20:14:13 »

ครับ แต่ปัญหาตอนนี้ผมไม่แน่ใจว่าเป้นเพราะอะไร ทำไม database ถึงไม่นำข้อมูลใหม่มาแสดง และตัว mysql_thread_id ก็ใช้ของเก่าครับ

มีโค๊ตให้ผมดูหน่อยไหมคับ wanwan016
บันทึกการเข้า

wantknow
ก๊วนเสียว
*

พลังน้ำใจ: 20
ออฟไลน์ ออฟไลน์

กระทู้: 428



ดูรายละเอียด เว็บไซต์
« ตอบ #4 เมื่อ: 27 มิถุนายน 2012, 20:30:19 »

ไม่แม่น musql นะครับ แต่ถ้าเป็นเรื่อง thread อาจต้องสั่ง commit ด้วยหรือเปล่า
อาการเหมือนไม่ได้สั่ง commit ใน mssql เลย
บันทึกการเข้า

kppser
ก๊วนเสียว
*

พลังน้ำใจ: 36
ออฟไลน์ ออฟไลน์

กระทู้: 413



ดูรายละเอียด เว็บไซต์
« ตอบ #5 เมื่อ: 27 มิถุนายน 2012, 21:37:59 »

เคลียแคชก่อนดีไหม เบราเซอร์มันอาจจำค่าเก่าๆ ทำให้การแสดงผลไม่ถูกต้องครับ Tongue
บันทึกการเข้า

tctheworld
สมุนแก๊งเสียว
*

พลังน้ำใจ: 74
ออฟไลน์ ออฟไลน์

กระทู้: 608



ดูรายละเอียด
« ตอบ #6 เมื่อ: 28 มิถุนายน 2012, 00:09:32 »

ลองใช้ คำสั่ง RESET QUERY CACHE

ก่อนเริ่มการ select นะครับ

ถ้าไม่ได้ก็ mysql_close แล้ว mysql_connect ใหม่ตอนใช้คำสั่ง select

บางที mysql มัน update cache ไม่ทันครับ เลยประมวลผลช้า
บันทึกการเข้า

MeenyFancy
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 208
ออฟไลน์ ออฟไลน์

กระทู้: 1,270



ดูรายละเอียด
« ตอบ #7 เมื่อ: 28 มิถุนายน 2012, 00:36:46 »

มีปัญหาที่ query นั้นแหละครับ
เอา query มาโชว์หน่อยครับ จะได้ช่วย investigate
บันทึกการเข้า

quickrich2
Newbie
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 54



ดูรายละเอียด
« ตอบ #8 เมื่อ: 28 มิถุนายน 2012, 12:47:34 »

แก้ได้แล้วครับ ต้องหลอก web browser

คือเจ้า web browser เนี่ยมันจำค่าหน้านั้นเอาไว้ครับ สมมติว่าเรียก a.php หลายๆครั้ง พอเรียกครั้งที่ 3,4 บางทีมันจะเอาผลของครั้งที่ 1 หรือ 2 มา show

วิธีแก้ต้องใส่ query string ลงไปครับ เป็น a.php?fakeid=123456 โดยที่ค่า fake id ต้องสุ่มเพื่อให้เปลี่ยนไปทุกครั้งครับ

แต่ที่ผมแปลกใจคือ web browser มันไม่ควรจะเก็บ cache เพราะเป็นไฟล์ php  และผมก็ gen header ที่มันเป็นเลข version ลงไป ให้แต่ละหน้ามันมีเอกลักษณ์ เพื่อป้องกันแล้ว แต่ก็แก้ปัญหานี้ไม่ได้ browser ก็ยังเอา cache มาแสดงอยู่ดี ทั้งๆที่หน้าเปลี่ยนไปแล้ว
บันทึกการเข้า

 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
MeenyFancy
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 208
ออฟไลน์ ออฟไลน์

กระทู้: 1,270



ดูรายละเอียด
« ตอบ #9 เมื่อ: 28 มิถุนายน 2012, 12:49:46 »

ใช้ ie ปะครับ มันขยันจำแคช
บันทึกการเข้า

dragons_first
สมุนแก๊งเสียว
*

พลังน้ำใจ: 113
ออฟไลน์ ออฟไลน์

กระทู้: 953



ดูรายละเอียด เว็บไซต์
« ตอบ #10 เมื่อ: 28 มิถุนายน 2012, 12:52:57 »

ลองแก้ปัญหาด้วยการกด ctrl+f5 ครับ มันจะส่งค่าล่าสุดมาให้ทันที
บันทึกการเข้า

รับทำเว็บไซต์ ตามขอบเขตของลูกค้าราคาเบาๆ

รับแก้สคริปท์ เพิ่มระบบ เปลี่ยนแปลงเลเอาท์เว็บไซต์ จัด cssใหม่ แก้การแสดงผลผิดเพี้ยน
ท่านจะได้รับการบริการที่เป็นกันเอง ราคาไม่แพง ต่อรองได้(แต่ไม่น่าเกลียด) คุยกันฉันมิตร นะฮ๊าฟฟฟฟฟ
djoser
คนรักเสียว
*

พลังน้ำใจ: 12
ออฟไลน์ ออฟไลน์

กระทู้: 152



ดูรายละเอียด
« ตอบ #11 เมื่อ: 28 มิถุนายน 2012, 13:44:33 »

ถ้าใส่ code นี้ ที่ บนสุดของ file
<?php session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

/* set the cache expire to 30 minutes */
session_cache_expire(30);
$cache_expire = session_cache_expire();

/* start the session */

session_start();
 
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");   

?>

มันยังจำอยู่ไหมคะ
บันทึกการเข้า
quickrich2
Newbie
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 54



ดูรายละเอียด
« ตอบ #12 เมื่อ: 28 มิถุนายน 2012, 14:11:58 »

ถ้าใส่ code นี้ ที่ บนสุดของ file
<?php session_cache_limiter('private');
$cache_limiter = session_cache_limiter();

/* set the cache expire to 30 minutes */
session_cache_expire(30);
$cache_expire = session_cache_expire();

/* start the session */

session_start();
 
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");   

?>

มันยังจำอยู่ไหมคะ

ลองแล้วครับ มันยังจำค่าเก่าอยู่เลยครับ  แต่ถ้าห้อย query string ไว้ด้านท้าย เปลี่ยนทันทีเลยครับ แปลกดีเหมือนกัน แต่วิธีของคุณ djoser จะดีกว่า เพราะมันจะไม่มี url เยอะแยะมากมาย เกิด duplicate content
บันทึกการเข้า

 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
quickrich2
Newbie
*

พลังน้ำใจ: 2
ออฟไลน์ ออฟไลน์

กระทู้: 54



ดูรายละเอียด
« ตอบ #13 เมื่อ: 28 มิถุนายน 2012, 14:12:38 »

ใช้ ie ปะครับ มันขยันจำแคช

ใช้ทั้ง ie และ chrome ครับ จำทั้งคู่เลย
บันทึกการเข้า

 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
 *Link Removed*
หน้า: [1]   ขึ้นบน
พิมพ์