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
41k10 gold badges58 silver badges79 bronze badges
asked Mar 28, 2013 at 14:17
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
41k10 gold badges58 silver badges79 bronze badges
answered Mar 28, 2013 at 14:33
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-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
janischjanisch
1591 gold badge1 silver badge12 bronze badges
Что такое “Php константа __LINE__“? Получить номер строки файла в котором расположена данная константа __LINE__.
О константе __LINE__
- Что такое “Php константа __LINE__“?
- Пример использования “константы __LINE__“
Что такое “Php константа __LINE__”
Прежде чем начинать о “Php константе __LINE__” надо дать определение:
Php константа __LINE__ – возвращает номер строки файла, где расположен скрипт.
Синтаксис “Php константы __LINE__”
Синтаксиса для “константы __LINE__” не существует, эта константа применяется для вывода на экран номера строки текущего документа.
Вывод номера строки файла с помощью “__LINE__“
echo __LINE__;
Пример вывод номера строки файла
Давайте прямо здесь выведем выше приведенную конструкцию:
echo __LINE__;
Результат работы константы “__LINE__”
45
Если мы посмотрим в коде, то увидим, что действительно наша константа стоит на 45 строке.
Пример использования “константы __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
$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
Спасибо, код работает, но не с этой регуляркой…
Вот так заработало:
$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
-
#1
Поиск в txt файле, помогите определить номер строки.
Делаю поиск по файлу таким образом
PHP:
if (strpos(file_get_contents("file.txt"), "find")) echo "Есть такой!"; else echo "Нет такого";
Теперь вопрос каким образом можно определить на какой строке был найдено “find”?
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
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 с этой точки зрения безопасен и наверное быстрее