คือผมมีหน้า show.php นะครับ เอาไว้ query ข้อมูล member มาโชว์(พวกชื่อ, อีเมล์, อื่นๆ)
แบบ1 ขอยกตัวอย่างฟิลด์สั้นๆนะครับ ตอนนี้ใช้ใน show.php
== เก็ท topicid จาก url ==
$topicid = intval($_GET['topicid']);
SELECT topic.memberid
FORM topic
WHERE topic.topicid = '$topicid'";
== แล้วเอาค่า memberid จากตาราง topic มาดึง profile ==
SELECT member.name,member.email,field อีกเยอะ
FORM member
WHERE member.mid = 'member_id'";
=================================
แบบ2 จะเปลี่ยนเป็นเขียนฟังก์ชั่นใส่ function.inc.php
function select_profile($field,$memberid){
$s_profile="SELECT member.$field
FORM member
WHERE member.mid = '$memberid'";
$q_profile=mysql_query($s_profile);
$f_profile=mysql_fetch_array($s_profile);
mysql_free_result($q_profile);
return $f_profile['$field'];
}
== ใน show.php ก็เรียกใช้ฟังก์ชั่น ==
select_profile(field_name,memberid);
select_profile(field_email,memberid);
select_profile(field_phone,memberid);
select_profile(field_ip,memberid);
......เรียกฟังก์ชั่น เพื่อดึงค่าอีกเยอะ
อยากถามว่าแบบฟังก์ชั่น เท่ากับเรา SELECT DB หลายๆครั้งใช่ไหมครับ แสดงว่าแบบ1 ดีกว่า เพราะ SELECT DB ครั้งเดียว
ปล.โค้ดผิดก็ผ่านก่อนนะครับ เพราะเขียนสดใส่บล๊อกนันเลย ^_____^"
ทำไมไม่เว้นบันทัด
KonIndy Fri, 08/02/2013 - 15:44
ทำไมไม่เว้นบันทัด T______________T"
คิดง่ายๆครับสมมติถ้ามี 10
cornario Fri, 08/02/2013 - 16:58
คิดง่ายๆครับสมมติถ้ามี 10 fields
แบบแรก DB ต้องตอบ 1(2) ครั้ง
แบบสอง DB ต้องตอบ 10 ครั้ง
ยังไม่นับเรื่องที่ server ต้อง handle อีกนะครับ
ปล. แบบแรกยังสั้นได้อีกนะครับ แต่ก็แล้วแต่ความต้องการ/ความ complex ของงานล่ะนะ
อันแรก
adente Fri, 08/02/2013 - 17:01
อันแรก ดึงสองครั้งเลยครับ
อันที่สอง ดึงที่ละฟิลค์เลย โหดขิงๆ
ลองคิดดูว่า ถ้าต้องการดึงข้อมูลของ member 5 คน คนละมาสัก 20 ฟิลด์อันใหนมันจะเร็วกว่ากัน หรือไม่ก็ลองcodดูครับ จะได้เข้าใจอย่างถ่องแท้
555 แสดงว่าใช้แบบ1
KonIndy Fri, 08/02/2013 - 17:25
555 แสดงว่าใช้แบบ1 ดีกว่า
โค้ดผิดจริงด้วย ถามเสร็จ ไปลองเขียนฟังก์ชั่น สรุปมัน return ไม่ออก....เพราะเขียน FORM ผิด 555
งั้นใช้แบบเดิมดีกว่า อิอิ ขอบคุณมากๆ
ใช้คำสั่ง left outer join ดู
srel90 Fri, 08/02/2013 - 17:27
ใช้คำสั่ง left outer join ดู
SELECT topic.*,member.* FROM
srel90 Fri, 08/02/2013 - 17:33
SELECT topic.*,member.* FROM topic topic LEFT OUTER JOIN member member ON topic.memberid=member.mid WHERE topic.topicid = '$topicid'";
พวก JOIN นี่ผมเข็ดเลยล่ะครับ
KonIndy Fri, 08/02/2013 - 17:51
พวก JOIN นี่ผมเข็ดเลยล่ะครับ เคยทำเว็บโฆษณาฟรี row เพียบ(ทั้ง topic, pic, member, บลาๆ).
สุดท้ายลองนั่งแก้โค้ด JOIN เป็น SELECT ตารางต่อๆกัน การโหลดหน้าเว็บไวขึ้นเยอะ.
ผมว่า JOIN มันจะอืดกว่า SELECT ตารางต่อๆกันน่ะครับ(เจอมากับตัวนะ เลยกล้าพูดได้เต็มปาก ^____^")
ปล.ลองอัดข้อมูลเข้าดีบีสัก 10,000-50,000 row แล้วเทียบโค้ดดูครับ(แต่ใครทำเว็บ ไม่มีสมาชิกก็ใช้ JOIN จะสะดวกกว่า โค้ดอ่านง่าย)
join แล้วไม่มี index ตัวที่
adente Fri, 08/02/2013 - 18:10
In reply to พวก JOIN นี่ผมเข็ดเลยล่ะครับ by KonIndy
join แล้วไม่มี index ตัวที่ join หรือเปล่าครับ
นั่นแหละครับ
massacre Fri, 08/02/2013 - 18:12
In reply to join แล้วไม่มี index ตัวที่ by adente
นั่นแหละครับ ปัญหาของคนที่ยังไม่รู้จัก database ดีพอ
ไปศึกษาเรื่อง Index ก่อนครับ
figgaro Fri, 08/02/2013 - 18:59
In reply to พวก JOIN นี่ผมเข็ดเลยล่ะครับ by KonIndy
ไปศึกษาเรื่อง Index ก่อนครับ ส่วนการ Query ที่มี pattern Syntax เหมือนเดิมนั้น DBMS มันมี Caching อยู่แล้ว
INDEX DB
KonIndy Fri, 08/02/2013 - 19:26
INDEX DB ผมทำเกือบทุกฟิลด์(ในทุกตาราง)ล่ะครับ เอาเน้นๆก็ฟิลด์ที่ใช้ WHERE แบบนี้ผมทำถูกวิธีหรือป่าว ถ้าไม่ถูกช่วยแนะนำมผมที
อินเด็กผมทำแบบนี้ถูกป่าวหรอคร
KonIndy Fri, 08/02/2013 - 19:33
In reply to INDEX DB by KonIndy
อินเด็กผมทำแบบนี้ถูกป่าวหรอครับ ก๊อปมาสั้นๆ แล้วทำในตารางทุกตารางด้วย ดูใน phpmyadmin มันก็โชว์ว่าทำอินเด็กแล้วนะ
PRIMARY KEY (
abuse_id),KEY
type(type),KEY
id(id),KEY
mid(mid),KEY
ip(ip)เอาง่ายๆว่า ตัวที่ join
adente Fri, 08/02/2013 - 22:50
In reply to INDEX DB by KonIndy
เอาง่ายๆว่า ตัวที่ join กันต้องเป็น key
select something from yyy left join xxx on xxx.key1 = yyy.key2 where....
ไม่งั้นก็ใช้คำสั่ง IN คับ
srel90 Fri, 08/02/2013 - 21:35
ไม่งั้นก็ใช้คำสั่ง IN คับ Select id จากtable แรก เก็บเป็น array แล้วค่อย เอาไป IN ใน Select tableที่2
---- ลบ ---- เอาใหม่อ่าน
mahasak Fri, 08/02/2013 - 23:41
---- ลบ ----
เอาใหม่อ่าน Query ไม่ครบ
แบบแรก จะให้ดี JOIN เลยครับ
ถ้ากลัวช้า EXPLAIN QUERY ก่อน จะดูได้ว่า Index ที่ทำ Impact ไหมครับ
อย่ากลัวการ JOIN เลยครับ พอมี INDEX จะเห็นผลอย่างชัดเจนครับ
แบบที่สอง อย่าทำเลยครับ มันบาป สงสาร Database (^ ^)
ลองไปอ่านดูเรื่อง Database round trip จะเข้าใจครับ
แนะนำอีกอย่างครับ
mahasak Fri, 08/02/2013 - 23:34
แนะนำอีกอย่างครับ อาจจะไม่เกี่ยวกับกับที่จั่วหัวมาเท่าไหร่
แต่เห็นใส่ parameter ลงไปใน Query ตรงๆ เห็นแล้วหงุดหงิดแทน
ระวัง SQL Inject นะครับ
ลองดูคำสั่งพวก input filter นะครับ
แล้วก็ escape query parameter ด้วยคำสั่งตระกูล mysql_escape_* ดูนะครับ
ไม่ทำระวังจะร้องไห้ (T_T)
พวก action ผมใส่
KonIndy Sat, 09/02/2013 - 12:39
In reply to แนะนำอีกอย่างครับ by mahasak
พวก action ผมใส่ mysql_real_escape_string($value); ก่อน INSERT แล้วครับ น่าจะกันได้พอควร ถ้าไม่เจอเทพแฮก ^_____^"
ส่วนเก็ทไอดีจาก url บางทีก็เอาเข้า intval ก่อน
ไม่เห็นมีใครแนะนำผมเลยว่าโค้ด INDEX DB ของผมถูกป่าว ใครมาถามผม ผมจะได้ตอบได้ถูกต้อง.
อยากรู้ Index ถูกไหม ลอง
mahasak Sun, 10/02/2013 - 00:41
In reply to พวก action ผมใส่ by KonIndy
อยากรู้ Index ถูกไหม ลอง Explain Query ดูครับ
ลองดูง่ายๆก่อนว่า Query เป็นแบบไหน Full scan หรือเปล่า
ส่วน Index ของคุณตอนนี้มันดึง 1 row 1 query where 1 field
index ที่เขียนมาคงไม่ผิดหรอกครับ
แต่อย่างที่บอก join เถอะครับ จะได้ไม่เป็นภาระของลูกหลาน
โปรแกรมที่เขียนเมื่อ 7 ปีที่แล้ว ลูกค้ายังให้ผม MA อยู่เลย
ทำดีๆไว้ตอนนี้ วันหน้าจะได้ไม่เหนื่อยมาก
คำพูดที่บอกว่า "มีเวลาไว้ค่อยทำ" ไอ้เจ้าเวลาเนี่ย หายากมากครับ
น้อยนักที่จะมีโอกาสหาเวลากลับมาทำ
รบกวนถามเป็นความรู้หน่อยนะครั
olosol@hotmail.com Sun, 10/02/2013 - 15:29
In reply to อยากรู้ Index ถูกไหม ลอง by mahasak
รบกวนถามเป็นความรู้หน่อยนะครับ ปกติไม่ค่อยได้ใช้ mysql เท่าไหร่ อยากรู้มานานแล้วว่า tool ที่ใช้ดู explain plan ใน mysql มีรึเปล่าครับ ถ้ามีช่วยแนะนำด้วยครับ
ลองดูนะครับ
platezero Tue, 12/02/2013 - 11:39
In reply to รบกวนถามเป็นความรู้หน่อยนะครั by olosol@hotmail.com
ลองดูนะครับ ;)
http://dev.mysql.com/doc/refman/5.6/en/explain.html
http://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain-output-columns
ผมใช้ prepared statements
hiddenmin Sat, 09/02/2013 - 18:01
In reply to แนะนำอีกอย่างครับ by mahasak
ผมใช้ prepared statements
+1
platezero Tue, 12/02/2013 - 16:42
In reply to ผมใช้ prepared statements by hiddenmin
+1
อ่าาาครับ ขอบคุณทุกคนมากๆครับ
KonIndy Wed, 13/02/2013 - 14:51
อ่าาาครับ ขอบคุณทุกคนมากๆครับ เดี๋ยวผมลองไปหาอ่าน prepared statements ไม่รู้มันคืออะไร 555+
ส่วน IN() มันแทน JOIN หรือ SELECT ได้หรอครับ ผมดูๆแล้วเหมือนแค่ใช้ในตารางเดียวกัน แต่....โค้ดนี้ทำให้ผมทำระบบ like สำเร็จ อิอิ ขอบคุณมากมาย ^____^
อ่านเจอวิธีลด SELECT อีกหนึ่งทางคือ....เอาพวก displayname ใส่ไปกับตาราง title หรือ reply ด้วยเลย. แต่เวลาสาชิกแก้โปรไฟล์ก็ต้องเพิ่มโค้ดแก้จุดนี้ตามด้วย แต่ก็ถือว่าช่วยลด SELECT ได้ดีพอควร เพราะไม่มีใครแก้โปรไฟล์บ่อยๆหรอกเนอะ.