<?php $allowed_types=array('jpg','jpeg','gif','png'); $dir ="img_pic/"; $files1 = scandir($dir); foreach($files1 as $key=>$value){ if($key>1){ $file_parts = explode('.',$value); $ext = strtolower(array_pop($file_parts)); if(in_array($ext,$allowed_types)){ echo "<img style='width:100px;' src='".$dir.$value."'/> "; } } } ?>
นำโค้ดข้างต้น แสดงรูปแบ่งหน้า
<?php $allowed_types=array('jpg','jpeg','gif','png'); $dir ="img_pic/"; $files1 = scandir($dir); $total=0; // นับจำนวนรูปทั้งหมด $pic_path=array(); foreach($files1 as $key=>$value){ if($key>1){ $file_parts = explode('.',$value); $ext = strtolower(array_pop($file_parts)); if(in_array($ext,$allowed_types)){ $pic_path[]=$dir.$value; $total++; } } } // จำนวนรายการที่ต้องการแสดง แต่ละหน้า $perPage = 2; // คำนวณจำนวนหน้าทั้งหมด $num_naviPage=ceil($total/$perPage); // กำหนดจุดเริ่มต้น และสิ้นสุดของรายการแต่ละหน้าที่จะแสดง if(!isset($_GET['page'])){ $s_key=0; $e_key=$perPage; $_GET['page']=1; }else{ $s_key=($_GET['page']*$perPage)-$perPage; $e_key=$perPage*$_GET['page']; $e_key=($e_key>$total)?$total:$e_key; } for($i=1;$i<=$num_naviPage;$i++){ echo " || <a href=\"?page=".$i."\">Page $i</a>"; } echo "<hr>"; // แสดงรายการ for($indexPicture=$s_key;$indexPicture<$e_key;$indexPicture++){ echo "<img style='width:100px;' src='".$pic_path[$indexPicture]."'/> "; } // แสดงหน้าปัจจุบัน echo "<br>Page:".$_GET['page']; ?>
อันที่จริงจะใช้ glob ก็ได้ โค๊ดจะสั้นกว่ามาก ไม่เกิน5บรรทัด
เปรียบเทียบโค้ดตัวอย่างสำหรับใช้ศึกษา php code เชื่อมต่อฐานข้อมูล ระหว่าง mysql กับ mysqli
mysql
<?php $link = mysql_connect('host mysql', 'ชื่อ', 'รหัส'); if (!$link) { die('Could not connect: ' . mysql_error()); } mysql_select_db("ชื่อฐานข้อมูล",$link); $row = mysql_fetch_array($result); echo mysql_error(); echo 'Connected successfully'; mysql_close($link); ?>
mysqli แบบProcedural style
<?php $link = mysqli_connect('host mysql', 'ชื่อ', 'รหัส', 'ชื่อฐานข้อมูล'); if (!$link) { die('Could not connect: ' . mysqli_connect_errno()); } $result = mysqli_query($link, "SELECT * WHERE 1=1"); $row = mysqli_fetch_array($result,MYSQLI_ASSOC); echo 'Connected successfully'; mysqli_close($link); ?>
mysqli แบบ OOP
<?php $link = new mysqli('host mysql', 'ชื่อ', 'รหัส', 'ชื่อฐานข้อมูล'); if ($link->connect_error) { die('Could not connect: ' . mysqli_connect_errno()); } $result = $link->query($link, "SELECT * WHERE 1=1"); $row = $link->fetch_array($result,MYSQLI_ASSOC); echo 'Connected successfully'; $link->close(); ?>
อธิบายcode การเชื่อมต่อฐานข้อมูล mysqli
1.mysql
$link = mysql_connect(‘host mysql’, ‘ชื่อ’, ‘รหัส’);
2.mysqli แบบProcedural style
คำสั่ง mysqli_connect รองรับคำสั่งมากกว่าเดิม ดังนี้
mysqli_connect(‘host mysql’, ‘ชื่อ’, ‘รหัส’, ‘ชื่อฐานข้อมูล’,’port’,’socket ‘);
ทำให้ลดบรรทัดในการเขียนโค้ดลงและง่ายขึ้น
เช่น mysqli_select_db
เช่น $link = mysqli_connect(‘host mysql’, ‘ชื่อ’, ‘รหัส’, ‘ชื่อฐานข้อมูล’);
3.mysqli แบบ OOP
คำสั่ง new mysqli รองรับคำสั่งมากกว่าเดิม ดังนี้
new mysqli(‘host mysql’, ‘ชื่อ’, ‘รหัส’, ‘ชื่อฐานข้อมูล’,’port’,’socket ‘);
ทำให้ลดบรรทัดในการเขียนโค้ดลงและง่ายขึ้น เช่น $link->select_db(“ชื่อฐานข้อมูล”);
เช่น
$link = new mysqli(‘host mysql’, ‘ชื่อ’, ‘รหัส’, ‘ชื่อฐานข้อมูล’);
การquery ข้อมูล
1. mysql
ใช้
$result = mysql_query(‘SELECT * WHERE 1=1’);
2.mysqli แบบProcedural style
ใช้คำสั่งmysqli_query เช่น
$result = mysqli_query($link, “SELECT * WHERE 1=1”);
3.mysqli แบบ OOP
ใช้คำสั่งquery มีรูปแบบ ดังนี้ $ตัวแปรการเชื่อมต่อฐานข้อมูล->query($link, “SELECT * WHERE 1=1”);
mysql_fetch_array
1. mysql
ใช้
$row = mysql_fetch_array($result);
2.mysqli แบบProcedural style
รูปแบบ mysqli_fetch_array คือ
mysql_fetch_array(result,resulttype);
เช่น
$row = mysqli_fetch_array($result,*หมายเหตุ);
3.mysqli แบบ OOP
ใช้รูปแบบfetch_array คือ $ตัวแปรการเชื่อมต่อฐานข้อมูล->fetch_array(result,resulttype);
เช่น
$row = $link->fetch_array($result,*หมายเหตุ);
* หมายเหตุ พารามิเตอร์นี้ตัวเลือกเป็นค่าคงที่แสดงให้เห็นว่าสิ่งที่ประเภทของอาร์เรย์ควรจะผลิตจากข้อมูลแถวปัจจุบันค่าที่เป็นไปสำหรับพารามิเตอร์นี้คือ MYSQLI_ASSOC ค่าคงที่
MYSQLI_NUM หรือ MYSQLI_BOTH โดยใช้ MYSQLI_ASSOC คงที่ฟังก์ชันนี้จะทำงานเหมือนกันกับที่ mysqli_fetch_assoc () ในขณะที่ MYSQLI_NUM จะทำงานเหมือนกันกับที่ mysqli_fetch_row () ฟังก์ชันตัวเลือกสุดท้าย MYSQLI_BOTH จะสร้างอาร์เรย์เดียวที่มีคุณลักษณะของทั้งสอง
ถ้าลองเปรียบเทียบ code ดูระหว่าง mysql กับ mysqli แบบProcedural style แทบจะเหมือนกัน และmysqli แบบOOP สามารถเขียน code แบบ OOP ได้อย่างสมบูรณ์ครับ รูปแบบการเขียนmysqli ที่รองรับทั้ง2แบบ
สามารถเลือกได้ ถ้าดูโค้ดจะเห็นได้ว่า mysqli_query กับ mysqli_fetch_array ได้มีการเติมตัวแปรฐานข้อมูลในตัวแปรเพื่อให้ง่ายต่อการแก้ไข
mysqli เพิ่มเติมได้ที่ http://www.php.net/manual/en/book.mysqli.php
mysqli รองรับความสามารถ 4.1+ ครับความสามารถเท่าที่จำได้ก็ไม่ค่อยได้ใช้ นะ
mysql ก็ใช้ได้ทั่วไป เพิ่ม ลบ อัพเดท อ่าน
เร็วพอๆกัน
PDO มันก็คล้ายเป็น abstract สำหรับ db หลายเจ้ามาใช้ลักษณะการทำงานร่วมกัน
แต่มันไม่ได้เจ๋งเท่าไหร่ เพราะ db หลายตัว มีฟีเจอร์เฉพาะที่ pdo ไม่สามารถ จัดการได้อย่างเหมาะสม และเขียน แบบ OO ได้ด้วย
มันออกแบบมาให้ implement ให้ฐานข้อมูลหลายชนิด ใช้เครื่องมือเดียวกันได้
mysqli รองรับ การทำ Prepare Statement ในรูปแบบของ Parameters Query ซึ่งจะตัดปัญหาเรื่องการถูก Hack ผ่าน SQL Injection และ Data Type รวมทั้ง mysqli รองรับการเขียนแบบ OOP ที่เขียนง่ายและสะดวกยิ่งขึ้น
PHP MySQL Configuration & Connect to Database (mysqli)
PHP MySQL Configuration & Connect to Database (mysqli) สำหรับ mysqli ไม่ใช่ function ใหม่ มันมีตั้งแต่ 4.1.13 เป็นต้นไป (เกือบ 10 ปี ปัจจุบันปี 2014) เป็น function ที่ถูกออกแบบไว้ติดต่อกับ Database ของ MySQL โดยเฉพาะ ซึ่งจะมาทำหน้าที่ทดแทน function เดิมอย่าง mysql เหตุผลหลักก็คือ function ของ mysql ธรรมดาจะถูก deprecated ในเร็ววัน มันค่อนข้างจะโบราณ และมีช่องโหว่เยอะ (หมายถึง เมื่อเขียนแล้วผู้ใช้มักจะทำช่องโหว์ไว้) ฉะนั้น mysqli ซึ่งเป็น function ปัจจุบันที่กำลังถูกแทนที่ mysql มันได้ถูกออกแบบให้ทำงานได้ดีกว่าเดิม ทำงานได้เร็ว และที่สำคัญ มันปลอดภัยกกว่าการใช้ในรูปแบบเดิม ๆ มาก เช่น รองรับแนวคิด OOP ขึ้น
การเขียนในรูปแบบของ Parameters Query และ Prepared Statement ที่จะผิดช่องโหว์ของการเกิดข้อผิดพลาดในการ Query ที่เกิดจากการรับค่าในรูปแบบต่างๆ รวมทั้งป้องกันการ Hack ผ่านพวก SQL Injection ได้เป็นอย่างดี
สำหรับ mysqli สามารถใช้ได้ตั้งแต่ PHP V 4.1.13 เป็นต้นไป
แต่ปัจจุบันแนะนำให้ใช้กับ PHP V 5.3 หรือ 5.4 เป็นต้นไป และ PHP Version ใหม่ ๆ ก็เปิด mysqli ให้ทันที หรือในการติดตั้งเองจำเป็นจะต้องเปิดใช้งาน php_mysqli.dll ซึ่งเป็น extension จะต้องหาไฟล์ php_mysqli.dll ที่ตรงกับ Version ของ PHP ที่เรียกใช้ด้วย
php_mysqli.dll
http://www.thaicreate.com/php/php_mysqli.dll.html
อย่าลืมว่าจะต้องหาไฟล์ php_mysqli.dll ให้ตรงกับ Version ของ PHP ด้วย (แนะนำให้ใช้ Version ใหม่ ๆ เพราะจะได้ Feature ที่ใช้งานได้ดีกว่า เช่น PHP V 5.3 ขึ้นไป)
อ่านเพิ่มเติมเกี่ยวกับ Version ของ PHP
http://php.net/manual/en/mysqli.requirements.php
การเรียกใช้งาน function ของ mysqli
connect.php
<html> <head> <title>ThaiCreate.Com PHP & MySQL (mysqli)</title> </head> <body> <?php ini_set('display_errors', 1); error_reporting(~0); $serverName = "localhost"; $userName = "root"; $userPassword = "root"; $dbName = "mydatabase"; $conn = mysqli_connect($serverName,$userName,$userPassword,$dbName); if (mysqli_connect_errno()) { echo "Database Connect Failed : " . mysqli_connect_error(); } else { echo "Database Connected."; } mysqli_close($conn); ?> </body> </html>
กรณีที่ Error นี้ นั่นคือ PHP ยังไม่รองรับ function ของ mysqli นั่นคือจะต้องทำการเปิด extension ใน php.ini ซะก่อน
ให้ Copy ไฟล์ php_mysqli.dll ไปไว้ในโฟเดอร์ของ extension
เปิดไฟล์ php.ini แล้วเปิด extension
extension=mysqli.dll
จากนั้น Restart ตัว Web Server ซะ 1 ครั้ง
Error
PHP Warning: PHP Startup: mysqli: Unable to initialize module\nModule compiled with module API=20090626, debug=0, thread-safety=0\nPHP compiled with module API=20060613, debug=0, thread-safety=1\nThese options need to match\n in Unknown on line 0
ถ้ายังไม่สามารถใช้งานได้ ให้ลองเปิด Log ของ Apache หรือ IIS ดูว่าถ้ามี Error นี้ แสดงว่าไฟล์ dll ที่ดาวน์โหลดมานั้นไม่ Support กับ PHP Version ที่ใช้งานอยู่ และอาจจะต้องหา Version ที่ตรงกับ PHP ที่เรียกใช้
วิธีการตรวจสอบง่าย ๆ ก็คือเรียกดูจาก phpinf();
ซึ่งถ้าใช้งานได้แล้ว เราจะสามารถ Connect ไปยัง Database ของ MySQL ได้เลย
ถ้าเราใช้ mysql เดิม แล้วมีการเขียนโค๊ดป้องกัน mysql injection อยู่แล้ว อย่างนั้นระดับการป้องกันการถูก hack ก็เหมือนกับ mysqli ใช่มั้ย
อ้างถึง
พอได้ครับ แต่โฮสท์จริงบางที่ก็ไม่รองรับ mysql_xxxx แบบเก่าแล้ว
ถ้าไม่คิดย้ายโปรแกรมชุดเก่าไปลงบน เวอร์ชั่นใหม่ ก็ไม่จำเป้นต้องแก้อะไรครับ
แต่ถ้าคิดจะย้าย ก็เริ่มแก้ซะแต่ตอนนี้ครับ เวอร์ขั่นใหม่ php 5.6+ ไม่ซัพพอร์ต mysql ตัวเก่าแล้วครับ
อยากเปลี่ยนเป็น mysqli เหมือนกันนะครับ แต่ต้องเปลี่ยนทุกเพจเลยครับ เยอะมากๆเลยครับ ไม่ทราบว่ามีเทคนิคการเปลี่ยนจาก mysql มาเป็น mysqli แบบง่ายๆมั้ยครับ เพราะถ้าเปลี่ยนใหม่หมดก็เหมือนต้องทำเว็บใหม่หมดเลยน่ะครับ และต้องทดสอบทุกฟังก์ชันด้วยน่ะครับ
โดยปกติผมจะใช้โค๊ดนี้ กรณี mysql
<?PHP include("connect.php"); $sql = "SELECT * FROM table WHERE column1 = '$xxx' "; $result = mysql_query($sql); $datas=mysql_fetch_array($result);{ $name = stripslashes(str_replace('\r\n', '<br>',($datas['name']))); $pro = stripslashes(str_replace('\r\n', '<br>',($datas['pro']))); } ?>
MySQLi กับ MySql ต่างกันอย่างไร
MySQLi ย่อมาจาก MySQL Improved
ซึ่งเป็นการพัฒนามาจาก MySQL ที่เราใช้กันอยู่ เพื่อให้รองรับ
หรือเรียกใช้พวกคำสั่งต่างๆ ที่มีเพิ่มขึ้นของ PHP 4.1 ขึ้นไป
ภาษาบ้านๆ ก็คือ “การต่อยอด” ดังนั้นการเลือกใช้ MySQLi ไม่มีผลต่อการ Query ของโปรแกรมเมอร์ หรือว่าการเข้าไปใน PhpMyAdmin แต่อย่างใด และในรีวิวของต่างประเทศ ก็มีการพูดถึงเรื่อง Security ที่เพิ่มขึ้นของ MySQLi ด้วยเช่นกัน
ส่วนที่เด่นโดดขึ้นมาจากเดิมของ MySQLi ก็คือในเรื่องของการเรียกใช้คำสั่งในรูปแบบของ OOP ด้วย ดังตัวอย่างด้านล่าง
ตัวอย่างคำสั่งของ MySQL
<?php //– Connet to Database mysql_connect(“localhost”, “root”, “root”); mysql_select_db(“db_name”); //– Set Charset to UTF-8 (support Thai Language) mysql_query(“SET character_set_results=utf8”); //– Query Data $sql=”SELECT name FROM product_type ORDER BY name”; $query=mysql_query($sql) or die(mysql_error()); //– Test Print String $row = mysql_fetch_array($query); echo $row[“name”]; //– End Conneted with Database mysql_close(); ?>
<?php ตัวอย่างคำสั่งของ MySQLi //– Connet to Database $mysqli = new mysqli(“localhost”,”root”,””,”db_name”); //– Set MySQLi Charset to UTF-8 (support Thai Language) $mysqli->set_charset(“utf8”); //– Query Data $sql = “SELECT * FROM product_type”; $query = $mysqli->query($sql); $row = $query->fetch_array(); $query->close(); //– Test Print String echo $row[“name”]; //– End Conneted with Database $mysqli->close(); ?>
เลิกใช้ฟังก์ชั่น mysql_xxxxx() ที่ล้าสมัย (deprecated) และเปลี่ยนมาใช้ MySQLi กันดีกว่า
การใช้ MySQLi แทนการใช้ฟังก์ชั่น mysql_xxxxx() นั้น เขียนได้ 2 แบบคือ
แบบ OOP (เรียกใช้ method ของ object) กับแบบ Procedural (เรียกใช้ฟังก์ชั่น)
OOP
$result = $mysqli->query(“SELECT * FROM `table`”);
Procedural
$result = mysqli_query($mysqli, “SELECT * FROM `table`”);
บทความนี้จะกล่าวถึงแบบ OOP เท่านั้น เพราะการเขียนแบบ OOP นั้นมีโอกาสที่จะเกิดความผิดพลาดน้อยกว่า
เหตุผลคือ การเขียน MySQLi แบบ Procedural จะต้องมีการส่งตัวแปร mysqli object ทุกครั้ง
พูดง่ายๆ คือต้องเขียนยาวกว่า และอาจจะสับสนได้ง่ายกว่า
และอาจจะทำงานช้ากว่า เพราะแบบหลังอาจจะเป็นแค่การเรียก method ของ object ที่ส่งไปในแบบ OOP นั่นเอง
ซึ่งจริงๆ แล้ว mysqli_query() อาจจะทำงานในลักษณะนี้
function mysqli_query(MySQLi $link, $query, $resultmode = MYSQLI_STORE_RESULT)
{
return $link->query($query, $resultmode);
}
การเชื่อมต่อฐานข้อมูลด้วย MySQLi
ก่อนจะใช้ MySQLi นั้น ก็เหมือนกับการใช้ฟังก์ชั่น mysql_xxxxx()
คือต้องเชื่อมต่อกับ MySQL Server ก่อน ซึ่งในแบบเดิมเราใช้ mysql_connect()
แต่ในการเขียนด้วย MySQLi จะทำได้สองแบบ
1. ด้วย MySQLi::__construct() หรือการ new mysqli()
แบบนี้จะสามารถสร้าง MySQLi Object และทำการเชื่อมต่อไปได้ในคำสั่งเดียว
$mysqli = new mysqli(‘localhost’, ‘root’, ‘password’, ‘default_db_name’);
$mysqli = mysqli_connect(‘localhost’, ‘root’, ‘password’, ‘default_db_name’);
2. สร้าง MySQLi Object ด้วย mysqli_init() และเชื่อมต่อด้วย MySQLi::real_connect()
โดย mysqli_init() จะสร้าง MySQLi Object ให้เพื่อเอาไปใช้กับ MySQLi::options() และ MySQLi::real_connect()
ความแตกต่างกับแบบแรกคือ แบบแรกจะไม่สามารถกำหนด options ให้กับการเชื่อมต่อ
เช่น ระยะเวลา timeout, คำสั่ง SQL เริ่มต้น, ตั้งค่าการเชื่อมต่อแบบ SSL ฯลฯ
$mysqli = mysqli_init();
// การปรับแต่ง options ต้องทำก่อนการเชื่อมต่อ
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3600);
// เชื่อมต่อ
$mysqli->real_connect(‘localhost’, ‘root’, ‘password’, ‘default_db_name’);
ดังนั้นในส่วนของการเชื่อมต่อ เราใช้ method/function ดังนี้
MySQLi::__construct()
mysqli_connect()
สร้าง MySQLi Object และเชื่อมต่อฐานข้อมูลไปในคราวเดียว
<?php MySQLi::__construct($host, $username, $password, $dbname) mysqli_connect($host, $username, $password, $dbname) $host ชื่อหรือ IP ของ MySQL Server เช่น 'localhost' หรือ '127.0.0.1' $username ชื่อผู้ใช้ $password รหัสผ่าน $dbname ชื่อฐานข้อมูล default ที่จะใช้กับทุกๆ query ที่อ่านค่าจากตารางโดยไม่เจาะจงฐานข้อมูล ?>
ค่าที่คืนกลับมา
คืน MySQLi Object กลับมาเสมอ ไม่ว่าผลการเชื่อมต่อจะเป็นอย่างไร
ซึ่งหากจะตรวจสอบว่าเชื่อมต่อสำเร็จหรือไม่ ต้องตรวจด้วย MySQLi::$connect_errno หรือ MySQLi::$connect_error
ตัวอย่าง
<?php $mysqli = new mysqli('localhost', 'root', 'password', 'default_db_name'); // หรือ $mysqli = mysqli_connect('localhost', 'root', 'password', 'default_db_name'); if ($mysqli->connect_errno) { echo $mysqli->connect_error; exit; } ?>
mysqli_init()
สร้าง MySQLi Object เพื่อใช้ในการตั้งค่าด้วย MySQLi::options() และเชื่อมต่อด้วย MySQLi::real_connect()
ค่าที่คืนกลับมา
MySQLi Object
ตัวอย่าง
$mysqli = mysqli_init();
MySQLi::real_connect()
เชื่อมต่อฐานข้อมูล โดยต้องเป็น MySQLi Object ที่สร้างขึ้นจาก mysqli_init() เท่านั้น
MySQLi::real_connect($host, $username, $password, $dbname)
$host ชื่อหรือ IP ของ MySQL Server เช่น ‘localhost’ หรือ ‘127.0.0.1’
$username ชื่อผู้ใช้
$password รหัสผ่าน
$dbname ชื่อฐานข้อมูล default ที่จะใช้กับทุกๆ query ที่อ่านค่าจากตารางโดยไม่เจาะจงฐานข้อมูล
ค่าที่คืนกลับมา
true หากเชื่อมต่อสำเร็จ
false หากการเชื่อมต่อเกิดความผิดพลาด โดยสามารถตรวจสอบสาเหตุของความผิดพลาดได้ด้วย MySQLi::$connect_error
ตัวอย่าง
$mysqli = mysqli_init();
$mysqli->real_connect(‘localhost’, ‘root’, ‘password’, ‘default_db_name’);
MySQLi::$connect_errno
MySQLi::$connect_error
เป็น property ที่บอกว่า การเรียกใช้ MySQLi::__construct() หรือ MySQLi::real_connect() นั้นมีความผิดพลาดเกิดขึ้นหรือไม่
โดย MySQLi::$connect_errno เป็นตัวเลขของ error code
ส่วน MySQLi::$connect_error จะเป็น error message
หากไม่มี error เกิดขึ้น MySQLi::$connect_errno จะมีค่าเป็น 0
ส่วน MySQLi::$connect_error จะมีค่าเป็น ”
ตัวอย่าง
$mysqli = mysqli_init();
// ใช้ @ ปิดการแสดง warning ไว้ในกรณีที่เราอยากจะแสดง error message ในแบบของเราเอง
@$mysqli->real_connect(‘localhost’, ‘root’, ‘password’, ‘default_db_name’);
if ($mysqli->connect_errno) {
echo $mysqli->connect_error;
exit;
}
ผลลัพธ์อาจจะเป็นเช่นนี้
Access denied for user ‘root’@’localhost’ (using password: YES)
การใช้คำสั่ง SQL
เมื่อเราได้ MySQLi Object จากการเชื่อมต่อฐานข้อมูลที่สำเร็จแล้ว
ก็มาถึงการใช้งาน MySQLi Object นั้นๆ ซึ่งโดยปกติก็คือการส่งคำสั่ง SQL ไปให้ MySQL Server ประมวลผล
ในการเขียนแบบเก่าเราใช้ฟังก์ชั่น mysql_query()
แต่ในแบบใหม่ เราจะใช้ method MySQLi::query() หรือ MySQLi::real_query() และอื่นๆ
MySQLi::query()
ส่งคำสั่ง SQL ไปให้ MySQL Server ประมวลผล
MySQLi::query($query)
$query คำสั่ง SQL ไปให้ MySQL Server ประมวลผล ซึ่งควรจะ escape ด้วย MySQLi::real_escape_string()
ค่าที่คืนกลับมา
false หากเกิดความผิดพลาด ซึ่งสามารถตรวจสอบสาเหตุของความผิดพลาดได้ด้วย MySQLi::$errno และ MySQLi::$error
true หากคำสั่ง SQL ที่ส่งไปเป็นคำสั่งที่ไม่คืนผลลัพธ์เป็นข้อมูลกลับมา เช่น INSERT, UPDATE, DELETE ฯลฯ
MySQLi_Result Object หากคำสั่ง SQL ที่ส่งไปเป็นคำสั่งที่อ่านข้อมูลกลับมา เ่ช่น SELECT, SHOW, EXPLAIN ฯลฯ
ตัวอย่าง การ INSERT
// escape ค่าที่มาจากผู้ใช้เพื่อป้องกัน SQL Injection
$_POST[‘username’] = $mysqli->real_escape_string($_POST[‘username’]);
$_POST[‘password’] = $mysqli->real_escape_string($_POST[‘password’]);
// $result จะเ็ป็น Boolean true หรือ false บอกว่าการ query นั้นๆ สำเร็จหรือไม่
$result = $mysqli->query(
”
INSERT INTO `users`
(`username`, `password`)
VALUES
(‘$_POST[username]’, ‘$_POST[password]’)
”
);
ตัวอย่างการ SELECT
// escape ค่าที่มาจากผู้ใช้เพื่อป้องกัน SQL Injection
$_POST[‘id’] = $mysqli->real_escape_string($_POST[‘id’]);
// $result จะเป็น instance ของคลาส MySQLi_Result
$result = $mysqli->query(“SELECT * FROM `users` WHERE `id` = ‘$_POST[id]'”);
// ซึ่งจะมี method ที่เกี่ยวข้องกับการดึงข้อมูล เทียบเท่ากับฟังก์ชั่นพวก mysql_fetch_xxxxx()
$row = $result->fetch_assoc();
// แสดงข้อมูลแถวแรก
echo $row[‘username’];
MySQLi_Result Object
เป็น Object ที่จะได้จากการเรียกใช้ method MySQLi::query() (และอื่นที่คล้ายคลึงกัน)
ซึ่งเป็น Object ที่มี method ในการตรวจสอบและดึงข้อมูล
กระบวนการ query และรับ result นี้ ผมขอเปรียบกับการสั่งซื้อของกับยี่ปั๊วทางโทรศัพท์
ซึ่งการ query คือการโทรไปสั่งซื้อ บอกว่าต้องการอะไร
และ result ที่ได้รับกลับคืนมาจากการ query นั้น “ยังไม่ใช่สินค้า”
แต่เป็น “รถขนสินค้าและพนักงานยกของ”
<?php // เฮียๆ สั่งเบียร์หน่อย เอาสิงห์ กับช้างนะ รวมๆ กันมา 50 ลังล่ะกัน $result = $mysqli->query( " SELECT * FROM `stock` WHERE `type` = 'beer' AND `brand` IN ('Singha', 'Chang') LIMIT 50 " ); // เปรียบให้ $result คือรถขนสินค้า ที่ตอนนี้บรรทุกเบียร์ที่สั่งไปอยู่เต็มคันรถ // ถามขนขับรถดูซิว่าขนมากี่ลัง ครบมั้ย echo $result->num_rows; // ให้พนักงานขนของช่วยขนเบียร์ลงมาดูสักลังก่อนซิ $item = $result->fetch_assoc(); // โอเค ถูกต้อง ยกมาหมดเลยล่ะกัน $warehouse = array(); // ขนลงมาเรื่อยๆ จนกว่าจะไม่มีของให้คนแล้ว while (($item = $result->fetch_assoc())) { // ยกเบียร์เข้าไปเก็บในโกดังทีละลัง $warehouse[] = $item; } // บอกให้คนขับรถกลับไปได้แล้ว $result->free(); ?>
MySQLi_Result::fetch_xxxxx()
เป็น method ที่ใช้ดึงข้อมูลที่ได้มาจากการ query ซึ่งมีหลาย method ด้วยกัน แตกต่างตามชนิดข้อมูลที่คืนมา
MySQLi_Result::fetch_assoc() ข้อมูลที่ได้จะเป็น associative array
MySQLi_Result::fetch_row() ข้อมูลที่ได้จะเป็น indexed array
MySQLi_Result::fetch_array() ข้อมูลที่ได้จะเป็นทั้ง indexed array และ associative array
MySQLi_Result::fetch_object() ข้อมูลที่ได้จะเป็น object
โดยปกติเราจะใช้ MySQLi_Result::fetch_assoc() เป็นหลัก
และไม่ควรใช้ MySQLi_Result::fetch_array() เพราะจะทำให้เปลืองหน่วยความจำโดยใช่เหตุ
ตัวอย่าง MySQLi_Result::fetch_assoc()
$result = $mysqli->query(“SELECT * FROM `games`”);
$row = $result->fetch_assoc();
print_r($row);
// เข้าถึงด้วยชื่อคอลัมน์ในตาราง
echo $row[‘title’];
ผลลัพธ์
Array
(
[id] => 1
[released] => 2012-09-20
[title] => Pro Evolution Soccer 2013
[price] => 1090
)
Pro Evolution Soccer 2013
ตัวอย่าง MySQLi_Result::fetch_row()
$result = $mysqli->query(“SELECT * FROM `games`”);
$row = $result->fetch_row();
print_r($row);
// เข้าถึงข้อมูลด้วยลำดับของคอลัมน์ในตาราง
echo $row[2];
ผลลัพธ์
Array
(
- => 1
[1] => 2012-09-20
- [2] => Pro Evolution Soccer 2013
- [3] => 1090
- )
- Pro Evolution Soccer 2013
- ตัวอย่าง MySQLi_Result::fetch_array()
- $result = $mysqli->query(“SELECT * FROM `games`”);
- $row = $result->fetch_array();
- print_r($row);
- // เข้าถึงข้อมูลได้ทั้งสองแบบ
- echo $row[‘2’];
- echo $row[‘title’];
- ผลลัพธ์เป็น array ที่มี key ทั้งสองแบบ แต่ไม่ควรใช้เพราะเปลืองหน่วยความจำ (จะเห็นว่ามีข้อมูลที่ซ้ำกัน)
- Array
- (
- => 1
[id] => 1
[1] => 2012-09-20
[released] => 2012-09-20
[2] => Pro Evolution Soccer 2013
[title] => Pro Evolution Soccer 2013
[3] => 1090
[price] => 1090
)
Pro Evolution Soccer 2013Pro Evolution Soccer 2013
ตัวอย่าง MySQLi_Result::fetch_row()
$result = $mysqli->query(“SELECT * FROM `games`”);
$row = $result->fetch_object();
print_r($row);
// ต้องเข้าถึงข้อมูลในแบบ Object
echo $row->title;
ผลลัพธ์เป็นชนิด Object
stdClass Object
(
[id] => 1
[released] => 2012-09-20
[title] => Pro Evolution Soccer 2013
[price] => 1090
)
Pro Evolution Soccer 2013
MySQLi_Result::free()
ทำลายข้อมูลที่ query มาก่อนหน้า เพื่อคืนหน่วยความจำให้กับระบบ
ในการ query เพื่อให้ได้ MySQLi_Result Object นั้น ทุกๆ ครั้ง MySQL จะต้องเก็บผลลัพธ์ที่ได้ไว้ใน buffer ก่อน
ซึ่งอาจจะเป็นในหน่วยความจำ (RAM) หรือในฮาร์ดดิสก์
หลังจากนั้นจึงให้ผู้ใช้อ่านข้อมูลด้วย method fetch_xxxxx() ตามที่กล่าวมาข้างต้น
ซึ่ง buffer ที่ว่านี้จะยังคงอยู่ และยังคงกินทรัพยากรระบบ
จนกว่าจะมีการเรียก method นี้ หรือจนกว่าโปรแกรม PHP จะจบการทำงาน
ดังนั้นเราควรเรียกใช้ method นี้ทุกครั้งเมื่ออ่านข้อมูลออกมาจนครบ หรือไม่ต้องการอ่านข้อมูลจาก MySQLi_Result Object นั้นๆ แล้ว
ตัวอย่าง
$result = $mysqli->query(“SELECT * FROM `games`”);
while (($row = $result->fetch_assoc())) {
// do something
}
$result->free();
MySQLi_Result::$num_rows
จำนวนแถวที่อยู่ในผลลัพธ์
ตัวอย่าง MySQLi_Result::fetch_row()
$result = $mysqli->query(“SELECT * FROM `games` LIMIT 10”);
echo $result->num_rows;
ผลลัพธ์
10
http://www.thaicreate.com/php/forum/095986.html
อ่านบทความที่อาจจะมีการอัพเดทมากกว่าในกระทู้นี้ ที่นี่
http://www.thaicreate.com/community/basic-mysqli-reference.html
ภาษา
$mysqli->set_charset(‘utf8’);