Как найти номер строки в php

Is it possible for a PHP script to return a line number in which some command is called? I’m having trouble describing what I want so maybe an example.

I have PHP code that calls MySQL on many occasions. In line 49 is:

$resultDevice = mysql_query("Some SQL;") or die ("MySQL-Error in settingsU line 49: " . mysql_error());

The text “line 49” I wrote manually. Is it possible to get this number “49” updated if I change my code? It would make my life easier to debug. Of course I can put some other line-specific text into die, but lines are much easier to find in a text-editor.

Don't Panic's user avatar

Don’t Panic

41k10 gold badges58 silver badges79 bronze badges

asked Mar 28, 2013 at 14:17

Kris_R's user avatar

0

You can use the magic constant __LINE__ for this.

echo  __LINE__;

will show the line number where that statement is in the file.

Don't Panic's user avatar

Don’t Panic

41k10 gold badges58 silver badges79 bronze badges

answered Mar 28, 2013 at 14:33

Dan's user avatar

DanDan

1,9281 gold badge18 silver badges26 bronze badges

1

if you want a trace you can use(For PHP 4 >= 4.3.0:)

function error_report_function($error) 
{
$dbgt=debug_backtrace();
return "$error in {$dbgt[1][file]} on line {$dbgt[1][line]}";
}

You can use debug_backtrace for this or else always pass the line (with __LINE__)

answered Mar 29, 2013 at 2:06

internals-in's user avatar

internals-ininternals-in

4,7382 gold badges21 silver badges38 bronze badges

0

You could use something like this:

function throwSQLError($file, $line, $error) {
    return "MySQL-Error in " . $file . " on line " . $line . ": " . $error;
}
$result = mysql_query("Some SQL;") or die (throwSQLError(__FILE__, __LINE__, mysql_error()));

This gives you a dynamic function to throw the error you can use multiple times.

Untested, just written in raw editor.

answered Sep 30, 2020 at 6:06

janisch's user avatar

janischjanisch

1591 gold badge1 silver badge12 bronze badges

Что такое “Php константа __LINE__“? Получить номер строки файла в котором расположена данная константа __LINE__.

О константе __LINE__

  1. Что такое “Php константа __LINE__“?
  2. Пример использования “константы __LINE__
  1. Что такое “Php константа __LINE__

    Прежде чем начинать о “Php константе __LINE__” надо дать определение:

    Php константа __LINE__ – возвращает номер строки файла, где расположен скрипт.

    Синтаксис “Php константы __LINE__

    Синтаксиса для “константы __LINE__” не существует, эта константа применяется для вывода на экран номера строки текущего документа.

    Вывод номера строки файла с помощью “__LINE__

    echo __LINE__;

    Пример вывод номера строки файла

    Давайте прямо здесь выведем выше приведенную конструкцию:

    echo __LINE__;

    Результат работы константы “__LINE__

    45

    Если мы посмотрим в коде, то увидим, что действительно наша константа стоит на 45 строке.
    Результат работы константы ‘__LINE__‘

  2. Пример использования “константы __LINE__

    Как вы уже выше видели – мы вывели номер той строки, но которой расположена данная константа “__LINE__“.
    Давайте откроем данную страницу в каком-то из редакторов кода.

    То будет видно, что данная константа стоит именно на той строке, какой номер и был выведен :

    Пример использования ‘константы __LINE__‘
    Ещё :
    Отдельной страницей выделили все константы Php.

Не благодарите, но ссылкой можете поделиться!

COMMENTS+

 
BBcode


Для логгирования иногда важно не только записать какое то сообщение, но также указать — где именно произошло событие в скрипте. Давайте посмотрим, как можно получить номер строки и имя файла в PHP.

Данная информация может быть предоставлена php функцией debug_backtrace(), которая предоставляет информацию о состоянии стека вызова функций в виде массива.

Пример массива, который возвращает debug_backtrace():

Array

