當錯誤發生時,會找 db_error_handler
然後 return $params['error'] 出來
假設在 return 的同時
能否在裡面宣告一個變數
然後可以在 func 下面的代碼中使用它?
例如
function db_error_handler($params) {
$p = $params['error'];
return $params['error']; // return 'error'
}
echo $p; // 'error'
若看書上的說明
We use a special error-handling function for DB errors rather than only relying onour regular error_handler()function. We do this so that we can roll back anyopen transaction (if we still have an active database connection) and then trigger afatal error that will exit the page and stop any other queries from running. This iskey to the concept of atomic transactions, which are multi-stage procedures inwhich, by rule, either all of the steps must occur, or none of them. This preventssuch problems as, in the case of a bank, money being credited to one account with-out being subtracted from another one.
沒有什麼必要把$params['error']傳出來給下面的function用
因為在 db_error_handler function 裡就可以寫你想做的事
如果你堅持的話
那就
$myerror = "";
function db_error_handler($params) {
global $myerror;
$myerror = $params['error'];
}
echo $myerror; // 'error'
連 return 都可以省了
php有一種變數傳送的寫法。
一般我很少教人。但在一些特殊情況下可以使用。
<?php
function test1($var){
$var++;
echo 'func='.$var;
}
function test2(&$var){
$var++;
echo 'func='.$var;
}
function test3(){
global $var;
$var++;
echo 'func='.$var;
}
$var = 1;
test1($var);
echo 'test1='.$var;
$var = 1;
test2($var);
echo 'test2='.$var;
$var = 1;
test3();
echo 'test3='.$var;
?>
以上試著跑看看就知道該怎麼做了。
&變數作法要小心用就是了。
看了一下meekro文件
那個 function 是被套件直接呼叫的
所以傳入參數無法自訂
要設定最外層變數可以透過 $GLOBALS 來做
function db_error_handler($params) {
$GLOBALS['p']=$params['error'];
}
DB::$error_handler = 'db_error_handler';
DB::query('select * from tb1'); //假設發生錯誤
var_dump($p);
後續補充:
其實不用自己去設外部變數也可以拿到錯誤訊息。
//發生錯誤之後
$sqliObject = DB::get(); //這回傳 mysqli object
echo $sqliObject->error; //直接拿 mysqli 的錯誤訊息
參考:https://meekro.com/docs.php/misc-methods
再補一個,有時候套件接受 Callable 這類作為 callback
(這個套件就有)
所以可以這樣寫
class MyError
{
public static $errorInfo='';
public static function setInfo($param) {
self::$errorInfo = $param['error'];
}
}
DB::$error_handler = ['MyError', 'setInfo'];
DB::query('select * from tb1'); //假設發生錯誤
var_dump(MyError::$errorInfo);