Как узнать номер строки, из которой исходит исключение в PHP

#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