2014-10-27 8 views
0

Есть ли способ использовать функцию dymanic insert с помощью PHP?Множественный запрос INSERT INTO

У меня есть функция, которая имеет дело с несколькими файлами, которые следуют одной и той же структуре, но не всегда имеют одинаковое количество значений. Например, если файл имеет 10 значений, он будет записываться в определенную таблицу, если он имеет 3, он будет писать другому.

Я думал о распределительном блоке, что-то на линии этого псевдокода:

Однако этот блок имеет дело только со случаями, которые трудно закодированными. Мне было интересно, есть ли способ манипулировать запросом и настроить его для адаптации к количеству значений, считанных из файла, и назначить их для записи в правильную таблицу?

EDIT: Мне удалось разработать динамическую систему, которую я хотел, возможно было добавить значения, которые я хотел для строки, а затем запустить строку. Я немного изменил код (здесь была только часть, которая касалась этой темы), поэтому она не должна работать, если она скопирована и вставлена, но есть идея, как я это сделал. Приветствия за ответы.

function func($table) 
{ 
     open_file($file_name); 
     //while (!$file_name->eof()) 
     { 
      $line = explode(" ", trim($file->fgets())); 
      $query = "INSERT INTO `".$table."` VALUES ('' "; //1st value is an a.i. id 
      for($i = 0 ; $i < get_num_values($file_name)); $i++) 
      { 
       $query = $query.', ' .$line[($i)]. ''; 
      } 
      $query = $query . ')'; 
      $stmt = $con->query($query); 
     } 
} 
+0

Какова структура таблицы и какие значения вы получаете? –

+0

Вам нужно будет указать, какие «столбцы» содержатся в конкретном значении. Затем вы можете заполнить запрос динамическими столбцами и динамическими значениями. – Adimeus

+0

будет несколько таблиц, каждая для количества значений. таблица известна до вызова функции, и я все еще не кодировал ее, я просто изучаю параметры. Думаю, я понял, что вы имели в виду @Adimeus. – Comum

ответ

0

Возможное решение.

Это использует массив, хранящий имена таблиц для каждого числа столбцов.

Он также использует класс для вставки нескольких строк сразу (гораздо быстрее вставить 250 строк в один оператор вставки, чем 250 отдельных вставок).

Он перемещается по списку таблиц и создает новый экземпляр для каждого из них.

Затем он читает файл.Для каждой строки он вызывает метод make_row объекта для файла с таким количеством столбцов. Класс объекта будет делать вставку, если в нее вставлено определенное количество строк (по умолчанию 255 - легко изменить), а также будет делать вставку при вызове __DESTRUCT.

После того, как входной файл завершен, он обходит вокруг объектов таблицы и выводит их все (что запускает __DESTRUCT для каждого из них, очищая все оставшиеся вставки).

<?php 

$table_names = array(1=>'Table1Col', 2=>'Table2Col', 3=>'Table3Col', 4=>'Table4Col', 5=>'Table5Col'); 
$table_process = array(); 

foreach($table_names as $table_col_count=>$table_name) 
{ 
    $table_process[$table_col_count] = new table_process($con, $table_name); 
} 

open_file($file_name); 
while (!$file_name->eof()) 
{ 
    $line = explode(" ", trim($file->fgets())); 
    $table_process[count($line)]->make_row($line); 
} 

foreach($table_process as $table_process_name) 
{ 
    unset($table_process_name); 
} 

class table_process 
{ 

    var $db; 
    var $row_array = array(); 
    var $field_name_store = ''; 
    var $table_name = ''; 
    var $record_count = 0; 
    var $update_clause = ''; 
    var $rows_to_process = 255; 

