ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ

เริ่มโดย JumDaiDee, 30 ตุลาคม 2014, 21:57:58

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

JumDaiDee

ผมลองฝึกเขียนดู แต่มีที่ติดปัญหาคือ ตอน 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. ชื่อสุนัข
สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com

narincr

ถ้าเป็นผม จะใช้ตารางที่ 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 นั้นไม่เคยใช้ครับ ขอบคุณครับ
รับทำเว็บไซท์ แก้ไข Script CMS  โปรเจ็คนักศึกษา Script PHP ทุกชนิด รับงานเร่ง งานด่วน รับภายใน 3-5 วัน โทรหรือ Line มาคุยกันได้ครับ
DO-PHP.COM , DO-PHP.COM , DO-PHP.COM
Mobile : 092-1064587 , Line : narin.php Email : narin.cr@gmail.com

Queue

ใช้ Eloquent อยู่ง่ายมากๆ

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

http://laravel.com/docs/4.2/eloquent

goldxp

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>';
}
[direct=http://web-programming-bookmark.blogspot.com/p/blog-page.html]รับแก้ไขเว็บ[/direct]

ball6847

ใช้โครงสร้างตาม 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() ก็สะดวกดีครับ
แต่ถ้ามีใช้ prepare ตามเดิมดีแล้วครับ
We use Ubuntu.

[direct=http://ng-seo.sourcelab.xyz/]AngularJS SEO Experimental[/direct]

kanin03

ขอถามนอกเรื่องของ จขกท. นะครับ

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

JumDaiDee

อ้างถึงจาก: kanin03 ใน 31 ตุลาคม 2014, 01:48:24
ขอถามนอกเรื่องของ จขกท. นะครับ

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

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

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

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

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

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

ผมยังเขียนไม่เก่ง ก็เลยเอามาปรึกษา บอร์ดดูครับ
สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com

JumDaiDee

อ้างถึงจาก: 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 สำหรับน้ำใจที่แนะนำนะครับ
ขอบคุณพี่ๆ มากกว่าที่มาให้คำแนะนำ
สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com

JumDaiDee

ขอถามอะไรต่อ หน่อยนะครับ
การรับค่า 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:
สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com

nagis

ลองศึกษาพวก one to one , one to many , many to many ดู

MapTwoZa

#10
อ้างถึงจาก: 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 อยู่ดีครับ
Good code quality Developer :D

JumDaiDee

ขอบพระคุณพี่ๆ ที่แนะนำให้ความรู้ครับ
:wanwan020: :wanwan020:
สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com