Как я могу использовать цикл for для вставки данных из таблицы csv в базу данных sql?

Это пример CSV-файла, который я использую:

Column1,Column2,Column3
data1,data2,data3
data1,data2,data3
data1,data2,data3
data1,data2,data3

Цель моей программы - вставить эту таблицу в файл php через командную строку и вставить данные в базу данных SQL. Я использую этот проект как способ научиться использовать MySql.

Берется файл csv, а затем данные преобразуются в массив или массивы. Затем создается база данных, и данные должны быть вставлены в таблицу.

Вместо вставки моих данных я получаю только одну строку с нулевыми значениями.

<?php

/**
 * Created by PhpStorm.
 * User: 
 * Date: 6/16/2017
 * Time: 11:32 AM
 */

$servername = "localhost";
$username = "pop-user";
$password = "pop-pw";
$database = 'popdb';

parse_str(implode('&', array_slice($argv, 1)), $_GET);
$file = array_map('str_getcsv', file($argv[1]));

// connecting to MySQL
$link = mysqli_connect($servername,$username,$password);

// check if connection completed
if ($link->connect_error) {
    die("Connection failed: ". $link->connect_error);
}

//creating database
printf("Creating database...\n");
$dbcheck = mysqli_select_db($link, $database);

// if database doesn't exist, then one will be created
if (!$dbcheck) {
    $sql = 'CREATE DATABASE '. $database;
    if (mysqli_query($link, $sql)) {
        echo "Database ". $database ." created\n";
    }
    else {
        echo "Failed to create database:\n";
        echo $link->error."\n";
    }
}

printf("Creating table...");
//creating table to hold information
$sql = 'USE '. $database. ';';
printf("\r\n");
mysqli_query($link,$sql);


$sql2 = "CREATE TABLE popCensus (";
foreach ($file[0] as $rows) {
    if ($rows != end($file[0]))
        $sql2 .= "{$rows} varchar(33), ";
    else
        $sql2 .= "{$rows} varchar(33)";
}
$sql2 .= ");";

echo $sql2;
printf("\r\n");
mysqli_query($link,$sql2);

printf("Inserting data into table...\n");
$cnt = 1;
$sql3 = "";
//Not inserting data
foreach ( $file as $file[$cnt]) {
    $sql3 = "INSERT INTO popcensus VALUES ( ";
    foreach ($file[$cnt] as $rows) {
        if ($rows != end($file[$cnt]))
            $sql3 .= "{$rows} , ";
        else
            $sql3 .= "{$rows});";
    }
    printf($sql3);
    printf("\n");
    mysqli_query($link, $sql3);
    $cnt++;
    printf("cnt: ". $cnt."\n");
    $sql3 = "";
}

printf("\nDone\n");
mysqli_close($link);
?>

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


person iii    schedule 30.06.2017    source источник
comment
база данных должна быть доступна, как и таблица. а) вы не должны полагаться на пользовательский ввод для создания таблиц. б) пользователь, под которым php использует базу данных, не должен иметь прав на создание таблиц (опасное действие), не говоря уже о том, что пользователь должен иметь права на создание баз данных;   -  person Ivo P    schedule 30.06.2017
comment
Вместо того, чтобы записывать его в базу данных (пока). Попробуйте вывести результаты на экран и посмотрите, где и почему это не удается.   -  person Difster    schedule 30.06.2017
comment
далее: имена таблиц — CaseSenSetive, в зависимости от вашей операционной системы. Посмотрите на команду LOAD DATA INFILE для быстрой загрузки данных в CSV.   -  person Ivo P    schedule 30.06.2017
comment
Возможный дубликат Как анализировать файл CSV с помощью PHP   -  person zod    schedule 30.06.2017
comment
@zod Я могу разбить информацию на массивы массивов. проблема, с которой я сталкиваюсь, заключается в том, чтобы впоследствии вставить их в таблицу.   -  person iii    schedule 30.06.2017
comment
но зачем делать такой длинный путь, если можно заранее определить таблицу и использовать load-data-infile? И еще: попробуйте отладить свой цикл, извлекая строки из файла   -  person Ivo P    schedule 30.06.2017


Ответы (2)


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

person zod    schedule 30.06.2017

Попробуйте проверить запрос на наличие ошибки внутри цикла foreach.

if (false === mysqli_query($link, $sql3)) {
    throw new Exception(mysqli_error($link));
}

Кроме того, вы действительно должны использовать оператор подготовки.

person Tony    schedule 30.06.2017