Вставка многомерного массива php в базу данных mysql - PullRequest
9 голосов
/ 13 октября 2011

У меня есть массив из 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, где элементы первого массива (имя, возраст, пол)) являются заголовками столбцов, и каждый последующий массив является строкой в ​​таблице.

Может ли кто-нибудь посоветовать, как лучше всего это сделать, если я ударился об стену, и у меня осталась головная боль!1006 *

Ответы [ 7 ]

10 голосов
/ 13 октября 2011

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

$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, потому что они не позволяютфункция.В вашем собственном коде вы должны его использовать.

1 голос
/ 13 октября 2011
$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....
0 голосов
/ 10 января 2018

Массив

$arrayData = array(
     array(
        'name' => 'Paul',
        'age' => 28,
        'gender' => 'male',


    ),
     array(

        'name' => 'Rob',
        'age' => 23,
        'gender' => 'male',


    )
);

 foreach($arrayData as $data){

        $query = "INSERT INTO persons (name,gender,age)
        VALUES ('$data[name]', '$data[gender]',  $data[age])";

        //echo $query;die;
            mysql_query($query) or die(mysql_error());
            //exit;
    }
0 голосов
/ 13 октября 2011

Мое решение за 2 подхода.

  1. Сохранить значения массива как сериализованные представления данных в простой таблице БД.

  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;
    }
}
0 голосов
/ 13 октября 2011

Вы можете сделать это следующим образом:

$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 (расширение) будет «приводить» ваши значения при вставке, вам не нужно обращать внимание на типы столбцов: если столбецопределяется как целое число, в базе данных, оно будет вставлено как целое число, даже если вы указываете значение (например, возраст).

Обратите внимание на TODO я отмечен в источнике: это очень небезопасновставлять значения без их экранирования (SQL-инъекция).

0 голосов
/ 13 октября 2011

для этого массива вы можете сделать что-то простое:

$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);
}

Вы должны очистить ввод, чего я не делал в моем примере.Если ваша структура массива не гарантируется такой же, вам придется сделать что-то еще.

0 голосов
/ 13 октября 2011

Предполагая, что значение в массиве: 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...