ค้นหาอินเทอร์เน็ตฉันพบว่านี่เป็นวิธีการแก้ปัญหาที่ยอมรับได้ คลาสอื่นจะใช้แทนฟังก์ชัน PDO และ PDO จะถูกเรียกผ่านการเรียกใช้ฟังก์ชั่นเวทย์มนตร์ ฉันไม่แน่ใจว่าสิ่งนี้จะสร้างปัญหาประสิทธิภาพการทำงานที่ร้ายแรง แต่สามารถใช้งานได้จนกว่าจะมีการเพิ่มคุณสมบัติการบันทึกที่เหมาะสมลงใน PDO
ดังนั้นตามหัวข้อนี้คุณสามารถเขียน wrapper สำหรับการเชื่อมต่อ PDO ของคุณซึ่งสามารถบันทึกและส่งข้อยกเว้นเมื่อคุณได้รับข้อผิดพลาด
นี่คือตัวอย่างง่ายๆ:
class LoggedPDOSTatement extends PDOStatement {
function execute ($array) {
parent::execute ($array);
$errors = parent::errorInfo();
if ($errors[0] != '00000'):
throw new Exception ($errors[2]);
endif;
}
}
เพื่อให้คุณสามารถใช้คลาสนั้นแทน PDOStatement:
$this->db->setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('LoggedPDOStatement', array()));
นี่คือการใช้งานมัณฑนากร PDO ที่กล่าวถึง:
class LoggedPDOStatement {
function __construct ($stmt) {
$this->stmt = $stmt;
}
function execute ($params = null) {
$result = $this->stmt->execute ($params);
if ($this->stmt->errorCode() != PDO::ERR_NONE):
$errors = $this->stmt->errorInfo();
$this->paint ($errors[2]);
endif;
return $result;
}
function bindValue ($key, $value) {
$this->values[$key] = $value;
return $this->stmt->bindValue ($key, $value);
}
function paint ($message = false) {
echo '<pre>';
echo '<table cellpadding="5px">';
echo '<tr><td colspan="2">Message: ' . $message . '</td></tr>';
echo '<tr><td colspan="2">Query: ' . $this->stmt->queryString . '</td></tr>';
if (count ($this->values) > 0):
foreach ($this->values as $key => $value):
echo '<tr><th align="left" style="background-color: #ccc;">' . $key . '</th><td>' . $value . '</td></tr>';
endforeach;
endif;
echo '</table>';
echo '</pre>';
}
function __call ($method, $params) {
return call_user_func_array (array ($this->stmt, $method), $params);
}
}
/var/log/mysql/*
. พารามิเตอร์ผูกพัน PDO ไม่สามารถทำให้เกิดข้อผิดพลาดทางไวยากรณ์ดังนั้นสิ่งที่คุณต้องมีคือแบบสอบถาม SQL ที่เตรียมไว้