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&#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() (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
ขอถามนอกเรื่องของ จขกท. นะครับ

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

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

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

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

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

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

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


หัวข้อ: Re: ใครใช้ PHP PDO อยู่แนะนำหน่อยครับ
เริ่มหัวข้อโดย: JumDaiDee ที่ 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 สำหรับน้ำใจที่แนะนำนะครับ
ขอบคุณพี่ๆ มากกว่าที่มาให้คำแนะนำ


หัวข้อ: 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
ขอถามอะไรต่อ หน่อยนะครับ
การรับค่า 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: