การเขียน Config สำหรับ CakePHP

เวลาเขียนโปรเจ็คที่มีต้องมีการใช้ค่ากลางร่วมกันหลายๆ โมดูล เพื่อให้ง่ายต่อการจัดการทั้งตอน Dev และ Production เราจึงจำเป็นที่จะต้องแยกค่ากลางเหล่านี้ออกจาก code

ใน CakePHP มีไดเร็กทอรี่หลักสำหรับการเก็บ Config ทั้งหมดของระบบคือ app/Config 

cakephp_config

ในไดเร็กทอรี่นี้เราจะสร้างไฟล์ขึ้นมาอีก 1  ไฟล์เพื่อจัดเก็บ Config ทั้งหมด ในที่นี้สร้างไฟล์ configs.php

ภายในไฟล์ configs.php ที่สร้างขึ้นมาใหม่ ค่าต่างๆ ที่ต้องการกำหนดจะต้องอยู่ภายใต้ตัวแปร $config ในรูปแบบ array ตัวอย่างดังรูปภาพด้านล่าง

cakephp_config2

การเรียกใช้ค่าจากไฟล์ configs.php ให้เรียกใช้ผ่านฟังก์ชัน load ของ class Configure  โดยวางไว้ในไฟล์ bootstrap.php ดังภาพ

cakephp_config3

การอ่านค่า Config สามารถเรียกผ่าน Configure::read หรือเพื่อให้ง่าย อาจเขียนเป็นฟังก์แยกขึ้นมาทำให้การเรียกใช้งานค่า Config ได้สะดวกรวดเร็วขึ้น

 

Group By จากวันและเวลาในฟิลด์แบบ DATETIME

เจอมาใน Stackoverflow มี 3 วิธีการหลักที่ user ที่ชื่อว่า Salman Aได้แก่

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
— codelogic
average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, ‘%Y%m’)
— Andriy M
average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
— fu-chi
average 0.203 sec.

http://stackoverflow.com/questions/508791/mysql-query-group-by-day-month-year

ฟังก์ชั่นที่ใช้สำหรับป้องกัน SQL injuction เบื้องต้น

มีหลายๆเทคนิค และหลายๆ วิธีที่ใช้สำหรับการป้องกันปัญหา SQL injuction หรือการส่งคำสั่งพิเศษเพื่อไปประมวลผมรวมกับคิวรี่ของภาษา SQL โดยเทคนิคโดยทั่วไปที่นิยมใช้คือ

1. ฟังก์ชั่น mysql_real_escape_string() เป็นฟังก์ชั่นสำหรับการเปลี่ยนอักขระพิเศษที่ส่งเข้ามาให้กลายเป็น string ที่ไม่สามารถประผลได้เช่น ถูกส่งคำสั่ง ‘or’ 1=1 เข้ามา ฟังก์ชันจะแปลงให้กลายเป็น \’or\’ 1=1 แทน เป็นต้น

2. trim() หรือ str_replace() ใช้สำหรับการตัดช่องว่างหรือแทนที่ช่องว่างด้วยค่าอื่นๆ เช่น หากส่งคำสั่ง or 1=1 เข้ามา ช่องว่างจะถูกตัดออกทำให้คำสั่งไม่สามารถประมวลผลร่วมกับคำสั่ง SQL ได้

3. เทคนิคการแปลงให้ค่าให้เป็นข้อมูลชนิดใดชนิดหนึ่ง เช่น หากมีการส่งค่า id มาจากตัวแปร $_GET[‘id’] เพื่อเรียกเรคเคอร์ที่มีค่า id เท่ากับ id ที่ส่งมา โดยทั่วไป id ต้องเป็นข้อมูลประเภทตัวเลข หรือ Integer เท่านั้น ดังนั้นก่อนนำค่าที่ได้จาก id ไปทำงานร่วมกับคำสั่ง SQL ควรแปลงค่าที่ถูกส่งมาทั้งหมดให้กลายเป็นตัวเลขโดยอาจใช้

  • ฟังก์ชัน intval (return ค่า integer ของตัวแปรออกมา)
  • ใช้ sprintf(“%d %s”)
  • หรือตรวจสอบค่าในตัวแปรที่รับมานั้นเป็นตัวเลขหรือด้วยฟังก์ชัน is_numuric() เป็นต้น

4. ใช้ฟังก์ชัน bind_param ร่วมกับการทำงานของคำสั่ง SQL ตัวอย่าง php.net

<?php
$mysqli = new mysqli(‘localhost’, ‘my_user’, ‘my_password’, ‘world’);

/* check connection */
if (mysqli_connect_errno()) {
printf(“Connect failed: %s\n”, mysqli_connect_error());
exit();
}

