Рассмотрим задачу — необходимо содержимое текстового файла strings.txt загрузить в базу данных построчно, т.е. одна строка = одна запись в базе. База «data» содержит в себе таблицу, «strings», которая состоит из двух полей: уникальный ключ «id» и непосредственно содержимое «string».
Стоит обратить внимание на то, чтобы база и текстовый файл имели одинаковую кодировку. В случае примера — utf8. При необходимости один из них надо конвертировать, чтобы привести к соответствию.
Использованные функции:
fgets — чтение строки из файла
string fgets ( resource handle [, int length] )
Возвращает строку размером в length — 1 байт, прочитанную из дескриптора файла, на который указывает параметр handle. Чтение заканчивается, когда количество прочитанных байтов достигает length — 1, по достижении конца строки (который включается в возвращаемое значение) или по достижении конца файла (что бы ни встретилось первым). Если длина не указана, по умолчанию ее значение равно 1 килобайту или 1024 байтам. Параметр length стал необязательным, начиная с PHP версии 4.2.0. Если этот параметр опущен, длина строки принимается за 1024. С версии PHP 4.3, отсутствие параметра length будет приводить к чтению потока до конца строки. Если длина большинства строк в файле превышает 8 килобайт, наиболее эффективным решением в отношении ресурсов, используемых скриптом, будет указание максимальной длины строки.
mysql_escape_string — экранирование SQL спец-символы для использования в mysql_query
string mysql_escape_string ( string unescaped_string )
Функция экранирует все спец-символы в unescaped_string, вследствие чего её можно безопасно использовать в mysql_query(). При этом mysql_escape_string() не экраинрует % и _.
<?php
//Подключаемся к базе с логином и паролем, принудительно задаем кодировку операций.
$db = mysql_connect ("localhost","user","password");
mysql_query('SET character_set_database = utf8');
mysql_query('SET NAMES utf8');
mysql_select_db ("data",$db) or die("Database Error: ".mysql_error());
//Предполагается, что файл strings.txt, который надо разобрать, лежит в той же папке, что и скрипт.
$fp = fopen("./strings.txt", "r");
// Открываем файл в режиме чтения
if ($fp)
{
while (!feof($fp))
{ //Считываем файл построчно в переменную stringtext
$stringtext = fgets($fp);
if (!empty($stringtext ))
{
//Если строка считалась, заносим ее в базу. Первый параметр NULL, так как база берет на себя его заполнение с последовательным увеличением.
$query = "INSERT INTO strings (id,string) VALUES ('NULL','".mysql_escape_string($stringtext)."')";
mysql_query($query) or die(mysql_error());
}
}
}
else echo "Ошибка при открытии файла";
fclose($fp);
?>
Не срабатывает с файлов в 52 мегабайта и 2.500.000 строк, что делать?
Проверьте в разрешениях Apache и MySQL объемы разрешенных для загрузки файлов.
Скорее всего, не хватает разрешенной памяти и процесс отваливается.
Подскажите пожалуйста, а как вытащить построчно данные из текстового поля ? Применим ли данный пример для этих целей, или fgets может работать только с файлами?
fgets служит для работы с файлами. Если вы считываете не файл, вам нужно подобрать другое решение, которое зависит от того, как вы храните признак конца строки. Например, можно воспользоваться регулярным выражением, разбив текст по признаку конца абзаца и переноса каретки.
в unix это \n
в mac — \r
в windows — \r\n
Если нужно разобрать построчно текст, отправленный из формы с помощью POST запроса, метод будет выглядеть примерно так:
Ошибка следующего вида — «Table ‘test.strings’ doesn’t exist»
Александр, вам нужно создать эту таблицу, перед тем как в нее писать.
Это можно сделать с помощью phpMyAdmin, либо одноразовым вызовом следующей команды после подключения к базе, перед чтением из файла: