Мне нужно импортировать мой текстовый файл с расширением .txt в mysql напрямую или через php. В текстовом файле в каждой строке текст. Как посоветуете решить это задачу? Функцию чтения я реализовал Код (Text): <?php $f = fopen("C:\Games\Counter-Strike 1.6\cstrike\addons\amxmodx\logs\allinfo_players.txt", "r"); // Читать построчно до конца файла while(!feof($f)) { echo fgets($f) . "<br />"; } fclose($f); ?> нужно чтобы этот файл попал в базу, а от туда я буду брать информацию в шаблон сайта для вывода данных об игроках * Дополняю вопрос: Возможно ли постоянно очищать программно текстовый файл, или записи mysql при выключении сервера, или же читать данные по игрокам за последнее время? Код (Text): L 02/07/2013 - 19:17:51: KaPaHgaLLI | STEAMID: BOT | IP: 127.0.0.1 L 02/07/2013 - 19:17:52: Devil | STEAMID: BOT | IP: 127.0.0.1 L 02/07/2013 - 19:17:52: BlackJ@CK | STEAMID: BOT | IP: 127.0.0.1 сам файл выглядит вот так Добавлено спустя 43 минуты 23 секунды: Код (Text): <?php // читаем файл в массив $fopen=@file("id.txt"); // номер строки (напоминаем, что php считает с 0, //т.е. данный скрипт выведет вторую строку) $need="1"; print $fopen[$need]; // или сразу print "$fopen[1]"; ?> Как вывести несколько последних строк после (L 02/07/2013 - 19:17:51 ??
Не вижу никаких проблем. Сначала каждую строку разбиваешь на массив строк, где признаком разделения является символ '|' , затем для каждого элемента такого массива array('L 02/07/2013 - 19:17:51: KaPaHgaLLI', 'STEAMID: BOT ', 'IP: 127.0.0.1') делаешь тоже разбиения только по другим критериям, таким как ':' для 2 и 3 элемента и для 1 элемента чуть-чуть сложнее. Дату со временем можешь преобразовать в unix-формат или datetime. Таким образом ты вычленишь нужные данные из строки, такие как дата и время, логин, стимид и айпи. И с этим уже можешь формировать строку для одного большого инсерта всех записей в mysql. На счет доп. вопроса - можешь отбирать и сортировать, например, по дате.
Если честно я новичек в этом деле, поэтому для меня как раз это и есть проблемка) я даже не знаю как это реализовать Добавлено спустя 15 минут 5 секунд: Код (Text): <?php $fp = 'C:\Games\Counter-Strike 1.6\cstrike\addons\amxmodx\logs\allinfo_players.txt'; $file = array_reverse(file($fp)); for($i=0; $i<25; $i++) { echo $file[$i]; } ?> сделал так, но выводит не по списку через <br> а все подряд, помогите переписать Добавлено спустя 44 минуты 37 секунд: Или хотябы подсказать как выводить строку, убрезая на несколько символов вначале?
ОК. Лови решение. Проверил - работает. SQL: Код (Text): CREATE TABLE `tbl_logs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `log_date` int(20) NOT NULL, `username` varchar(50), `steamid` varchar(50), `hostname` int(16), PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; PHP: Код (Text): <?php mysql_connect("localhost", "root", ""); mysql_select_db("one"); $f = fopen('log.txt', 'r'); $sql = array(); while(!feof($f)) { $row = fgets($f); $data = explode("|", $row); $date_time_and_username_src = $data[0]; $date_time = explode("-", $date_time_and_username_src); $date = substr($date_time[0], 2); $time_username = $date_time[1]; $time_username = explode(":", $time_username); $h = trim($time_username[0]); $m = trim($time_username[1]); $s = trim($time_username[2]); $username = trim($time_username[3]); $date = explode("/", $date); $y = trim($date[2]); $month = trim($date[0]); $d = trim($date[1]); $sid = explode(":", $data[1]); $ip = explode(":", $data[2]); $sid = trim($sid[1]); $ip = trim($ip[1]); echo "Год ".$y."<br>"; echo "Месяц ".$month."<br>"; echo "Число ".$d."<br>"; echo "Часов ".$h."<br>"; echo "Минут ".$m."<br>"; echo "Секунд ".$s."<br>"; echo "Пользователь ".$username."<br>"; echo "STEAMID ".$sid."<br>"; echo "IP ".$ip."<br>"; echo "<hr>"; //2010-02-06 19:30:13 $sql[] = '("'.$y.'-'.$month.'-'.$d.' '.h.':'.$m.':'.$s.'", "'.$username.'", "'.$sid.'", "'.$ip.'")'; } fclose($f); echo implode(',', $sql); mysql_query('INSERT INTO tbl_logs (log_date, username, steamid, hostname) VALUES'.implode(',', $sql)); ?> Проверь. Вроде все работает. Конечно, не самое элегантное решение, да и проверок наго навтыкать. А это так навскидку, за часок накидал. Доработаешь - и все будет ОК. выбрать все сегодняшние логи: Код (Text): select * from tbl_logs where DATE(log_date) = CURDATE()
Спасибо! Данные попадают в базу, но с ошибками и как то вообще странно, а при открытии файла с этим скриптом куча ошибок но тем не менее выводит Вот пример: Код (Text): Год 2013 Месяц 02 Число 06 Часов 06 Минут 11 Секунд 31 Пользователь Wol@nd STEAMID BOT IP 127.0.0.1 ( ! ) Notice: Use of undefined constant h - assumed 'h' in C:\wamp\www\sql_logs.php on line 42 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 1 in C:\wamp\www\sql_logs.php on line 16 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 1 in C:\wamp\www\sql_logs.php on line 19 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 2 in C:\wamp\www\sql_logs.php on line 20 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 3 in C:\wamp\www\sql_logs.php on line 21 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 2 in C:\wamp\www\sql_logs.php on line 23 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 1 in C:\wamp\www\sql_logs.php on line 25 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 1 in C:\wamp\www\sql_logs.php on line 26 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 2 in C:\wamp\www\sql_logs.php on line 27 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 1 in C:\wamp\www\sql_logs.php on line 28 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 ( ! ) Notice: Undefined offset: 1 in C:\wamp\www\sql_logs.php on line 29 Call Stack # Time Memory Function Location 1 0.0006 391184 {main}( ) ..\sql_logs.php:0 Добавлено спустя 2 минуты 24 секунды: А в добавок еще и пустых кучу строк создает ((
Наверное, дело пустых строках. Сбрось мне оригинальный лог-файл. Или на Swapf@mail.ru или сюда в личку(не знаю точно здесь можно файлы прикреплять?). Щас все поправим) Не переживай) Добавлено спустя 33 минуты 48 секунд: Да, дело в пустых строках. Сделаю - отпишусь Добавлено спустя 21 минуту 58 секунд: Код (Text): <?php mysql_connect("localhost", "root", ""); mysql_select_db("one"); $f = fopen('allinfo_players.txt', 'r'); $sql = array(); while(!feof($f)) { $row = fgets($f); //var_dump($row); if((strlen($row)==2)||!$row) continue; $data = explode("|", $row); if(count($data)>3) { $data[0].="|".$data[1]; $data[1]=$data[2]; $data[2]=$data[3]; } $date_time_and_username_src = $data[0]; $date_time = explode("-", $date_time_and_username_src); $date = substr($date_time[0], 2); if(count($date_time)>2) { $date_time[1].="-".$date_time[2]; } $time_username = $date_time[1]; $time_username = explode(":", $time_username); $h = trim($time_username[0]); $m = trim($time_username[1]); $s = trim($time_username[2]); $username = trim($time_username[3]); $date = explode("/", $date); $y = trim($date[2]); $month = trim($date[0]); $d = trim($date[1]); $sid = explode(":", $data[1]); $ip = explode(":", $data[2]); $sid = trim($sid[1]); $ip = trim($ip[1]); echo "Год ".$y."<br>"; echo "Месяц ".$month."<br>"; echo "Число ".$d."<br>"; echo "Часов ".$h."<br>"; echo "Минут ".$m."<br>"; echo "Секунд ".$s."<br>"; echo "Пользователь ".$username."<br>"; echo "STEAMID ".$sid."<br>"; echo "IP ".$ip."<br>"; echo "<hr>"; $sql[] = '("'.$y.'-'.$month.'-'.$d.' '.$h.':'.$m.':'.$s.'", "'.$username.'", "'.$sid.'", "'.$ip.'")'; } fclose($f); echo implode(',', $sql); mysql_query('INSERT INTO tbl_logs (log_date, username, steamid, hostname) VALUES'.implode(',', $sql)); ?> Добавлено спустя 7 минут 45 секунд: Добавил проверку на пустые строки, которые идут в лог-файле через каждую нормальную строку, к тому же у меня была опечатка в одном месте. Еще добавил нормальную вставку для пользователей у кого в нике по одному символу "|" или "-". Думаю этого достаточною. Возникнет нужда доработать - пиши.
Ай спасибо!!!! Вопрос - при каждом обращении к скрипту база будет пополняться? и какой функцией обеспечить вывод (например 15 последних) данных по типу НИК STEAMID IР ДАТА ололо 123231 127,0,0,1 дд мм гг
Да, при каждом обращении с скрипту база будет пополняться. Можно, конечно, с этим что-нибудь придумать, если надо. Чтобы выбрать последние 15 свежих записей, то вот: Код (Text): select log_date, username, steamid, hostname from tbl_logs order by log_date DESC limit 15
А пример php скрипта обращения к записям можно? Код (Text): select log_date, username, steamid, hostname from tbl_logs order by log_date DESC limit 15 Это напоминает sql ) А вот такой вариант - sql_log.php - это мой файл с этим скриптом, я создаю еще один например monitoring.php в него что нужно добавить чтобы monitoring.php обращался к sql_log.php ,который в свою очередь обращается и пополняет базу выдавая последние несколько значений? (Я наверное сильно заморочился, прощу прощения за это)
Это он и есть)) В принципе ты можешь удалять все записи в таблице перед тем, как вставить новые, или удалять все, кроме тех, что были добавлены за определенный период, или чтобы всего записей было не больше 1000. Или можно сделать еще хитрее. Вообще тут вариантов тьма) Единственное ограничения - фантазия) А насчет запроса ты спрашивал - чтобы в самом скрипте выводилось?
http://109.197.254.86/sql_logs.php вот скрипт прощу обратить внимание в самый низ, там вообще бардак, я планирую этот скрипт инклудить к страничке сайта, чтобы он мне показывал часть пользователей, вот и думаю как это реализовать Добавлено спустя 2 минуты 40 секунд: В принципе я разобрался в выводе данных из txt Вот мой код Код (Text): <?php $strok = 30; $fp = 'C:\Games\Counter-Strike 1.6\cstrike\addons\amxmodx\logs\allinfo_players.txt'; $array_string =(file($fp, FILE_IGNORE_NEW_LINES)); $vsego = count($array_string) - $strok; $counter=0; foreach($array_string as $item){ while($counter >= $vsego) { echo substr($item,24)."<br>"; break; } $counter++; } ?> Он выводит 15 последних игроков ...а вот как реализовать сам этот скрипт Код (Text): <?php mysql_connect("localhost", "root", ""); mysql_select_db("one"); $f = fopen('allinfo_players.txt', 'r'); $sql = array(); while(!feof($f)) { $row = fgets($f); //var_dump($row); if((strlen($row)==2)||!$row) continue; $data = explode("|", $row); if(count($data)>3) { $data[0].="|".$data[1]; $data[1]=$data[2]; $data[2]=$data[3]; } $date_time_and_username_src = $data[0]; $date_time = explode("-", $date_time_and_username_src); $date = substr($date_time[0], 2); if(count($date_time)>2) { $date_time[1].="-".$date_time[2]; } $time_username = $date_time[1]; $time_username = explode(":", $time_username); $h = trim($time_username[0]); $m = trim($time_username[1]); $s = trim($time_username[2]); $username = trim($time_username[3]); $date = explode("/", $date); $y = trim($date[2]); $month = trim($date[0]); $d = trim($date[1]); $sid = explode(":", $data[1]); $ip = explode(":", $data[2]); $sid = trim($sid[1]); $ip = trim($ip[1]); echo "Год ".$y."<br>"; echo "Месяц ".$month."<br>"; echo "Число ".$d."<br>"; echo "Часов ".$h."<br>"; echo "Минут ".$m."<br>"; echo "Секунд ".$s."<br>"; echo "Пользователь ".$username."<br>"; echo "STEAMID ".$sid."<br>"; echo "IP ".$ip."<br>"; echo "<hr>"; $sql[] = '("'.$y.'-'.$month.'-'.$d.' '.$h.':'.$m.':'.$s.'", "'.$username.'", "'.$sid.'", "'.$ip.'")'; } fclose($f); echo implode(',', $sql); mysql_query('INSERT INTO tbl_logs (log_date, username, steamid, hostname) VALUES'.implode(',', $sql)); ?> чтобы при инклуде файла с этим скриптом у меня не было слишком много запросов
все, что в файле sql_log.php кроме тех участков, где идет коннект к mysql и выбирается БД ты можешь оформить в функцию, например, updatelog(). Затем в файле monitoring.php подключить к нему sql_log.php через require_once('sql_log.php'). И все в monitoring.php можешь вызывать функцию обновления логов, ну и в monitoring.php еще добавть Код (Text): $res = mysql_query('select log_date, username, steamid, hostname from tbl_logs order by log_date DESC limit 15') Думаю, с результатом выборки $res разберешься, что делать.
Я наверное не так понял это содержимое файла monitoring.php Код (Text): <? require_once('sql_log.php') $res = mysql_query('select log_date, username, steamid, hostname from tbl_logs order by log_date DESC limit 15') ?> выдает чистый экран
Это не бардак, это рабочий беспорядок, нужная вещь. Если не нравится - закомментируй echo implode(',', $sql) вот так //echo implode(',', $sql); Это касается моего скрипта. А чтобы часто не вызывался - я уже отписал выше - оформи функцией, которая вызывается, если в УРЛе $_GET['update']=true&secure_key=знаешь_только_ты_и_скрипт. Добавлено спустя 2 минуты 19 секунд: У тебя шорт-теги или ты php в <? ?> забыл написать? Правильно ничего не выводит - результат запроса обработать еще нужно)
Закомментил, все ровно, все шикарно! а в базе небольшой беспорядок например столбец hostname вместо значения 127,0,0,1 выдает 1270 стимид и лог_дата тоже неполное значение выдает Добавлено спустя 1 минуту 53 секунды: синтаксическая ошибка в строке Код (Text): $res = mysql_query('select log_date, username, steamid, hostname from tbl_logs Добавлено спустя 2 минуты 8 секунд: пожалуй лучше я прямиком из базы буду доставать значения)))) Единственное что мешает это то что информация времени стимида и хостнейма поступает в урезанном виде (
точка с запятой в конце должна быть. У меня все ровно выдает. Не понял где у тебя проблема - в БД криво записывается или оттуда читается?
ага, например вместо 127,0,0,1 написано 1270 тоже самое касается даты - вместо полной даты просто 2013 написано... стимид тоже не полное значение имеет
Доработал кое-что. Теперь нет ограничений сколько у пользователя в имени символов '|' и '-'. Проверь сейчас. Код (Text): <?php mysql_connect("localhost", "root", ""); mysql_select_db("one"); $f = fopen('allinfo_players.txt', 'r'); $sql = array(); while(!feof($f)) { $row = fgets($f); //var_dump($row); if((strlen($row)==2)||!$row) continue; $data = explode("|", $row); if(count($data)>3) { for($i=0; $i<count($data)-3; $i++) { $data[0].="|".$data[$i+1]; } $data[1]=$data[count($data)-2]; $data[2]=$data[count($data)-1]; } $date_time_and_username_src = $data[0]; $date_time = explode("-", $date_time_and_username_src); $date = substr($date_time[0], 2); if(count($date_time)>2) { for($i=2; $i<count($date_time); $i++) { $date_time[1].="-".$date_time[$i]; } } $time_username = $date_time[1]; $time_username = explode(":", $time_username); $h = trim($time_username[0]); $m = trim($time_username[1]); $s = trim($time_username[2]); $username = trim($time_username[3]); $date = explode("/", $date); $y = trim($date[2]); $month = trim($date[0]); $d = trim($date[1]); $sid = explode(":", $data[1]); $ip = explode(":", $data[2]); $sid = trim($sid[1]); $ip = trim($ip[1]); echo "Год ".$y."<br>"; echo "Месяц ".$month."<br>"; echo "Число ".$d."<br>"; echo "Часов ".$h."<br>"; echo "Минут ".$m."<br>"; echo "Секунд ".$s."<br>"; echo "Пользователь ".$username."<br>"; echo "STEAMID ".$sid."<br>"; echo "IP ".$ip."<br>"; echo "<hr>"; $sql[] = '("'.$y.'-'.$month.'-'.$d.' '.$h.':'.$m.':'.$s.'", "'.$username.'", "'.$sid.'", "'.$ip.'")'; } fclose($f); echo implode(',', $sql); mysql_query('INSERT INTO tbl_logs (log_date, username, steamid, hostname) VALUES'.implode(',', $sql)); ?>
То же самое в базу попадает вместо "127,0,0,1" - "1270" вместо полной даты только год (2013) и тоже со стимид (
Несколько раз все проверил. Все записывается верно. Ниже - скрин, я там даже первому пользователю - и | добавлял, чтобы проверить. >350 проверил, все правильно работает. вот еще
странно...эм, а может мне просто пересоздать таблицу с другими значениями? Код (Text): CREATE TABLE `tbl_logs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `log_date` int(20) NOT NULL, `username` varchar(50), `steamid` varchar(50), `hostname` int(16), PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; в этом дело не может быть? Кстати у тебя стимид тоже не полный показан )))
Последнее, что ты мне на почту прислал, я проверил. Все правильно. Ты последней версией скрипта пользуешься??? Специально доработал. Там все должно быть ровно. Добавлено спустя 3 минуты 12 секунд: ДРУЖИЩЩЕ!!! Я понял... я же таблицу потом у себя правил, а тебе сказать забыл, думал это очевидно. У меня тип данных для хостнайм варчар(16), а у тебя инт(16), вот он тебе целые и выдает. Лови мою таблицу! Код (Text): DROP TABLE IF EXISTS one.tbl_logs; CREATE TABLE `tbl_logs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `log_date` datetime NOT NULL, `username` varchar(50) DEFAULT NULL, `steamid` varchar(50) DEFAULT NULL, `hostname` varchar(15) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;
http://smotr.im/ch2E специально перекопировал скрипт, удалил все из базы и снова его заюзал Добавлено спустя 28 секунд: Воот ) как я и говорил уже ранее )) сейчас опробуем ) Вот теперь все отлично! если не считать того что стимид показан не до конца у бота он написан как BOT а у игрока имеет такую надпись STEAMID STEAM 0 564654654156 например