$stmt = $mysqli->prepare(“INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)”);
$stmt->bind_param(‘sssd’, $code, $language, $official, $percent);

$code = ‘DEU’;
$language = ‘Bavarian’;
$official = “F”;
$percent = 11.2;

/* execute prepared statement */
$stmt->execute();

printf(“%d Row inserted.\n”, $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query(“DELETE FROM CountryLanguage WHERE Language=’Bavarian'”);
printf(“%d Row deleted.\n”, $mysqli->affected_rows);

/* close connection */
$mysqli->close();
?>

ยังมีอีกหลายๆ เทคนิค หากพบเจอจะนำมาบันทึกและนำเสนอในครั้งๆ ต่อไป

จับเวลาการแสดงผลหน้าเว็บไซต์ด้วย microtime()

เริ่มจับเวลาส่วนต้นของเอกสาร

$time_start = microtime(true);

//สคริปต์ทั้งหมดทำงาน

$time_end = microtime(true);
$time = $time_end – $time_start; #เวลาเริ่มต้น – เวลาท้ายสุด

echo “เวลาที่ใช้ในการประมวลทั้งหมด $time วินาที\n”;

บทความการทำงานร่วมกับ sqllite

Creating, dropping, and altering tables in SQLite
http://zetcode.com/db/sqlite/tables/


SQlite ใช้การเปลี่ยนชื่อ คอลัมน์โดยการ สร้างตาราง TEMPORARY ใหม่ที่สร้างขึ้นมา แทรกข้อมูลเก่าลงไปในตาราง TEMPORARY ลบตารางเก่าเอา จากนั้นสร้างตารางใหม่ขึ้นมา แทรกข้อมูลจากตาราง Temp ลงตารางใหม่ และ ลบตาราง Temp ออกในลำดับสุดท้าย

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;


ตัวอย่าง PHP เชื่อมต่อกับ SQLite ผ่าน PDO

$db = new PDO(‘sqlite:database_file_name’);

สร้าง ตาราง
/*$sql = “CREATE TABLE members”.
“(id INTEGER PRIMARY KEY AUTOINCREMENT,”.
“username VARCHAR(20) NOT NULL,”.
“email VARCHAR(50),”.
“added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP);”;

เพิ่มข้อมูล
/*$sql = “INSERT INTO members (id,username,email,added_date) VALUES (null,’username’,’email@mail.com’,'”.date(“Y-m-d H:i:s”).”‘) “;*/

คิวรี่ข้อมูล
/*$sql = “SELECT * FROM members ORDER BY added_date DESC LIMIT 0,50”;
$result = $db->query($sql);
while($row = $result->fetchObject()){
echo “[$row->id]”.$row->name.”|”.$row->email.”|”.$row->added_date.”<br/>”;
}*/

unset($db); #ปิดการเชื่อมต่อ


[Tip SQL] โคลนและลบตาราง

โคลนตาราง

CREATE TABLE new_tb_name LIKE original_tb_name

เมื่อสร้างเสร็จแล้วระเบียนภายในตารางที่โคลนขึ้นมานั้น จะยังว่างให้ใช้คำสั่ง INSERT เพื่อโคลนระเบียนทั้งหมดจจากตารางเดิมมาด้วย

INSERT INTO new_tb_name SELECT * FROM original_tb_table;

ลบตาราง

DROP TABLE tb_name

รวบรวมคำสั่ง MySQL หลังจากกลับมาเขียนโดยไม่ใช้ CI

หลังจากที่ทำงานโดยใช้ CI มาโดยตลอดการ คำสั่งหรือฟังก์ชันต่างๆ ในการจัดการฐานข้อมูลก็จะใช้คำสั่งสำเร็จรูปที่มากับ CI พอกลับมาเขียนอีกครั้ง ถึงกับต้องเปิดตำหรับ ตำรากันขึ้นมาใหม่เลยทีเดียว อีกแย่างถือเป็นการเตรียมพร้อมก่อนการทำโปรเจ็คจบที่ในใจคิดว่าอยากจะเขียน pure php โดยไม่พึ่งพา framework ใดๆ ตั้งแต่เริ่มต้นเขียนคำสั่งหรือฟังก์ชันที่รวบรวมได้มีดังนี้

 

เริ่มติดต่อฐานข้อมูล

mysql_connect(host,username,password);

หรือ

mysql_pconnect(….);

ช่วยให้การทำงานติดต่อ mysql ได้เร็วมากขึ้นเพราะหลังจากเริ่มติดต่อฐานข้อมูล จะเปิดการเชื่อมต่อไว้ตลอดเวลาโดยการใช้งาน mysql_pconnect จะต้องทำการตั้งค่า php.ini ในส่วน MySQL เป็นRead More »