(

  [0] => Array

    (

      [file] => D:OpenServer.526domainstest.locwebdebug_backtrace.php

      [line] => 8

      [function] => getInfo

      [args] => Array()

    )

)

Здесь есть имя файла и номер строки, где была вызвана некая функция getInfo.

Оформим нашу идею в виде функции, которая возвращает описание места в скрипте, откуда она была вызвана в программе:

function getInfo() {

  $backtrace = debug_backtrace();

  $fileinfo = ;

  if (!empty($backtrace[0]) && is_array($backtrace[0])) {

    $fileinfo = $backtrace[0][‘file’] . “:” . $backtrace[0][‘line’];

  }

  return $fileinfo;

}

Т.е. если мы вызовем её где то в нашей программе, она вернет нам имя файла и номер строки.

Если вызов функции используется в обертке другой функции, к примеру той, что пишет сообщение в лог файл, то нужно посмотреть глубже в стек, чтобы получить требуемые данные.

Виртуальный лог

Оформим эту идею в виде виртуального класса.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

class VirtualLog {

  public function error($error) {

    $this>log($error>getMessage() . ‘ /’

    . $error>getFile() . “:” . $error>getLine(), ‘error’);

  }

  public function message($messageText) {

    $this>log($messageText . ‘ /’ . self::getInfo(1), ‘info’);

  }

  private static function getInfo($level = 0) {

    $bt = debug_backtrace();

    $fileinfo = ‘Unknown place:’;

    if (!empty($bt[$level]) && is_array($bt[$level])) {

      $fileinfo = $bt[$level][‘file’] . “:” . $bt[$level][‘line’];

    }

    return $fileinfo;

  }

  public function log($message, $message_type) {

    print “$message_type : $message n”;

  }

}

Основная функция класса — log выводит сообщение просто на экран, поэтому я назвал класс виртуальным. А чтобы сообщение сохранялось в базу или в файл — требуется переписать эту функцию в дочернем классе.

Вторая особенность — функция log не добавляет имя файла и номер строки в сообщение, сохраняя возможность прямого вывода. Вместо этого реализованы еще два метода, которые это делают. Один из них error, принимает на входе объект Exception и использует его данные. А второй — message — использует уже знакомую функцию getInfo.

Пользоваться классом просто:

$virtualLog = new VirtualLog();

$virtualLog>message(‘Text message’);

Скрипт выведет что то вроде следующего:

info : Text message /D:OpenServer.526domainstest.locwebdebug_backtrace.php:42

Логгирование в файл

Т.к. в консоль писать не очень интересно на практике, то давайте сделаем сохранение данных в файл. Для этого создадим дочерний класс, реализующий возможность записи лога в указанный файл.

class FileLog extends VirtualLog {

  var $logFilename = null;

  function __construct($logFilename) {

    $this>logFilename = $logFilename;

  }

  public function log($message, $message_type = ‘info’) {

    file_put_contents($this>logFilename, date(‘Y-m-d H:i:s’)

    . ” $message_type : $message n”, FILE_APPEND);

  }

}

При инициализации класса нужно указать имя файла, а дальше использовать всё те же методы:

$fileLog = new FileLog(‘mylogfile.log’);

$fileLog>message(‘Text message’);

Ну и пример с обработкой исключения:

try {

  throw new Exception(‘My error message!’);

}

catch (Exception $ex) {

  $fileLog>error($ex);

}

Написать комментарий


Данная запись опубликована в 27.08.2020 14:22 и размещена в PHP.
Вы можете перейти в конец страницы и оставить ваш комментарий.

Мало букафф? Читайте есчо !

Извлекаем атрибуты из шот/html кода

Апрель 23, 2017 г.

Предлагаю код очень простой функции-парсера атрибутов из кусочков html кода. Основное назначение – разбирать текст short-codes.

На входе: html код или shortcode.
На выходе: имя тега и набор атрибутов. Если ничего подходящего не найдено – получим …

Читать

Измеряем скорость работы кода в PHP

Сентябрь 15, 2017 г.

Чтобы измерить скорость работы кода нужны две вещи – “код” и секундомер. Программный код у вас есть, а секундомер, оформленный в виде класса – можете взять здесь.

Очень простой, основанный на функции microtime(), секундомер скрывает рутину по сохранению …

Читать

Столкнулась с проблемой.

Есть текстовый файл:

item({'id':'16', 'title':'Title1', 'date':'2018-10-31 10:16:26', 'content':'Content1'});
item({'id':'18', 'title':'Title2', 'date':'2018-10-31 10:16:42', 'content':'Content2'});
item({'id':'20', 'title':'Title3', 'date':'2018-10-31 10:17:02', 'content':'Content3'});

Мне необходимо получить номер строки, в которую входит подстрока “‘id’:’18′”.

задан 1 ноя 2018 в 2:30

JS588787's user avatar

$data = file_get_contents('file_name.txt');
$str = explode("n", $data);

foreach($str as $id => $item) { 
    if(strpos($item, ""'id':'18'"") !== false) $result = $id+1;
}

echo "Номер строки - ".$result;

ответ дан 1 ноя 2018 в 2:41

d_reseller's user avatar

Спасибо, код работает, но не с этой регуляркой…

Вот так заработало:

$data = file_get_contents('news.js');
$str = explode("n", $data);

foreach($str as $id => $item) { 
if(strpos($item, ''id':'18'') !== false) $result = $id+1;
}
echo "Номер строки - ".$result;

ответ дан 1 ноя 2018 в 3:02

JS588787's user avatar

  • #1

Поиск в txt файле, помогите определить номер строки.

Делаю поиск по файлу таким образом

PHP:

if (strpos(file_get_contents("file.txt"), "find")) echo "Есть такой!";  else echo "Нет такого";

Теперь вопрос каким образом можно определить на какой строке был найдено “find”?

zerkms

zerkms

TDD infected

Команда форума


  • #3

Автор оригинала: zerkms
substr_count()

Делаю

PHP:

$pos=strpos(file_get_contents("file.txt"), "find");
if ($pos) echo "Есть такой!";  else echo "Нет такого";
echo "<br>---".substr_count($pos)."---<br>";

непомогло…
ничего не выводит

zerkms

zerkms

TDD infected

Команда форума


  • #4

Enthusiast
потому что нужно не просто вызвать функцию, а осмысленно передать в неё параметры

1. phpfaq.ru/debug – потому что твой код даже не будет интерпретироваться
2. php.net/substr_count – чтобы почитать о том, что это за функция, и что ей нужно
3. номер строки – это число символов перевода строки в интервале от 0 до “найденная позиция” + 1

  • #5

Что то в роде этого

PHP:

$f=file("file.txt");
foreach ($f as $num => $str){
  if(strpos($str, "find")!==false){
    echo "Find in line ".($num+1)." ";
   //если нужно только номер первой строчки то break();
	 }
 }

  • #6

Re: Поиск в txt файле, помогите определить номер строки.

Что-то вроде этого

PHP:

function searchLine($filename, $s)
{
    $line = false;

    $fh = fopen($filename, 'rb');

    for($i = 1; ($t = fgets($fh)) !== false; $i++) {
        if( strpos($t, $s) !== false ) {
            $line = $i;
            break;
        }
    }

    fclose($fh);

    return $line;
}

:)

  • #7

Автор оригинала: mity
Что то в роде этого

PHP:

$f=file("file.txt");
foreach ($f as $num => $str){
  if(strpos($str, "find")!==false){
    echo "Find in line ".($num+1)." ";
   //если нужно только номер первой строчки то break();
	 }
 }

спасибо помогло, а более быстрого способа нет?
Без

а то файл у меня 40 мб

  • #8

Enthusiast
Я бы не стал спорить что именно быстрее, но мой вариант адекватнее.

  • #9

с такими файлами надо аккуратно работать, а то памяти может и не хватит
вариант fgets с этой точки зрения безопасен и наверное быстрее

Добавить комментарий