ผมลองฝึกเขียนดู แต่มีที่ติดปัญหาคือ ตอน select 2 ขั้นนี่แหละครับ
ผมจะ select คือ สุนัขที่มีสีดำทั้งหมด
mysqli ปกติ ผมเขียนแบบนี้
อ้างถึง$db = new db()
$db->connect_db();
$sql1 = $db->mysqli->query("select * from color);
while($rs1 = $sql1->fetch_assoc()){
print "$rs1['name']";
$sql2 = $db->mysqli->query("select * from dogs where color_id = '".$rs1['id']."'");
while($rs2 = $sql2->fetch_assoc()){
print "$rs2['name']";
}
}
pdo ผม select ได้แค่ชั้นเดียว นั่งทำทั้งวันแล้วครับ
อ้างถึง$sql = "select * from color";
$query = $this->db->prepare($sql);
$query->execute();
return $query->fetchAll();
แนะนำด้วยนะครับ
ผลลัพธ์ที่ต้องการครับ select ออกมาแบบน้ครับ
สุนัขสีดำ
1. ชื่อสุนัข
2. ชื่อสุนัข
3. ชื่อสุนัข
สุนัขสีส้ม
1. ชื่อสุนัข
2. ชื่อสุนัข
3. ชื่อสุนัข
ถ้าเป็นผม จะใช้ตารางที่ 2 เป็นหลักครับ คือตารางชื่อสุนัขเลย เช่น
TABLE : COLOR
COLOR_ID | COLOR_NAME
1 | YELLOW
2 | BLUE
3 | BLACK
##########################
Table : DOG
DOG_ID | DOG_NAME | DOG_COLOR_ID
1 | DOG 001 | 1
2 | DOG 002 | 1
3 | DOG 003 | 2
4 | DOG 004 | 2
5 | DOG 005 | 3
6 | DOG 006 | 3
Sql Statement :
select
DOG.DOG_ID,DOG.DOG_NAME,DOG.DOG_COLOR_ID
COLOR.COLOR_NAME
FROM DOG
inner join COLOR on DOG.DOG_COLOR_ID=COLOR.COLOR_ID
ORDER BY COLOR.COLOR_ID ASC
ตารางที่จะได้คือ
DOG_ID | DOG_NAME | DOG_COLOR_ID | COLOR_NAME
1 | DOG 001 | 1 | YELLOW
2 | DOG 002 | 1 | YELLOW
3 | DOG 003 | 2 | BLUE
4 | DOG 004 | 2 | BLUE
5 | DOG 005 | 3 | BLACK
6 | DOG 006 | 3 | BLACK
==============================================
ปล. อาจจะไม่ตรงกับคำตอบ แต่เสริมในการเรียกใช้ Sql Statment ให้จบภายในคำสั่งเดียว ระบบจะ Query เร็วกว่ามากครับ แต่คำตอบในส่วนของ pdo_mysql นั้นไม่เคยใช้ครับ ขอบคุณครับ
ใช้ Eloquent อยู่ง่ายมากๆ
User::find(1); เท่ากับ "select * from users where id = 1";
http://laravel.com/docs/4.2/eloquent
pdo ก็ทำได้ครับ โดยใช้หลักการเดียวกันแบบนี้ครับ
$stmt = $db->query('select * from color');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo 'dog color ',$row['name'],'<br>';
$stmt2 = $db->prepare('select * from dogs where color_id = :id');
$stmt2->bindValue(':id', $row['id']);
$stmt2->execute();
$i = 1;
while($row2 = $stmt2->fetch(PDO::FETCH_ASSOC)) {
echo $i++,'. ',$row2['name'],'<br>';
}
echo '<br>';
}
ใช้โครงสร้างตาม narincr แนะนำครับ สามารถ query ได้แบบนี้
<?php
$db = new PDO("mysql:host=127.0.0.1;dbname=animals");
// query dogs using narincr's recommended schema (with minor column name changed)
$dogs = $db->query("SELECT d.id, d.name, c.name AS color FROM dog d INNER JOIN color c on c.id=d.color_id ORDER BY c.id ASC");
// statement returned from PDO::query() can be directly iterated, it's a nice feature ^^
foreach ($dogs as $dog) {
var_dump($dog);
}
กรณีไม่มี parameter binding ใช้ PDO::query() (http://php.net/manual/en/pdo.query.php) ก็สะดวกดีครับ
แต่ถ้ามีใช้ prepare ตามเดิมดีแล้วครับ
ขอถามนอกเรื่องของ จขกท. นะครับ
ทำไมถึงไม่ใช้ join อะครับ (อันนี้ผมไม่ทราบจริงๆว่ามันต่างกันยังไง performance หรือปล่าวครับ) :wanwan017:
อ้างถึงจาก: kanin03 ใน 31 ตุลาคม 2014, 01:48:24
ขอถามนอกเรื่องของ จขกท. นะครับ
ทำไมถึงไม่ใช้ join อะครับ (อันนี้ผมไม่ทราบจริงๆว่ามันต่างกันยังไง performance หรือปล่าวครับ) :wanwan017:
ผมลอง join แล้วมันออกมา 1:1 ครับ ประมาณว่าแบบนี้ครับ
สุนัขสีดำ
1. ชือสุนัข
สุนัขที่ส้ม
1.ชื่อสุนัข
อยากได้รายการในหมวดหมู่ทั้งหมดครับ ประมาณนี้ครับ
สุนัขสีดำ
1. ชื่อสุนัข
2. ชื่อสุนัข
สุนัขสีส้ม
1. ชื่อสุนัข
2. ชื่อสุนัข
3. ชื่อสุนัข
ผมยังเขียนไม่เก่ง ก็เลยเอามาปรึกษา บอร์ดดูครับ
อ้างถึงจาก: goldxp ใน 30 ตุลาคม 2014, 23:32:12
pdo ก็ทำได้ครับ โดยใช้หลักการเดียวกันแบบนี้ครับ
$stmt = $db->query('select * from color');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo 'dog color ',$row['name'],'<br>';
$stmt2 = $db->prepare('select * from dogs where color_id = :id');
$stmt2->bindValue(':id', $row['id']);
$stmt2->execute();
$i = 1;
while($row2 = $stmt2->fetch(PDO::FETCH_ASSOC)) {
echo $i++,'. ',$row2['name'],'<br>';
}
echo '<br>';
}
ผมทำได้แล้ว ตามนี้พี่ goldxp ครับ +1 สำหรับน้ำใจที่แนะนำนะครับ
ขอบคุณพี่ๆ มากกว่าที่มาให้คำแนะนำ
ขอถามอะไรต่อ หน่อยนะครับ
การรับค่า binValue มันดียังไงครับ ไปอ่านมาเค้าบอกแค่การรับค่าของ pdo
อยากทราบข้อดีขอเสีย ครับ
$stmt2 = $db->prepare('select * from dogs where color_id = :id');
$stmt2->bindValue(':id', $row['id']);
แล้วถ้าผมเขียนแบบนี้ จะเกิดของเสียอะไรครับ
$stmt2 = $db->prepare('select * from dogs where color_id = $row['id']');
เอาค่า $row['id'] ยัดใส่เลย จะไม่ต้องเขียนหลายที ผมส่งสัยครับ
:wanwan031:
ลองศึกษาพวก one to one , one to many , many to many ดู
อ้างถึงจาก: JumDaiDee ใน 31 ตุลาคม 2014, 06:32:06
ขอถามอะไรต่อ หน่อยนะครับ
การรับค่า binValue มันดียังไงครับ ไปอ่านมาเค้าบอกแค่การรับค่าของ pdo
อยากทราบข้อดีขอเสีย ครับ
$stmt2 = $db->prepare('select * from dogs where color_id = :id');
$stmt2->bindValue(':id', $row['id']);
แล้วถ้าผมเขียนแบบนี้ จะเกิดของเสียอะไรครับ
$stmt2 = $db->prepare('select * from dogs where color_id = $row['id']');
เอาค่า $row['id'] ยัดใส่เลย จะไม่ต้องเขียนหลายที ผมส่งสัยครับ
:wanwan031:
จะทำอย่างงั้นก็ได้ แต่แนะนำว่าให้ใช้การ binding เสมอครับ เพราะ
1. การ binding คือการป้องกัน sql injection ครับ
2. อ่าน query ง่ายกว่าครับ
ถึงแม้จะชัวร์แค่ไหนว่าไม่โดน sql injection ก็ควรทำ binding อยู่ดีครับ
ขอบพระคุณพี่ๆ ที่แนะนำให้ความรู้ครับ
:wanwan020: :wanwan020: