ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => หัวข้อเริ่มโดย: JumDaiDee ใน 30 ตุลาคม 2014, 21:57:58

ชื่อเรื่อง: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: JumDaiDee ใน 30 ตุลาคม 2014, 21:57:58
ผมลองฝึกเขียนดู แต่มีที่ติดปัญหาคือ ตอน 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. ชื่อสุนัข
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: narincr ใน 30 ตุลาคม 2014, 22:20:52
ถ้าเป็นผม จะใช้ตารางที่ 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 นั้นไม่เคยใช้ครับ ขอบคุณครับ
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: Queue ใน 30 ตุลาคม 2014, 23:06:12
ใช้ Eloquent อยู่ง่ายมากๆ

User::find(1); เท่ากับ "select * from users where id = 1";

http://laravel.com/docs/4.2/eloquent
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: 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>';
}
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: ball6847 ใน 30 ตุลาคม 2014, 23:38:47
ใช้โครงสร้างตาม 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 ตามเดิมดีแล้วครับ
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: kanin03 ใน 31 ตุลาคม 2014, 01:48:24
ขอถามนอกเรื่องของ จขกท. นะครับ

ทำไมถึงไม่ใช้ join อะครับ (อันนี้ผมไม่ทราบจริงๆว่ามันต่างกันยังไง performance หรือปล่าวครับ) :wanwan017:
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: JumDaiDee ใน 31 ตุลาคม 2014, 06:15:06
อ้างถึงจาก: kanin03 ใน 31 ตุลาคม 2014, 01:48:24
ขอถามนอกเรื่องของ จขกท. นะครับ

ทำไมถึงไม่ใช้ join อะครับ (อันนี้ผมไม่ทราบจริงๆว่ามันต่างกันยังไง performance หรือปล่าวครับ) :wanwan017:

ผมลอง join แล้วมันออกมา 1:1 ครับ ประมาณว่าแบบนี้ครับ

สุนัขสีดำ
1. ชือสุนัข

สุนัขที่ส้ม
1.ชื่อสุนัข

อยากได้รายการในหมวดหมู่ทั้งหมดครับ ประมาณนี้ครับ
สุนัขสีดำ
1. ชื่อสุนัข
2. ชื่อสุนัข

สุนัขสีส้ม
1. ชื่อสุนัข
2. ชื่อสุนัข
3. ชื่อสุนัข

ผมยังเขียนไม่เก่ง ก็เลยเอามาปรึกษา บอร์ดดูครับ
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: JumDaiDee ใน 31 ตุลาคม 2014, 06:17:55
อ้างถึงจาก: 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 สำหรับน้ำใจที่แนะนำนะครับ
ขอบคุณพี่ๆ มากกว่าที่มาให้คำแนะนำ
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: 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:
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: nagis ใน 31 ตุลาคม 2014, 20:48:38
ลองศึกษาพวก one to one , one to many , many to many ดู
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: MapTwoZa ใน 31 ตุลาคม 2014, 20:55:07
อ้างถึงจาก: 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 อยู่ดีครับ
ชื่อเรื่อง: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
โพสต์โดย: JumDaiDee ใน 01 พฤศจิกายน 2014, 11:47:23
ขอบพระคุณพี่ๆ ที่แนะนำให้ความรู้ครับ
:wanwan020: :wanwan020: