[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разовый скрипт, для переноса информации
Гость_Александр
Всем добрый день. Очень нужна помощь. Хотел бы начать изучать php. Считаю что в жизни пригодится. Да вот все затягивал. Дождался, пока препод в универе меня лично не попросил об услуге. Вобщем проблема такая:

У меня есть текстовый файл (file.ТХТ к примеру), в котором более 2000 записей. Это просто список имен, записанных в столбик. А так же есть база данных со столбцами "pole1" "pole2" "pole3" (к примеру). Требуется создать разовый скрипт, который скушает разом все 2000 записей и распределит определенным образом.

В "pole1" он должен вносить имена из списка, в "pole2" нужно вносить число 5, а в "pole3" фразу "polzovatel".

На что хотел бы обратить внимание:
1) Скрипт разовый и в случае повторного использования меняться не будет
2) Всю жизнь работал с АкшонСкрипт (флеш), но не с mySql и php. Поэтому в них я нуб нубом.
3) Нужно закончить до завтра (2 сентября). Работу поручил препод, и как следствие облажаться вообще нельзя. Очень прошу помочь.



Спустя 2 минуты, 44 секунды (3.09.2012 - 20:45) Игорь_Vasinsky написал(а):
покажи несколько строк из текстового файла

Спустя 3 минуты, 47 секунд (3.09.2012 - 20:49) Guest написал(а):
Lory_boy
Favorit
Misfin
Dimas_1986
oleg
test_1
Oops

Спустя 2 минуты, 19 секунд (3.09.2012 - 20:51) Игорь_Vasinsky написал(а):
ok. 5 min

Спустя 3 минуты, 57 секунд (3.09.2012 - 20:55) Игорь_Vasinsky написал(а):
<?php
$host = "localhost";
$user = "root";
$password = "";
$db = "yourdb";

$linl = mysql_connect($host, $user, $password) or die("Не могу подключиться к серверу БД");
$selectDB = mysql_select_db($db) or die("Не могу выбрать указанную БД");
mysql_query("SET NAMES 'utf8'");

$file = file("yourfile.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

foreach($file as $key=>$line)
{
if($key%100 == 0)
sleep(5);

mysql_query("INSERT INTO `yourtable` (`pole1`, `pole2`, `pole3`) VALUES ('".$line."', 5, 'polzovatel')");
}
?>



Цитата
mysql_query("SET NAMES 'utf8'");

я под юникод сделал, не вкурсе какая кодировка БД, если всё на латинице - то проканает.

Цитата
  if($key%100 == 0)
    sleep(5);


после каждого 100го инсерта пауза 5 сек., хотя и без пауз 2к запишет.

Спустя 6 минут, 9 секунд (3.09.2012 - 21:01) Guest написал(а):
Игорь, спасибо. Очень признателен. Вы не могли бы пояснить еще, как и куда все это вставить.

Спустя 8 минут, 44 секунды (3.09.2012 - 21:10) Игорь_Vasinsky написал(а):
скачать denwer http://www.denwer.ru/
установить, перегрузиться

создать папку домена (например ты поставил на C:\WebServers)
внутри папка home - там лежат папки доменов

создай в C:\WebServers\home папку test - внутри неё папку www
в папку www - создай файл index.php - в нём мой код, так же помести туда же свой файл txt

запусти денвер с ярлыка на раб столе

Тепер те нужно попасть в phpMyAdmin - для создания БД

Для проверки работоспособности сервера в адресной строке браузера набери http://localhost (или 127.0.0.1)

Если увидишь приветсвие - значит всё работает

Перейди по http://localhost/Tools/phpmyadmin/
создай БД
Выбери эту БД кликнув по ней
Перейди в кладку SQL
Создай таблицу

CREATE TABLE `mytable`(
`pole1` varchar(100),
`pole2` int(2),
`pole3` varchar(20)
)

выполни запрос

После укажи настройки в скрипте для коннекта и имя таблицы в запросе.

можно было конечно defalt для pole2 & pole3 поставить, не суть.

После создания БД набери в браузере http://test/

Должно записать БД - если что увидишь ошибки (чтоб их не пропустить на всяк случай в начале скрипта допиши
error_reporting(E_ALL);

)

Спустя 6 минут, 29 секунд (3.09.2012 - 21:16) Guest написал(а):
Про денвера и бд уже сделал. Вернее не я, но не суть. На остальное вы ответили. Большое спасибо. Пойду экспериментировать. Заодно почитаю про курсы на вашем сайте.

Спустя 1 минута, 3 секунды (3.09.2012 - 21:17) Игорь_Vasinsky написал(а):
Даже такую таблицу в БД создай, если чё он сам виноват - это оптимал под его задание
CREATE TABLE `mytable`(
`uid` int(11) auto_increment
`pole1` varchar(50),
`pole2` int(1),
`pole3` varchar(9)
)


uid - id пользователя - у каждого будет уникален, размеры и типы полей под задание

Спустя 8 минут, 16 секунд (3.09.2012 - 21:26) Guest написал(а):
Хорошо бы проверять на ошибку результат mysql_query.

Там база данных уже готовая. И в ней есть примерно 150 имен. Потом преподу надоело вручную их перегонять (вернее его сыну, а кому еще:)?). И он решил поручить это задание мне. Поскольку я им во флеш делал интерактивную презентацию для сайта универа.

Надеюсь то что в базе есть имена, не влияет?

Спустя 6 минут, 57 секунд (3.09.2012 - 21:33) Игорь_Vasinsky написал(а):
ну лучшеб на уникальность проверить

это сходу без проверки, уже на подушке лежу

<?php
$host = "localhost";
$user = "root";
$password = "";
$db = "yourdb";

$linl = mysql_connect($host, $user, $password) or die("Не могу подключиться к серверу БД");
$selectDB = mysql_select_db($db) or die("Не могу выбрать указанную БД");
mysql_query("SET NAMES 'utf8'");

$file = file("yourfile.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$query = mysql_query("SELECT `pole1` FROM `yourtable`");

if(mysql_num_rows($query))
{
while($names = mysql_fetch_assoc($query))
$allnames[] = $names;
}
else
$allnames = array();


foreach($file as $key=>$line)
{
if($key%100 == 0)
sleep(5);


if(!in_array($line, $allnames))
mysql_query("INSERT INTO `yourtable` (`pole1`, `pole2`, `pole3`) VALUES ('".$line."', 5, 'polzovatel')");
}
?>

Спустя 5 минут, 15 секунд (3.09.2012 - 21:38) Игорь_Vasinsky написал(а):
это естественно не претендует на звание изящного решения. rolleyes.gif

Спустя 3 минуты, 41 секунда (3.09.2012 - 21:42) Guest написал(а):
Супер. Очень признателен. Приятно, когда тебе препод должен:). Печаль только в том, что бд не у меня. И проверить нельзя. Но если что, он сам виноват. Спасибо, Игорь. Можно в качестве благодарности размещать вашу рекламу о продаже движка?smile.gif

Спустя 3 минуты, 33 секунды (3.09.2012 - 21:45) Игорь_Vasinsky написал(а):
используй первый вариант - и отдашь ему полную БД.

реклама уже не актуально( заменить на что нить времени нет)) - вот моего кинозавра можете порекомендовать. - с недавних пор мне оплачивают за показы рекламы, не за клики, так что трафик не помешает))

Спустя 3 минуты, 17 секунд (3.09.2012 - 21:48) Guest написал(а):
Отлично. Так и сделаю)

Спустя 6 минут, 20 секунд (3.09.2012 - 21:55) Игорь_Vasinsky написал(а):
забыл))

в начале кода сделай так

<?php

error_reporting(E_ALL);
set_time_limit(0);



а то он за минуту не выполнится)) а так ограничения сняты

Спустя 7 минут, 10 секунд (3.09.2012 - 22:02) Guest написал(а):
Игорь, если вы еще не спите... Я не исключаю вариант, что в таблице может присутствовать столбец ай ди. Все же это что то вроде стандарта. И при переносе списка я не знаю как скрипт его запишет (если изменить строку - mysql_query("INSERT INTO `yourtable` (`pole1`, `pole2`, `pole3`) VALUES ('".$line."', 5, 'polzovatel')")). Он же ведь должен быть уникальным, а так же идти по порядку. Вы не могли бы рассказать, как поступить в этом случае?

Спустя 2 минуты, 19 секунд (3.09.2012 - 22:04) Guest написал(а):
Последнюю цифру узнать можно будет на месте (если она есть). К примеру 150.

Спустя 22 минуты, 32 секунды (3.09.2012 - 22:27) Игорь_Vasinsky написал(а):
если есть id - то наверника он auto_increment, а значит будет сам увеличиваться на 1 для каждой записи.

это кстати на примере 2го дампа для создания таблицы, тока я uid назвал, можешь на id переправить.

Спустя 6 минут, 7 секунд (3.09.2012 - 22:33) Guest написал(а):
mysql_query("INSERT INTO `yourtable` (`pole1`, `pole2`, `pole3`, `id`) VALUES ('".$line."', 5, 'polzovatel', '')")

Вот так сделать? Или вобще его не трогать?

Спустя 5 минут, 32 секунды (3.09.2012 - 22:38) Игорь_Vasinsky написал(а):
используй мой код. id - сам рисоваться будет.

Спустя 3 минуты, 27 секунд (3.09.2012 - 22:42) Guest написал(а):
Окей. Еще раз спасибо)

Спустя 59 минут, 48 секунд (3.09.2012 - 23:42) Invis1ble написал(а):
Игорь_Vasinsky
зачем 100500 запросов? можно в 1-2-3 уложиться ))

Спустя 7 минут, 18 секунд (3.09.2012 - 23:49) Игорь_Vasinsky написал(а):
можно. но это разовая операция, и mysqli или mysql ...

Спустя 4 минуты, 39 секунд (3.09.2012 - 23:54) Invis1ble написал(а):
это и на mysql сделать можно

Спустя 1 минута, 1 секунда (3.09.2012 - 23:55) Игорь_Vasinsky написал(а):
продемонстрируй, чёт ничё в голову не приходит

Спустя 3 минуты, 43 секунды (3.09.2012 - 23:58) Игорь_Vasinsky написал(а):
LOAD DATA INFILE ??? и 2 крайних поля по default так?

Спустя 5 минут, 38 секунд (4.09.2012 - 00:04) Invis1ble написал(а):
собираешь массив данных и строишь ОДИН запрос (который в приципе можно разбить на 2-3, если запрос длиннее макс. длины запроса в my.ini)
INSERT INTO `table` (`field1`, `field2`) VALUES ('val1-1', 'val2-1'), ('val2-1', 'val2-2'), ... , ('val1-n', 'val2-n');


При больших объемах записываемых данных это решение на несколько порядков будет превосходить твое по скорости

Спустя 5 минут, 50 секунд (4.09.2012 - 00:10) Игорь_Vasinsky написал(а):
не слышал даже про такое))

Спустя 4 минуты, 52 секунды (4.09.2012 - 00:15) Invis1ble написал(а):
вот простой пример из моего кода полуторогодичной давности:
Свернутый текст
                $insertValues = '';

foreach ($data->sheets[0]['cells'] as $row)
{
$name = isset($row[$cols['name']]) ? $row[$cols['name']] : '';
$producer = isset($row[$cols['producer']]) ? $row[$cols['producer']] : '';
$employment = isset($row[$cols['employment']]) ? $row[$cols['employment']] : '';
$price = isset($row[$cols['price']]) ? ceil($row[$cols['price']]) : '';
$supplier_price = isset($row[$cols['supplier_price']]) ? ceil($row[$cols['supplier_price']]) : '';

$pat = '#(?! +[\pL\pN])[/;,\pZ]+#su';
$vars = array('code', 'replacement', 'original_code');

foreach ($vars as $var)
{
if (isset($row[$cols[$var]]))
{
$$var = trim($row[$cols[$var]]);
$$var = !empty($$var) ? '|' . preg_replace($pat, '|', $$var) . '|' : '';
}
else
$$var = '';
}

$insertValues .= '(' . (int)$pid . ",'" . mysql_real_escape_string($name) . "','" . mysql_real_escape_string($producer) . "','" . mysql_real_escape_string($code) . "','" . mysql_real_escape_string($replacement) . "','" . mysql_real_escape_string($original_code) . "','" . mysql_real_escape_string($employment) . "','" . mysql_real_escape_string($price) . "','" . mysql_real_escape_string($supplier_price) . "'),";

// хак, чтоб мускул не падал от большого пакета
if (strlen($insertValues) > 990000)
{
mysqlQuery(
'INSERT INTO `' . IN_DBPREFIX . 'search_data`
(`pricelist_id`,`name`,`producer`,`code`,`replacement`,`original_code`,`employment`,`price`,`supplier _price`) VALUES '
. substr($insertValues, 0, -1));

$insertValues = '';
}
}


// дописываем остатки
if ($insertValues != '')
mysqlQuery(
'INSERT INTO `' . IN_DBPREFIX . 'search_data`
(`pricelist_id`,`name`,`producer`,`code`,`replacement`,`original_code`,`employment`,`price`,`supplier _price`) VALUES '
. substr($insertValues, 0, -1));

header('Location: ' . IN_HOST . 'admin/' . $thispage);
exit();

есть лишнее, но думаю смысл понятен. Код экспортировал данные из xls в mysql (прайсы, несколько десятков тысяч позиций за один экспорт). Представь, насколько бы задумался мускул, если каждая позиция в прайсе экспортировалась отдельным запросом.

Спустя 4 минуты, 55 секунд (4.09.2012 - 00:20) Игорь_Vasinsky написал(а):
не, ну в данном случае я даже не задумался что где то кто то повиснет)) по этому срази и предложил такое решение.

а этот добавлю в закладки. есть один не решённый вопрос.

Спустя 1 минута, 41 секунда (4.09.2012 - 00:21) Invis1ble написал(а):
Игорь_Vasinsky
я даже догадываюсь какой ))

Спустя 3 минуты, 12 секунд (4.09.2012 - 00:25) Игорь_Vasinsky написал(а):
ну это про загрузку прайсов, больших прайсов)

Спустя 4 минуты, 47 секунд (4.09.2012 - 00:29) Invis1ble написал(а):
Игорь_Vasinsky
я помню твой топик )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.