mysqli กับ mysql pdo
ในเชิงลึกๆ ผมไม่แน่ใจนะว่ามันต่างกันยังไง
ซึ่งปรกติผมก็ไม่ได้ใช้ pdo ตรงๆครับ
ผมจะใช้ doctrine2 เป็นตัวจัดการ database อีกที ( ที่เลือกใช้ตัวนี้เพราะมันเป็น framework ที่แทบจะเหมือนกับ JPA ใน java ทำให้ผมไม่ต้องเรียนรู้อะไรมากมาย แล้วเท่าที่อ่าน review ก็ถือเป็นตัวที่ดีที่สุดตัวนึงบน php )
http://www.doctrine-project.org/ 
ก่อนเริ่ม pdo vs mysqli มาดูก่อนครับว่าทำไมเค้าเอา mysql ธรรมดาออก
เหตุผลก็คือ เพราะมันไม่มี prepare statement ครับ
ซึ่ง prepare statement จำเป็นมากในด้านการป้องการ sql injection ในภาษาอื่นๆ ก็สามารถใช้ prepare statement ได้เกือบทั้งหมด
แล้ว prepare statement ก็กัน sql injection ได้ 100%
ประเด็นต่อไป mysqli vs pdo
pdo มีความเป็น oop มากกว่า แล้วเหมาะนำไปใช้ใน ORM มากกว่า เอาข้อดีของ pdo ที่เหนือกว่า mysqli ก่อนละกัน
1. auto injection คือมันสามารถ query มาแล้ว auto set parameter ลง object ได้เลยครับ ตัวอย่างข้างล่าง (ตรงนี้ mysqli ก็มี แต่ดูแล้วยุ่งยากกว่านิดๆ ไม่เป็นไปในเชิง OO เท่าไรด้วย)
$dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)
$stmt = $dbh->query("SELECT * FROM students");
/* MAGIC HAPPENS HERE */
$stmt->setFetchMode(PDO::FETCH_INTO, new Student);
foreach($stmt as $student)
{
echo $student->getFullName().'<br />';
}
2. database support
mysqli ใช้ได้กับ mysql อย่างเดียว
กลับกัน pdo รองรับ database ได้ถึง 12 แบบ
โปรเจคเปลี่ยนจาก mysql เป็น sql server
โครงสร้างเดิม เปลี่ยน driver ก็ใช้งานได้ปรกติครับ
3. binding parameter
pdo สามารถ bind ใส่ name ที่ต้องการได้ครับ
แต่ mysqli ต้อง bind ตามลำดับเท่านั้น !!#PDO
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);
$pdo->prepare('
SELECT * FROM users
WHERE username = :username
AND email = :email
AND last_login > :last_login');
$pdo->execute($params);
#MySQLi
$query = $mysqli->prepare('
SELECT * FROM users
WHERE username = ?
AND email = ?
AND last_login > ?');
$query->bind_param('sss', 'test', $mail, time() - 3600);
$query->execute();