将多维php数组插入到mysql数据库中



我有一个csv中的数组,其结构与此类似:

$array = array(
    array('name', 'age', 'gender'),
    array('Ian', 24, 'male'),
    array('Janice', 21, 'female')
);

我想把它插入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,但请注意,我删除了对codepad.org上mysql_real_eescape_string((的调用,因为它们不允许使用该函数。在您自己的代码中,您应该使用它。

$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,则在数据库中,它将以integer形式插入,即使您引用了值(例如:年龄(。

请注意源代码中标记的TODO i:在不转义值的情况下插入值是非常不安全的(SQL注入(。

假设数组中的值为TRUSTEDSECURE

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

我在两个问题中的解决方案。

  1. 将数组值保存为简单DB表中数据的序列化表示形式。

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

阵列

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

做这类事情的最佳方法是在PDO库的帮助下使用准备好的语句和事务。PDO是PHP中任何DB交互的最简单选择。

准备好的语句快速、简单,而且它们提供了参数绑定,可以保护您免受SQL注入的副作用。

DB事务确保插入所有数据或根本不插入任何数据。它们还可以显著提高此类任务的性能。

下面是一个示例代码:

// create new connection to MySQL using PDO class
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false
]);
$array = array(
    array('name', 'age', 'gender'),
    array('Ian', 24, 'male'),
    array('Janice', 21, 'female')
);
// discard the header row (1st row) from the array
array_shift($array);
// start transaction
$pdo->beginTransaction();
// prepre SQL statemenet with 3 placeholders
$stmt = $pdo->prepare('INSERT INTO csv_table(name, age, gender) VALUES(?,?,?)');
foreach ($array as $row) {
    $stmt->execute($row);
}
// end transaction
$pdo->commit();

标题行怎么样

正如您在上面的代码中所看到的,我正在丢弃标题行。由于SQL表是刚性的,我需要事先知道列的名称是什么。如果您想将CSV中的列与架构中的列动态匹配,那么您需要添加一些逻辑,这些逻辑将查看列的硬编码列表(您也可以从information_schema获取此信息(,并将其与CSV中的列名匹配。

代码可以按如下方式进行调整。遍历CSV中的列名,如果代码中没有定义任何列,则引发异常。如果所有列都已验证,则implode()列名称并将其注入SQL字符串。

$array = array(
    array('name', 'age', 'gender'),
    array('Ian', 24, 'male'),
    array('Janice', 21, 'female')
);
$table_columns = ['age', 'gender', 'name'];
// Validate CSV header row (1st row) against your schema columns
$header = array_shift($array);
foreach ($header as $col_name) {
    if (!in_array($col_name, $table_columns, true)) {
        throw new Exception('Incorrect column name specified in CSV file');
    }
}
// start transaction
$pdo->beginTransaction();
// prepre SQL statemenet with 3 placeholders
$stmt = $pdo->prepare('INSERT INTO csv_table('.implode(',', $header).') VALUES(?,?,?)');
foreach ($array as $row) {
    $stmt->execute($row);
}
// end transaction
$pdo->commit();

向SQL插入多数组的最直接方法可能是:

$queryIn = "INSERT INTO table (resultsArray) values (" . print_r($multiArray, true) . "')";

这很管用。

相关内容

  • 没有找到相关文章

最新更新