2014-10-08 3 views
2

Я пытаюсь использовать mysql LOAD DATA LOCAL INFILE, чтобы получить некоторые данные csv в моей базе данных mysql с помощью php-скрипта с использованием mysqli. Это то, что моя SQL строка выглядит следующим образом:mysql load data infile через php script - не работает

LOAD DATA LOCAL INFILE '/var/www/html/dashmaker/uploads/HHdata.csv' INTO TABLE dashmaker.HHdata FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES; 

Это то, что мой PHP скрипт выглядит следующим образом:

$sql = "LOAD DATA LOCAL INFILE '/var/www/html/dashmaker/uploads/HHdata.csv' 
     INTO TABLE dashmaker.HHdata 
     FIELDS TERMINATED BY ',' 
     OPTIONALLY ENCLOSED BY '\"' 
     LINES TERMINATED BY '\n' 
     IGNORE 1 LINES;"; 

$con=mysqli_connect("localhost","[user]","[password]","[database]"); 
// Check connection 
if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
}; 

$result = mysqli_query($sql, $con); 

if (mysql_affected_rows() == 1) { 
    $message = "The data was successfully added!"; 
} else { 
    $message = "The user update failed: "; 
    $message .= mysql_error(); 
}; 

echo $message; 

mysqli_close($con); 

я обнаружил, что мне нужно, чтобы установить MySQL my.cnf включить локальный-INFILE под [mysql] и [mysqld] - поэтому я сделал это.

Когда я запускаю запрос sql через оболочку, он работает. Когда я пытаюсь сделать это через PHP скрипт сообщение об ошибке ($ сообщение) теперь я получаю говорит:

The user update failed: Access denied for user ''@'localhost' (using password: NO) 

Одно странно то, что он не показывает имя пользователя перед @ «локальный». Не могу понять, почему. Кроме того, я использую тот же параметр подключения для запуска обычных запросов SELECT из базы данных с использованием php-скриптов. Пользователь также имеет привилегии FILE.

Я искал экстенсивно, но не нашел ничего, что могло бы объяснить, что происходит. Любые советы будут высоко ценится.

+1

Вы смешивания API для MySQL с '' mysql_' и mysqli_' функций. Они не ** смешивают; используйте 'mysqli_' исключительно. Кроме того, вы не используете скобки в '[user]' и т. Д., Не так ли? Это не MSSQL, это MySQL, удалите их. –

+1

Плюс, в mysqli_, соединение DB приходит первым, инвертируйте эти '$ result = mysqli_query ($ sql, $ con);' для чтения как '$ result = mysqli_query ($ con, $ sql);' –

+1

Спасибо! Невероятно быстрый ответ! Это работает. Я думаю, что сообщение об ошибке также отбрасывало меня - mysql_affected_rows() теперь mysql_affected_rows ($ con) ... и я не использовал квадратные скобки для пользователя/пароля - просто означало, что это были заполнители. Еще раз спасибо! –

ответ

7

Вы смешиваете API MySQL с mysql_ и mysqli_ функциями в нескольких случаях.

  • mysql_affected_rows()
  • mysql_error()

Они делают не смесь вместе; использование mysqli_исключительно.

Плюс, вы не используете скобки в [user] и т. Д., Не так ли? Это синтаксис MSSQL, удалите их.

Plus, в mysqli_, DB соединение приходит первым, инвертировать эти $result = mysqli_query($sql, $con); читать, как $result = mysqli_query($con, $sql);

$sql = "LOAD DATA LOCAL INFILE '/var/www/html/dashmaker/uploads/HHdata.csv' 
     INTO TABLE dashmaker.HHdata 
     FIELDS TERMINATED BY ',' 
     OPTIONALLY ENCLOSED BY '\"' 
     LINES TERMINATED BY '\n' 
     IGNORE 1 LINES;"; 

$con=mysqli_connect("localhost","user","password","database"); 
// Check connection 
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);