डिबगिंग प्रयोजनों के लिए पीडीओ छूट को पकड़ने के लिए मेरे पास समस्या यह थी कि यह केवल पीडीओ छूट (डु) को पकड़ा, लेकिन सिंटैक्स त्रुटियों को नहीं पकड़ा जो php त्रुटियों के रूप में पंजीकृत थे (मुझे यकीन नहीं है कि यह क्यों है, लेकिन " क्यों "समाधान के लिए अप्रासंगिक है)। मेरी सभी पीडीओ कॉल एक सिंगल टेबल मॉडल क्लास से आती हैं, जिसे मैंने सभी तालिकाओं के साथ अपने सभी इंटरैक्शन के लिए बढ़ाया है ... यह जटिल चीजें जब मैं कोड को डीबग करने की कोशिश कर रहा था, क्योंकि त्रुटि php कोड की लाइन को पंजीकृत करेगी जहां मेरा निष्पादन कॉल था कहा जाता है, लेकिन मुझे यह नहीं बताया कि वास्तव में कॉल कहां से किया गया था। मैंने इस समस्या को हल करने के लिए निम्नलिखित कोड का उपयोग किया:
/**
* Executes a line of sql with PDO.
*
* @param string $sql
* @param array $params
*/
class TableModel{
var $_db; //PDO connection
var $_query; //PDO query
function execute($sql, $params) {
//we're saving this as a global, so it's available to the error handler
global $_tm;
//setting these so they're available to the error handler as well
$this->_sql = $sql;
$this->_paramArray = $params;
$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->_query = $this->_db->prepare($sql);
try {
//set a custom error handler for pdo to catch any php errors
set_error_handler('pdoErrorHandler');
//save the table model object to make it available to the pdoErrorHandler
$_tm = $this;
$this->_query->execute($params);
//now we restore the normal error handler
restore_error_handler();
} catch (Exception $ex) {
pdoErrorHandler();
return false;
}
}
}
इसलिए, उपरोक्त कोड BOTH PDO अपवादों और php सिंटैक्स त्रुटियों को पकड़ता है और उन्हें उसी तरह व्यवहार करता है। मेरा त्रुटि हैंडलर कुछ इस तरह दिखता है:
function pdoErrorHandler() {
//get all the stuff that we set in the table model
global $_tm;
$sql = $_tm->_sql;
$params = $_tm->_params;
$query = $tm->_query;
$message = 'PDO error: ' . $sql . ' (' . implode(', ', $params) . ") \n";
//get trace info, so we can know where the sql call originated from
ob_start();
debug_backtrace(); //I have a custom method here that parses debug backtrace, but this will work as well
$trace = ob_get_clean();
//log the error in a civilized manner
error_log($message);
if(admin(){
//print error to screen based on your environment, logged in credentials, etc.
print_r($message);
}
}
अगर किसी के पास टेबल मॉडल को वैश्विक चर के रूप में स्थापित करने की तुलना में मेरी त्रुटि हैंडलर के लिए प्रासंगिक जानकारी प्राप्त करने के बारे में कोई बेहतर विचार है, तो मुझे यह सुनकर और अपने कोड को संपादित करने में खुशी होगी।
/var/log/mysql/*
। PDO बाउंड पैरामीटर सिंटैक्स त्रुटियों का कारण नहीं बन सकता है, इसलिए आपको केवल तैयार SQL क्वेरी की आवश्यकता है।