    function __CONSTRUCT($db, $table_name, $update_clause = '') 
    { 
     $this->db = $db; 
     $this->table_name = $table_name; 
     $this->update_clause = $update_clause; 
    } 
    function __DESTRUCT() 
    { 
     if (count($this->row_array) > 0) 
     { 
      $this->process_rows(); 
     } 
    } 
    function field_names($in_field_names) 
    { 
     $this->field_name_store = "(`".implode("`,`", $in_field_names)."`)"; 
    } 
    function record_count() 
    { 
     return count($this->record_count); 
    } 
    function make_row($in_row) 
    { 
     $ret = true; 
     foreach($in_row AS &$in_field) 
     { 
      $in_field = (($in_field == null) ? "NULL" : "'".$this->db->escape($in_field)."'"); 
     } 
     $this->record_count++; 
     $this->row_array[] = "(".implode(",", $in_row).")"; 
     if (count($this->row_array) > $this->rows_to_process) 
     { 
      $ret = $this->process_rows(); 
     } 
     return $ret; 
    } 
    function process_rows() 
    { 
     $ret = true; 
     $sql = "INSERT INTO ".$this->table_name." ".$this->field_name_store." VALUES ".implode(",", $this->row_array)." ".$this->update_clause; 
     if (!$this->db->query($sql)) 
     { 
      $ret = false; 
     } 
     $this->row_array = array(); 
     return $ret; 
    } 
    public function set_rows_to_process($rows_to_process) 
    { 
     if (is_numeric($rows_to_process) and intval($rows_to_process) > 0) 
     { 
      $this->rows_to_process = $rows_to_process; 
     } 
    } 
} 

?> 

Класс ожидает класс базы данных с методом запроса. Должно быть легко изменить его в соответствии с используемым вами соединением.

+0

Я рассмотрю ваш код и попытаюсь понять его логику. В основном потому, что в моем коде не хватает эффективности (как и вы предлагали), и мне нужно повысить скорость передачи. Приветствия. – Comum

0

Это звучит, как вы хотите различные ВСТАВИТЬ заявления, которые могут различать автоматически, какую таблицу использовать из числа элементов данных (и, может быть, типа элементов данных), представленных во входном файле.

Ответ на ваш вопрос: Нет, SQL этого не делает.

С вашего вопроса вы хорошо на пути к созданию клиентской программы, специфичной для вашего приложения, которая будет делать то, что вы хотите. Написание вашей собственной программы - правильный подход: вы можете управлять логикой выбора таблицы и обработкой ошибок, зная подробности своего приложения.

0

массива подход, основанный на

Вместо добавления номера в поле, использовать подход, основанный массив:

<form action="" method="POST"> 
    <b>Product 1</b><br 
    <label>Product Id <input type="text" name="products[0][id]"></label> 
    <br> 
    <label>Product Type <input type="text" name="products[0][type]"></label> 
    <br>    
    <b>Product 2</b><br> 
    <label>Product Id <input type="text" name="products[1][id]"></label> 
    <br> 
    <label>Product Type <input type="text" name="products[1][type]"></label> 
</form> 

Теперь, если вы должны были представить это PHP и сделать print_r ($ _ POST [ «продукты»]) ;, вы получите что-то вроде следующего:

array(
    0 => array(
     'id' => '...', 
     'type' => '...', 
    ), 
    1 => array(
     'id' => '...', 
     'type' => '...', 
    ) 
) 

Это позволяет сделать логику для вставки ОНК e, а затем используйте цикл для выполнения всех полей.

The (псевдо) код будет, как:

$products = (isset($_POST['products']) && is_array($_POST['products'])) ? $_POST['products'] : array(); 

//Note that I've assumed the id column is an int, and the type column is a string. 
//In real schema, I would expect type to also be an int, but I want to illustrate proper escaping. 
//(There is more on this in a later section) 
$query = "INSERT INTO products (id, type) VALUES (%d, '%s')"; 

foreach ($products as $product) { 
    //Ensure that $product contains a valid entry, and if it does not, store errors somewhere 
    if (valid entry) { 
     $res = mysql_query(sprintf($query, (int) $product['id'], mysql_real_escape_string($product['type']))); 
     if (!$res) { 
      //Log an error about the query failing 
     } 
    } 
} 
0
function func($table) 
{ 
    open_file($file_name); 
    $line = explode(" ", trim($file->fgets())); 
    $values = "'','".implode("','", $line)."'"; 

    $query = "INSERT INTO `{$table}` values ({$values})"; 

    $stmt = $con->query($query); 
} 

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

function func($table) 
{ 
    open_file($file_name); 
    $values = "'','".str_replace(' ', "','", trim($file->fgets()))."'". 

    $query = "INSERT INTO `{$table}` values ({$values})"; 

    $stmt = $con->query($query); 
}