ডিবাগিংয়ের উদ্দেশ্যে পিডিও ছাড়গুলি ধরার সমাধানের সাথে আমার যে সমস্যাটি হয়েছিল তা হ'ল এটি কেবল পিডিও ছাড় (দুহ) কেড়ে নিয়েছিল, তবে পিএইচপি ত্রুটি হিসাবে নিবন্ধিত সিনট্যাক্স ত্রুটিগুলি ধরেনি (কেন এটি নিশ্চিত তা আমি নিশ্চিত নই, তবে " কেন "সমাধানটি অপ্রাসঙ্গিক)। আমার সমস্ত পিডিও কলগুলি একটি একক টেবিল মডেল শ্রেণীর কাছ থেকে আসে যা আমি সমস্ত টেবিলের সাথে আমার সমস্ত মিথস্ক্রিয়াটির জন্য প্রসারিত করেছিলাম ... এই জটিল জিনিসগুলি যখন আমি কোডটি ডিবাগ করার চেষ্টা করছিলাম, কারণ ত্রুটিটি পিএইচপি কোডের লাইনটি নিবন্ধিত করবে যেখানে আমার এক্সিকিউট কল ছিল was কল করা হয়েছিল, কিন্তু কলটি কোথা থেকে এসেছে তা আসলে আমাকে বলা হয়নি। আমি এই সমস্যাটি সমাধানের জন্য নিম্নলিখিত কোডগুলি ব্যবহার করেছি:
/**
* 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;
}
}
}
সুতরাং, উপরের কোডটি দুটি PDO ব্যতিক্রম এবং পিএইচপি সিনট্যাক্স ত্রুটিগুলি ধরে এবং তাদের সাথে একইভাবে আচরণ করে। আমার ত্রুটি হ্যান্ডলারটি এরকম কিছু দেখাচ্ছে:
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 বাউন্ড প্যারামিটারগুলি সিনট্যাক্স ত্রুটি সৃষ্টি করতে পারে না তাই আপনার প্রয়োজনীয় সমস্ত প্রস্তুত এসকিউএল কোয়েরি।