2009-11-28 4 views
0

Я пытаюсь загрузить данные из нескольких сотен текстовых файлов в базу данных.Вставить группы строк с PHP & MYSQL

Я считаю, что MYSQL выходит из цикла, не вставляя все строки.

Может ли кто-нибудь предложить, как вставлять блоки из 1000 строк в конец данных с помощью PHP-кода?

$filenames_array = array(); 

foreach($filenames_array as $filename) 
{ 

     $file_array  = file($filename); 
     $file_value  = $file_array[0]; 
     $new_array = explode(",", $file_value); 
     $length   = count($new_array); 


     for($i = 0; $i < $length; $i++) 
     { 

     $sql = "INSERT INTO `names` 
      (`id`, `name`) 

      VALUES 
      ('', 
      '" . $new_array[$i] . "' 
      )"; 

     $result = mysql_query($sql) or die(mysql_error()); 
     echo $i . 'Row Inserted<br />'; 
     } 

    } 
+0

Где $ filenames_array инициализации? Какая петля заканчивается раньше? Для петли? Почему вы уверены, что for-loop заканчивается раньше? Когда он заканчивается, умирает (mysql_error()); заявление дает вам какой-либо результат? Если да, то почему? Что значит «блоки из 1000 строк до конца данных»? Вы хотите добавить 1000 записей в существующую таблицу MySQL за раз? – jkndrkn

+0

Я не нашел времени, чтобы напечатать массив имен файлов. Это массив всех имен файлов. Я думаю, проблема кроется в mysql. Причина, по которой я говорю это, заключается в том, что экспорт SQL с phpmyadmin распаковывает вставки в блоки из 1500 строк. Я прошу сделать что-то подобное. – rrrfusco

ответ

0

Возможно, вы пытаетесь запустить слишком много инструкций INSERT в одном запросе.

посмотреть в PDO и подготовленных операторов или использовать синтаксис SQL, как это:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 
+0

, если он имеет дело с несколькими сотнями текстовых файлов, я не думаю, что синтаксис с несколькими вставками будет жизнеспособным решением? – jaywon

+0

он действительно не отправляет много вложений в одном запросе - всегда по одному за раз – michaelk

+0

Вставка нескольких строк с одним запросом выполняется быстрее, чем с несколькими запросами, поэтому, если его сценарий истекает, переписывая его, чтобы вставить 1000 строк в один запрос, может помочь. –

0

Возможно ли, что одна из записей, которые вы пытаетесь вставить содержит апостроф «? В этом случае произойдет ошибка, и цикл не завершится.

Вы должны всегда избегать значений, которые вы вставляете в базу данных с помощью mysql_real_escape_string, чтобы предотвратить подобные проблемы, и убедиться, что вы не уязвимы для sql injection.

$sql = "INSERT INTO `names` 
      (`id`, `name`) 

      VALUES 
      ('', 
      '" . mysql_real_escape_string($new_array[$i]) . "' 
      )"; 
+0

Данные не содержат одинарных кавычек. Я думаю, что это проблема с MYSQL. – rrrfusco

0

Почему бы не объединить каждый txt-файл в один большой текстовый файл и прочитать его по строкам? Смотрите примеры здесь http://php.net/manual/en/function.fgets.php

Главным образом:

<?php 
$handle = @fopen("/tmp/inputfile.txt", "r"); 
if ($handle) { 
    while (!feof($handle)) { 
     $buffer = fgets($handle, 4096); 
     echo $buffer; 
    } 
    fclose($handle); 
} 
?> 
+0

У меня есть несколько сотен текстовых файлов. Копирование и вставка всей информации поражает цель написания этого кода. MYSQL выходит после 1100 строк. Мне нужно вставить около 6000 строк. – rrrfusco

+0

Объединив все в текстовый файл, я не имел в виду копирование и вставку. Возможно, вы могли бы прочитать список всех файлов в массиве, скопировать содержимое каждого из них с помощью file_get_contents и file_put_contents и все это сделать автоматически! :) – darkAsPitch

Смежные вопросы