#php #exception #error-log
#php #исключение #журнал ошибок
Вопрос:
Я собираюсь завершить один проект, и я заметил, что я получаю ошибки в моем файле error_log. Я получаю эту ошибку, когда загружаю свой index.php файл и за одну перезагрузку я получаю 21 строку кода ошибки.
Я пробовал отладку из header.php файл. Самая сумасшедшая вещь — не получать никаких ошибок, пока я не загружу header.php файл, но когда я вызываю header.php в index.php файл, в котором я получаю ошибки. Итак, я попытался перехватить ошибки с помощью try
и catch
из PDO. В файле журнала ошибок я получаю сообщение об ошибке, поэтому я изменил свой код с этого Select Query: ".$e->getMessage()
на Select Query: ".$e->getFile()
и Select Query: ".$e->getLine()
. Но, делая это, я получил номер строки, в которой ошибка возникает не в той строке, из которой она была выброшена.
Я думаю, что у меня проблема в моем запросе select в databse.php . Ниже приведен мой код запроса select:
final protected function select($args = array(), $is_die = false){
try {
$this->sql = "SELECT ";
if (isset($args['fields'])) {
if (is_array($args['fields'])) {
$this->sql .= implode(', ', $args['fields']);
} else {
$this->sql .= $args['fields'];
}
} else {
$this->sql .= " * ";
}
$this->sql .= " FROM ";
if (!isset($this->table) || empty($this->table)) {
throw new Exception("Table not set");
}
$this->sql .= $this->table;
/*Join Query*/
if (isset($args['join']) amp;amp; !empty($args['join'])) {
$this->sql .= " ".$args['join'];
}
/*Join Query*/
if (isset($args['where']) amp;amp; !empty($args['where'])) {
if (is_array($args['where'])) {
$temp = array();
foreach ($args['where'] as $column_name => $data) {
if (!is_array($data)) {
$data = array(
'value' => $data,
'operator' => '=',
);
}
$str = $column_name.' '.$data['operator'].' :'.str_replace('.', '_', $column_name);
$temp[] = $str;
}
$this->sql .= " WHERE ".implode(' AND ', $temp);
} else {
$this->sql .= " WHERE ".$args['where'];
}
}
/*Group*/
if (isset($args['group_by']) amp;amp; !empty($args['group_by'])) {
$this->sql .= " GROUP BY ".$args['group_by'];
}
/*Group*/
/*Order*/
if (isset($args['order_by']) amp;amp; !empty($args['order_by'])) {
$this->sql .= " ORDER BY ".$args['order_by'];
} else {
$this->sql .= " ORDER BY ".$this->table.".id DESC";
}
/*Order*/
/*Limit*/
if (isset($args['limit']) amp;amp; !empty($args['limit'])) {
if (is_array($args['limit'])) {
$this->sql .= " LIMIT ".$args['limit'][0].",".$args['limit'][1];
} else {
$this->sql .= " LIMIT ".$args['limit'];
}
}
/*Limit*/
$this->stmt = $this->conn->prepare($this->sql);
if (is_array($args['where']) || is_object($args['where'])){
foreach ($args['where'] as $column_name => $data) {
$value = is_array($data) ? $data['value'] : $data; //check if passed where statement was an array, fetch value if so
if (is_int($value)) {
$param = PDO::PARAM_INT;
}elseif (is_bool($value)) {
$param = PDO::PARAM_BOOL;
}elseif (is_null($value)) {
$param = PDO::PARAM_NULL;
}else {
$param = PDO::PARAM_STR;
}
if ($param) {
$this->stmt->bindValue(":".str_replace('.', '_', $column_name), $value, $param);
}
}
}
if ($is_die) {
echo $this->sql;
debugger($this->stmt);
debugger($args, true);
}
$this->stmt->execute();
$data = $this->stmt->fetchAll(PDO::FETCH_OBJ);
return $data;
} catch (PDOException $e) {
error_log(
date('Y-m-d h:i:s A').", Select Query: ".$e->getMessage()."rn"
, 3, ERROR_PATH.'/error.log');
return false;
} catch (Exception $e) {
error_log(
date('Y-m-d h:i:s A').", General: ".$e->getMessage()."rn"
, 3, ERROR_PATH.'/error.log');
return false;
}
}
Есть ли возможный способ получить номер строки файла, в котором возникает ошибка, с помощью try catch или любого другого?
Ответ №1:
Вы можете использовать try
, catch
чтобы получить исключение, для использования номера строки __LINE__
Например
try {
/* Your Code */
} catch (Exception $e) {
echo __LINE__.$e->getMessage() "n";
}
В вашем коде внутри catch statememt
"Line No : " __LINE__.date('Y-m-d h:i:s A')
Для номера строки и пути к файлу используйте приведенное ниже
"Line No : " __LINE__." : File Path : ".__FILE__.date('Y-m-d h:i:s A')
Комментарии:
1. Куда мне вставить этот код? Я ничего не получаю.
2. Он предоставил мне номер строки, и я получил номер строки, но как насчет имени файла, потому что я пошел проверять, чтобы index.php , header.php и menu.php строка № 152, в этой конкретной строке нет php-кода.
3. @Alisha я включил имя файла, проверьте обновленный ответ
4. Этот код выдал тот же результат, что и $e-> GetFile() и $e-> getLine()
5. @Alisha лучше использовать $e-> GetFile() и $e-> getLine() , если эти методы существуют в объекте $ e, вы можете увидеть все методы $ e с помощью print_r(get_class_methods($ e))
Ответ №2:
Я просто вставил код, чтобы получить номер строки и имя функции в моем запросе select.
Ниже приведен код:
Exception("MySQL error $mysqli->error <br> Query:<br> $sql", $msqli->errno);
Запрос select будет выглядеть следующим образом после добавления приведенной выше строки кода:
final protected function select($args = array(), $is_die = false){
try {
$this->sql = "SELECT ";
if (isset($args['fields'])) {
if (is_array($args['fields'])) {
$this->sql .= implode(', ', $args['fields']);
} else {
$this->sql .= $args['fields'];
}
} else {
$this->sql .= " * ";
}
$this->sql .= " FROM ";
if (!isset($this->table) || empty($this->table)) {
throw new Exception("Table not set");
}
$this->sql .= $this->table;
/*Join Query*/
if (isset($args['join']) amp;amp; !empty($args['join'])) {
$this->sql .= " ".$args['join'];
}
/*Join Query*/
if (isset($args['where']) amp;amp; !empty($args['where'])) {
if (is_array($args['where'])) {
$temp = array();
foreach ($args['where'] as $column_name => $data) {
if (!is_array($data)) {
$data = array(
'value' => $data,
'operator' => '=',
);
}
$str = $column_name.' '.$data['operator'].' :'.str_replace('.', '_', $column_name);
$temp[] = $str;
}
$this->sql .= " WHERE ".implode(' AND ', $temp);
} else {
$this->sql .= " WHERE ".$args['where'];
}
}
/*Group*/
if (isset($args['group_by']) amp;amp; !empty($args['group_by'])) {
$this->sql .= " GROUP BY ".$args['group_by'];
}
/*Group*/
/*Order*/
if (isset($args['order_by']) amp;amp; !empty($args['order_by'])) {
$this->sql .= " ORDER BY ".$args['order_by'];
} else {
$this->sql .= " ORDER BY ".$this->table.".id DESC";
}
/*Order*/
/*Limit*/
if (isset($args['limit']) amp;amp; !empty($args['limit'])) {
if (is_array($args['limit'])) {
$this->sql .= " LIMIT ".$args['limit'][0].",".$args['limit'][1];
} else {
$this->sql .= " LIMIT ".$args['limit'];
}
}
/*Limit*/
$this->stmt = $this->conn->prepare($this->sql);
if (is_array($args['where']) || is_object($args['where'])){
foreach ($args['where'] as $column_name => $data) {
$value = is_array($data) ? $data['value'] : $data; //check if passed where statement was an array, fetch value if so
if (is_int($value)) {
$param = PDO::PARAM_INT;
}elseif (is_bool($value)) {
$param = PDO::PARAM_BOOL;
}elseif (is_null($value)) {
$param = PDO::PARAM_NULL;
}else {
$param = PDO::PARAM_STR;
}
if ($param) {
$this->stmt->bindValue(":".str_replace('.', '_', $column_name), $value, $param);
}
}
}
if ($is_die) {
echo $this->sql;
debugger($this->stmt);
debugger($args, true);
}
$this->stmt->execute();
$data = $this->stmt->fetchAll(PDO::FETCH_OBJ);
return $data;
} catch (PDOException $e) {
error_log(
date('Y-m-d h:i:s A').", Select Query: ".$e->getMessage()."rn"
, 3, ERROR_PATH.'/error.log');
return false;
} catch (Exception $e) {
error_log(
date('Y-m-d h:i:s A').", General: ".$e->getMessage()."rn"
, 3, ERROR_PATH.'/error.log');
Exception("MySQL error $mysqli->error <br> Query:<br> $sql", $msqli->errno);
return false;
}
}
Для получения дополнительной информации программисты могут посетить эту ссылку: Руководство по PHP