php
  • mysql
  • csv
  • 2015-11-19 3 views 1 likes 
    1

    Я хочу вставить данные из файла csv, который уже находится на моем сервере в моей базе данных.Как вставить данные из файла csv в базу данных mySQL (большие данные, быстрый способ)?

    $myfile = "./files/data.csv"; 
    

    Вот мое подключение:

    class Database 
    { 
        private static $dbName = 'dbname' ; 
        private static $dbHost = 'localhost' ; 
        private static $dbUsername = 'dbuser'; 
        private static $dbUserPassword = 'dbpassword'; 
    
        private static $cont = null; 
    
        public function __construct() { 
         exit('Init function is not allowed'); 
        } 
    
        public static function 
    
    connect() 
        { 
    
        if (null == self::$cont) 
        {  
        try 
        { 
         self::$cont = new PDO("mysql:host=".self::$dbHost.";"."dbname=".self::$dbName, self::$dbUsername, self::$dbUserPassword); 
         self::$cont->query("SET NAMES utf8"); 
         self::$cont->query("SET CHARACTER SET utf8"); 
        } 
        catch(PDOException $e) 
        { 
         die($e->getMessage()); 
        } 
        } 
        return self::$cont; 
    } 
    
    public static function disconnect() 
    { 
        self::$cont = null; 
    } 
    

    }

    И это, как я вставить данные в базу данных:

    error_reporting(E_ALL); ini_set('display_errors', 1); 
    
    try { 
        $pdo = Database::connect(); 
        $sql = "LOAD DATA INFILE '$myfile' 
        INTO TABLE `animals` 
        FIELDS TERMINATED BY ',' 
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n' 
        (id,name,animal)"; 
        $q = $pdo->query($sql); 
        $q->execute(); 
    } catch (PDOException $q) { 
        echo 'Connection failed: ' . $q->getMessage(); 
    } 
    

    Мой файл CSV выглядит следующим образом:

    12,fred,cat, 
    13,tom,dog, 
    

    И это мой стол животных в моей базе данных

    ╔════╦═════════╦════════╦════════╗ 
    ║ id ║ name ║ age ║ animal ║ 
    ╠════╬═════════╬════════╬════════╣ 
    ║ ║   ║  ║  ║ 
    ║ ║   ║  ║  ║ 
    ║ ║   ║  ║  ║ 
    ║ ║   ║  ║  ║ 
    ╚════╩═════════╩════════╩════════╝ 
    

    К сожалению, это не работает, это означает, что никакие данные не будут записаны в моей базе данных. Надеюсь, вы сможете помочь :)

    +0

    Есть ли какой-либо причине вы не можете просто загрузить его непосредственно? http://stackoverflow.com/questions/3635166/how-to-import-csv-file-to-mysql-table –

    +0

    Возможный дубликат [Импорт CSV-данных с использованием PHP/MySQL] (http://stackoverflow.com/questions/11448307/importing-csv-data-using-php-mysql) – Rehmat

    +1

    'INTO TABLE 'животные' удаляют цитаты или используют тики' '' 'и ваши столбцы тоже' ('id', 'name', 'animal') '. Проверка ошибок PDO помогла бы вам здесь http://php.net/manual/en/pdo.error-handling.php –

    ответ

    0

    Наконец-то я получил его работу. Причина в том, что на самом деле не было разрешения на сервер. Это была проблема в соединении с базой данных.

    Вот рабочий код:

    $pdo = Database::connect(); 
    
    $sql = "LOAD DATA LOCAL INFILE 'http://www.mypage.myfile.csv' 
         INTO TABLE test 
         FIELDS TERMINATED BY ',' 
         OPTIONALLY ENCLOSED BY '\"' 
         LINES TERMINATED BY '\n' 
         IGNORE 1 LINES 
         (id,name,animal)"; 
    
    $con=mysqli_connect("localhost","dbuser","dbpassword","dbname"); 
    
    if (mysqli_connect_errno()) { 
        echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    }; 
    
    $result = mysqli_query($con, $sql); 
    
    if (mysqli_affected_rows($con) == 1) { 
        $message = "The data was successfully added!"; 
    } else { 
        $message = "The user update failed: "; 
        $message .= mysqli_error($con); 
    }; 
    
    echo $message; 
    mysqli_close($con); 
    
    1

    На стороне сервера MySQL есть факторы, которые могут влиять на поведение LOAD DATA INFILE.

    MySQL Config

    MySQL имеет свои ограничения на местном и сервера доступа к файловой системе. Одна из таких системных настроек - --secure_file_priv, которую вы можете read more about in the manual.

    --secure_file_priv

    Эта переменная используется, чтобы ограничить эффект импорта и экспорта данных операций, таких как те, которые выполняются с помощью LOAD DATA и SELECT ... INTO OUTFILE заявления и функции LOAD_FILE(). По умолчанию эта переменная пуста. Если задано имя каталога, он ограничивает операции импорта и экспорта, чтобы работать только с файлами в этом каталоге.

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

    Также убедитесь, что вы предоставили абсолютный путь к файлу в своем коде, поскольку относительные пути не будут иметь смысла для сервера.

    MySQL User Privelages

    Смотрите MySQL Manual Раздел 6.2.1 Privileges Provided by MySQL для получения более подробной информации о том, как привилегии пользователя можно осуществить с помощью LOAD DATA INFILE и SELECT .. INTO OUTFILE (т.е. пользователь подключения к MySQL должен иметь FILE привилегии, чтобы иметь возможность использовать эти заявления). Это будет ваш self::$dbUsername в этом случае.

    Filesystem Permissions

    Наконец, пользователь MySQL должен иметь достаточные разрешения файловой системы для чтения из файла или в противном случае он не сможет завершить операцию. Вы можете гарантировать, что это не проблема, используя chmod(), чтобы включить разрешения на чтение в мире.Обычно ваш umask должен уже охватывать это, но лучше сначала проверить, а не предполагать, что это так.

    лучше Обработка ошибок

    Кроме того, так как вы используете try/catch здесь, вероятно, важно отметить, что вы можете поставить PDO в режиме исключения, так как в противном случае не бросать исключения в случае вашего Сервер MySQL возвращает ошибку, например, в этом случае.

    Вы можете сделать это в вызове конструктора к PDO, как так ...

    new PDO($dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); 
    

    Смотрите руководство по Errors and error handling для деталей.

    +0

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

    +0

    @Sherif , спасибо, я изменил его на реальный путь, но мой код все еще не работает – Jarla

    +0

    Не обязательно у, нет. Это не ошибка PHP. Это ошибка MySQL. Вы можете получить информацию об ошибках с сервера MySQL через PDO, если вы установите PDO в режиме ошибок исключения или установите флажок 'errorInfo()', но не ясно, что OP сделал это в этом случае. – Sherif

    Смежные вопросы