Kotchasan Framework Documentation
MSSQLDriver Class
MSSQLDriver Class
ภาพรวม
คลาส Kotchasan\Connection\MSSQLDriver เป็นไดรเวอร์เฉพาะสำหรับฐานข้อมูล Microsoft SQL Server รองรับฟีเจอร์ของ SQL Server เช่น การเข้ารหัส การจัดการ indexes และ SQL functions เฉพาะ
การติดตั้งและความต้องการ
ความต้องการ
- PHP 7.4 หรือสูงกว่า
- PDO SQL Server extension (
pdo_sqlsrv) - Microsoft SQL Server 2012+
การตั้งค่าการเชื่อมต่อ
การตั้งค่าพื้นฐาน
use Kotchasan\Connection\MSSQLDriver;
$config = [
'host' => 'localhost',
'port' => 1433,
'database' => 'myapp',
'username' => 'sa',
'password' => 'password',
'charset' => 'utf8'
];
$driver = new MSSQLDriver();
$connected = $driver->connect($config);การตั้งค่าขั้นสูง
$config = [
'host' => 'sqlserver.example.com',
'port' => 1433,
'database' => 'production_db',
'username' => 'app_user',
'password' => 'secure_pass',
'appname' => 'MyKotchasanApp',
'timeout' => 30,
'encrypt' => true,
'trust_server_certificate' => true,
'pooling' => true
];ฟีเจอร์เฉพาะ SQL Server
การเพิ่มประสิทธิภาพตาราง
// SQL Server ใช้ ALTER INDEX REBUILD
$success = $driver->optimizeTable('users');
// ทำงานเป็น: ALTER INDEX ALL ON [users] REBUILD;SQL Functions สำหรับ SQL Server
// ฟังก์ชันวันที่
$hourFunc = $driver->formatSqlFunction('HOUR', ['column' => 'created_at'], 'hour_created');
// ผลลัพธ์: DATEPART(HOUR, [created_at]) AS [hour_created]
// รวมข้อความ
$concatFunc = $driver->formatSqlFunction('CONCAT', [
'fields' => ['first_name', 'last_name'],
'separator' => ' '
], 'full_name');
// ผลลัพธ์: ([first_name] + ' ' + [last_name]) AS [full_name]
// รวมข้อความแบบกลุ่ม
$groupConcatFunc = $driver->formatSqlFunction('GROUP_CONCAT', [
'column' => 'tag_name',
'separator' => ', ',
'order' => ['tag_name']
], 'tags');
// ผลลัพธ์: STRING_AGG([tag_name], ', ') WITHIN GROUP (ORDER BY [tag_name]) AS [tags]
// สุ่ม
$randFunc = $driver->formatSqlFunction('RAND', [], 'random_value');
// ผลลัพธ์: NEWID() AS [random_value]
// จัดการค่า NULL
$ifnullFunc = $driver->formatSqlFunction('IFNULL', [
'column1' => 'nickname',
'column2' => 'first_name'
], 'display_name');
// ผลลัพธ์: ISNULL([nickname], [first_name]) AS [display_name]ตัวอย่างการใช้งาน
การทำงานกับ Identity Columns
// INSERT และดึง Identity value
$stmt = $driver->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(['John Doe', 'john@example.com']);
$newId = $driver->lastInsertId(); // ไม่ต้องระบุ sequence name;การจัดการ Transaction ขั้นสูง
try {
$driver->beginTransaction();
// ใช้ savepoint
$driver->prepare("SAVE TRANSACTION sp1")->execute();
// ทำงานต่างๆ
$stmt1 = $driver->prepare("INSERT INTO orders (user_id, total) VALUES (?, ?)");
$stmt1->execute([1, 100.00]);
// หากมีปัญหา rollback ไป savepoint
// $driver->prepare("ROLLBACK TRANSACTION sp1")->execute();
$driver->commit();
} catch (\Exception $e) {
$driver->rollback();
throw $e;
}การจัดการข้อผิดพลาด
try {
$driver->connect($config);
} catch (\PDOException $e) {
$message = $e->getMessage();
if (strpos($message, 'Login failed') !== false) {
echo "การเข้าสู่ระบบล้มเหลว";
} elseif (strpos($message, 'Cannot open database') !== false) {
echo "ไม่สามารถเปิดฐานข้อมูล";
} else {
echo "ข้อผิดพลาด SQL Server: " . $message;
}
}คำแนะนำ
แนวทางปฏิบัติที่ดี
- ใช้ Encryption: เปิดใช้งาน encryption สำหรับความปลอดภัย
- จัดการ Connection Pooling: ใช้ connection pooling
- ใช้ Indexes: สร้าง indexes ที่เหมาะสม
- ตั้งค่า Timeout: กำหนด timeout ที่เหมาะสม
ข้อควรระวัง
- Identifier Quoting: ใช้ square brackets
[table_name] - Data Types: ระวังความแตกต่างของ data types ระหว่าง SQL Server และ Database อื่น
- Case Sensitivity: ขึ้นอยู่กับ collation settings
- SQL Injection: ห้ามนำ input ของผู้ใช้มาต่อ string SQL โดยตรง ให้ใช้ parameter binding เสมอ
คลาสที่เกี่ยวข้อง
- Connection - คลาสการเชื่อมต่อพื้นฐาน
- DriverInterface - อินเทอร์เฟซไดรเวอร์
- MySQLDriver - ไดรเวอร์ MySQL