У меня есть массив из csv с аналогичной структурой:
Array ( [0] => Array ( [0] => name [1] => age [2] => gender ) [1] => Array ( [0] => Ian [1] => 24 [2] => male ) [2] => Array ( [0] => Janice [1] => 21 [2] => female ) etc
Я хотел бы вставить его в таблицу mysql, где элементы первого массива (имя, возраст, пол) являются заголовками столбцов, а каждый последующий массив является строкой в таблице.
Может ли кто-нибудь посоветовать, как лучше всего это сделать, поскольку я ударил стену, и это оставило меня с больной головой!
Следующий код будет работать, но он предполагает, что длина всех вложенных массивов одинакова, другими словами, каждый вложенный массив содержит значения для всех атрибутов, определенных в первом вложенном массиве.
$array = array( array('name', 'age', 'gender' ), array('Ian', 24, 'male'), array('Janice', 21, 'female') ); $fields = implode(', ', array_shift($array)); $values = array(); foreach ($array as $rowValues) { foreach ($rowValues as $key => $rowValue) { $rowValues[$key] = mysql_real_escape_string($rowValues[$key]); } $values[] = "(" . implode(', ', $rowValues) . ")"; } $query = "INSERT INTO table_name ($fields) VALUES (" . implode (', ', $values) . ")";
Это решение будет работать с любым количеством атрибутов, определенных в первом вложенном массиве, если все остальные вложенные массивы имеют одинаковую длину. Для массива выше выход будет:
INSERT INTO table_name (name, age, gender) VALUES (Ian, 24, male), (Janice, 21, female)
Для демонстрации см. http://codepad.org/7SG7lHaH , но обратите внимание, что я удалил вызов mysql_real_escape_string () на codepad.org, потому что они не позволяют эту функцию. В своем коде вы должны использовать его.
$fields = implode(',', array_shift($array)); // take the field names off the start of the array $data = array() foreach($array as $row) { $name = mysql_real_escape_string($row[0]); $age = (int) $row[1]; $gender = mysql_real_escape_string($row[2]); $data[] = "('$name', $age, '$gender')"; } $values = implode(',', $data); $sql = "INSERT INTO yourtable ($fields) VALUES $values"; $result = mysql_query($sql) or die(mysql_error());
Это должно создать строку запроса, например:
INSERT INTO yourtable (name, age, gender) VALUES ('Ian', 24, 'male'), ('Janice', 21, 'female'), etc....
для этого массива вы могли бы сделать что-то простое:
$array = csv_array(); // this is your array from csv $col_name = $array[0][0]; $col_age = $array[0][1]; $col_gender = $array[0][2]; for($i = 1; $i < count($array); $i++){ //this is where your sql goes $sql = "INSERT INTO `table` ($col_name, $col_age, $col_gender) VALUES($array[$i][0], $array[$i][1], $array[$i][2])"; $db->query($sql); }
Вы должны дезинформировать ввод, который я не делал в моем примере. Если структура массива не гарантируется одинаково, вам придется сделать что-то еще.
Вы можете сделать это так:
$rows = array( array('name', 'age', 'gender'), array('Ian', 24, 'male'), array('Janice', 21, 'female') ); $columns = array_shift($rows); $rows = array_map(function($row) { /* * TODO: escape column values */ return '"' . implode('", "', $row) . '"'; }, $rows); $sql = 'INSERT INTO ... (' . implode(', ', $columns) . ') VALUES (' . implode('), (', $rows) . ')';
Поскольку mysql (расширение) будет «отличать» ваши значения от вставки, вам не нужно обращать внимание на типы столбцов: если столбец определяется как integer, в базе данных он будет вставлен как целое, даже если вы укажете значение (например: возраст).
Обратите внимание на TODO i, отмеченный в источнике: очень опасно вставлять значения, не избегая их (SQL-инъекция).
Предполагая, что значение в массиве TRUSTED и SECURE .
$count = count($array); $keys = $array[0]; for($i = 1; $i < $count; $i++) { $query = "INSERT INTO tablename (" . implode(",", $keys) . ") VALUES ('" . implode ("','", $array[$i]) . "');"; $query = str_replace(',)', ')', $query); mysql_query($query); }
Мое решение в 2 аспектах.
Сохраните значения массива как сериализованные представления данных в простой таблице БД.
Сохраните значения массива в отдельных табличных полях.
Рабочий пример:
$array = array( 0 => array ( "name", "age", "gender"), 1 => array ( "Ian", "24", "male"), 2 => array ( "Janice", "21", "female") ); foreach($array as $key1 => $value1){ foreach($value1 as $key2 => $value2){ // assuming the first element (0) in the array is the header value and the header value is a valid array key if($key1 > 0){ $items[$key1-1][ $array[0][$key2] ] = $value2; } } } // 1. store values as serialized representation foreach ($items as $key => $value) { $sql = "INSERT INTO datatable SET data = ".mysql_real_escape_string(serialize($value)).""; echo $sql.PHP_EOL; } // 2. auto create fields in database and store values foreach ($array[0] as $key1) { $sql = "ALTER TABLE forms ADD '".$key1."' TEXT NOT NULL"; echo $sql.PHP_EOL; } foreach ($items as $key1 => $value1) { foreach($value1 as $key2 => $value2){ $sql = "INSERT INTO datatable SET ".$key2." = '".mysql_real_escape_string($value2)."'"; echo $sql.PHP_EOL; } }