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

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

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

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

กระทู้: 566



ดูรายละเอียด
« เมื่อ: 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. ชื่อสุนัข
« แก้ไขครั้งสุดท้าย: 30 ตุลาคม 2014, 22:02:03 โดย JumDaiDee » บันทึกการเข้า

สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com
narincr
คนรักเสียว
*

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

กระทู้: 197



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 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 นั้นไม่เคยใช้ครับ ขอบคุณครับ
บันทึกการเข้า

รับทำเว็บไซท์ แก้ไข 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
เจ้าพ่อบอร์ดเสียว
*

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

กระทู้: 4,296



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 30 ตุลาคม 2014, 23:06:12 »

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

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

http://laravel.com/docs/4.2/eloquent
บันทึกการเข้า

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

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

กระทู้: 556



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 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>';
}
บันทึกการเข้า

ball6847
เจ้าพ่อบอร์ดเสียว
*

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

กระทู้: 4,174



ดูรายละเอียด
« ตอบ #4 เมื่อ: 30 ตุลาคม 2014, 23:38:47 »

ใช้โครงสร้างตาม narincr แนะนำครับ สามารถ query ได้แบบนี้

โค๊ด:
<?php

$db 
= new PDO("mysql:host=127.0.0.1;dbname=animals");

// query dogs using narincr&#39;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&#39;s a nice feature ^^
foreach ($dogs as $dog) {
    
var_dump($dog);
}


กรณีไม่มี parameter binding ใช้ PDO::query() ก็สะดวกดีครับ
แต่ถ้ามีใช้ prepare ตามเดิมดีแล้วครับ
บันทึกการเข้า

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

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

กระทู้: 500



ดูรายละเอียด
« ตอบ #5 เมื่อ: 31 ตุลาคม 2014, 01:48:24 »

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

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

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

กระทู้: 566



ดูรายละเอียด
« ตอบ #6 เมื่อ: 31 ตุลาคม 2014, 06:15:06 »

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

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

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

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

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

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

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

ผมยังเขียนไม่เก่ง ก็เลยเอามาปรึกษา บอร์ดดูครับ
บันทึกการเข้า

สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com
JumDaiDee
สมุนแก๊งเสียว
*

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

กระทู้: 566



ดูรายละเอียด
« ตอบ #7 เมื่อ: 31 ตุลาคม 2014, 06:17:55 »

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
สมุนแก๊งเสียว
*

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

กระทู้: 566



ดูรายละเอียด
« ตอบ #8 เมื่อ: 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
บันทึกการเข้า

สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com
nagis
ก๊วนเสียว
*

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

กระทู้: 356



ดูรายละเอียด
« ตอบ #9 เมื่อ: 31 ตุลาคม 2014, 20:48:38 »

ลองศึกษาพวก one to one , one to many , many to many ดู
บันทึกการเข้า
MapTwoZa
ก๊วนเสียว
*

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

กระทู้: 366



ดูรายละเอียด
« ตอบ #10 เมื่อ: 31 ตุลาคม 2014, 20:55:07 »

ขอถามอะไรต่อ หน่อยนะครับ
การรับค่า 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 อยู่ดีครับ
« แก้ไขครั้งสุดท้าย: 31 ตุลาคม 2014, 20:55:58 โดย MapTwoZa » บันทึกการเข้า

Good code quality Developer Cheesy
JumDaiDee
สมุนแก๊งเสียว
*

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

กระทู้: 566



ดูรายละเอียด
« ตอบ #11 เมื่อ: 01 พฤศจิกายน 2014, 11:47:23 »

ขอบพระคุณพี่ๆ ที่แนะนำให้ความรู้ครับ
 wanwan020 wanwan020
บันทึกการเข้า

สินค้าออนไลน์ https://www.shoppook.com/product | โปรแกรมออนไลน์ : https://appnon.com
หน้า: [1]   ขึ้นบน
พิมพ์