из текстовика в дб, строки по разделителю

Статус
В этой теме нельзя размещать новые ответы.

E-body

C.D.\Zennoposter проекты на заказ
Регистрация
6 Сен 2007
Сообщения
997
Реакции
343
Есть текстовик с содержимым:

php script выбирает записи по очередно где BRK как разделитель.
Работает, но выборку делает только примерно 5-ую часть, добавляя один пост а не множество по одиночке как надо.
Требуется внесение записей в дб по одному стиху с понимаением разделителя указанного в переменной (в данном случае BRK)
 
Вместо $db[$i] поставь
trim($db[$i])
или в строке $row_br = "BRK"; задавай переход на новую строку \r\n ну или тот который используешь.

Второй баг $row_num = 0; замени на $row_num = -1;
 
Вместо $db[$i] поставь
trim($db[$i])
или в строке $row_br = "BRK"; задавай переход на новую строку \r\n ну или тот который используешь.
Второй баг $row_num = 0; замени на $row_num = -1;
не заценил ваше решение, серавно спасибки, пока свое наисали:
PHP:
...
$db = implode(file($file));
$row = explode($row_br,$db);
for($i=0;$i<count($row);$i++) {....
работает
 
А зачем $db = implode(file($file));
Лучше $db = file_get_contents($file); и работает быстрее, и корректно обработает некоректные переходы на новую строку
 
А зачем $db = implode(file($file));
Лучше $db = file_get_contents($file); и работает быстрее, и корректно обработает некоректные переходы на новую строку

откуда информация что работает быстрее? кто то замерял скорость или целиком полагаемся на эмпирику?
 
откуда информация что работает быстрее? кто то замерял скорость или целиком полагаемся на эмпирику?



А у тебя быдлокод, это очевидно даже не только с точки зрения скорости, но из избыточности операций. Зачем считывать содержимое файла в массив а потом опять склеивать все это в строку?
 
Немного изменили код, который добавляет то что между границ. Но один косяк покачто не плучилось победить.
Имеется код, берет из текстовика и все что между BRT то добавляет в дб и если строка не меньше 5 символов.
PHP:
$file = "text.txt";
$row_br = "BRT";

$db = file_get_contents($file);
$row = explode($row_br,$db);

for($i=0;$i<count($row);$i++) {

 if(!empty($row[$i]) && strlen($row[$i]) > 5) {
  $query = mysql_query ("SELECT ...");
  if(@mysql_num_rows($query) > 0) {echo "Информация в базе уже существует<br>";}
  else {mysql_query("INSERT ... VALUES ...."); echo "Информация в базу добавлена<br>";}
 }
 else {echo "Пустая Строка<br>";}
}
Косяк в том что он не добавляет материал полностью что находиться именно между BRT указателями. А перепрыгивает если предложение находятся через двойной Enter

...
BRT
Добавит нормально в базу данных
Желаем искренне, сердечно
Не знать волнений и помех,
Чтоб сопутствовали вечно
Здоровье, радость и успех.
BRT
Добавит только половину до двойного enter
Желаем искренне, сердечно
Не знать волнений и помех,

Чтоб сопутствовали вечно
Здоровье, радость и успех.
BRT

А такое вообще проигнрирует
Желаем искренне, сердечно
Не знать волнений и помех,
Чтоб сопутствовали вечно
Здоровье, радость и успех.
BRT
...

Требуется принудиельно указать что выбор информации идет сразу после BRT и до следующего BRT

Условие if(!empty($row[$i]) && strlen($row[$i]) > 5) наверно лишнее влепил но без него никак ибо в дб добавит много пустышек
-
Может по регуларному выражени выбрку устроить...
PHP:
if (preg_match('|BRT(.*)BRT|sei', $str, $arr)) $title = $arr[1];
	   else $title='';
регулярка правильная?)
 
для корректной работы с БД данные форматируются ф-ей mysql_real_escape_string (втч. новые строки заменяются на \r\n)
и соответсвенно при двойном переносе без форматирования mysql вернет ошибку
также если разделитель может отличаться лучше использовать preg_split

PHP:
$file = "text.txt";
$row_br = "BRT";

$db = file_get_contents($file);
$rows = preg_split('|\s*'.preg_quote($row_br).'\s*|',$db,0,PREG_SPLIT_NO_EMPTY);

$date = date("d.m.y H:i");
foreach($rows as $row) if(strlen($row)>5) { $row=mysql_real_escape_string($row);
   $query = mysql_query("SELECT `cmain` FROM `stihi` WHERE `cmain` = '".$row."' LIMIT 1");
   if(mysql_num_rows($query) > 0) echo "Информация в базе уже существует<br>";
   else { mysql_query("INSERT INTO `stihi` VALUES('','avto','".$date."','0','".$row."','ok')");
   echo "Информация в базу добавлена<br>"; }
   }
 
А зачем $db = implode(file($file));
Лучше $db = file_get_contents($file); и работает быстрее, и корректно обработает некоректные переходы на новую строку

readfile() память не жрёт в отличии от file_get_contents
 
для корректной работы с БД данные форматируются ф-ей mysql_real_escape_string (втч. новые строки заменяются на \r\n)
и соответсвенно при двойном переносе без форматирования mysql вернет ошибку
также если разделитель может отличаться лучше использовать preg_split
PHP:
$file = "text.txt";
$row_br = "BRT";
$db = file_get_contents($file);
$rows = preg_split('|\s*'.preg_quote($row_br).'\s*|',$db,0,PREG_SPLIT_NO_EMPTY);
$date = date("d.m.y H:i");
foreach($rows as $row) if(strlen($row)>5) { $row=mysql_real_escape_string($row);
   $query = mysql_query("SELECT `cmain` FROM `stihi` WHERE `cmain` = '".$row."' LIMIT 1");
   if(mysql_num_rows($query) > 0) echo "Информация в базе уже существует<br>";
   else { mysql_query("INSERT INTO `stihi` VALUES('','avto','".$date."','0','".$row."','ok')");
   echo "Информация в базу добавлена<br>"; }
   }
Не понятно почему, но скрипт добавляет в дб только первую букву (если на русском, а английский тескт то нормально весь) содержимого внутри указателей ($row_br = "BRT";)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху