Импорт данных CSV с использованием PHP / MySQL - синтаксис Mysqli
Внизу этого вопроса заключительный кодекс, который окончательно сработал!
Пытаюсь реализовать это (Импорт данных CSV с использованием PHP / MySQL). Я должен быть почти там ...
notes1: мой $ sql пришел прямо из phpmyadmin (скопировать / вставить) (сгенерировать код php) и прекрасно работал в phpmyadmin.
note2: Если я прокомментирую строку $ sql = "DELETE FROM dbase", код будет работать нормально (и таблица очищена).
Так что, если я знаю, что мой sql правильный и мой код может запускать другие sqls, почему ниже не работает ?! Я получаю:
Вызов функции-члена execute () для необъекта - для строки
$stmt->execute();
Полный код:
<?php
$mysqli = new mysqli('localhost','root','pass','dbase');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql = "LOAD DATA INFILE \'./myfile.csv\' INTO TABLE tab\n"
. " FIELDS TERMINATED BY \',\'\n"
. " LINES TERMINATED BY \'\\r\\n\'\n"
. " IGNORE 1 LINES";
//$sql="DELETE FROM dbase";
$stmt=$mysqli->prepare($sql);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>
ТКС заранее!
РЕДАКТИРОВАТЬ:
Сделано ниже изменений и до сих пор не работает!
новый код:
<?php
$mysqli = new mysqli('localhost','root','pass','dbase');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* return name of current default database */
if ($result = $mysqli->query("SELECT DATABASE()")) {
$row = $result->fetch_row();
printf("Default database is %s.\n", $row[0]);
$result->close();
}
$sql = "LOAD DATA INFILE 'C:/xampp/htdocs/myfile.csv' INTO TABLE tab
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\r\\n'
IGNORE 1 LINES";
echo "<br>";
echo "<br>";
echo $sql;
echo "<br>";
echo "<br>";
$stmt=$mysqli->prepare($sql);
/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare($sql)))
{ echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
// NOTE HERE WE'RE DUMPING OUR OBJ TO SEE THAT IT WAS
// CREATED AND STATUS OF PREPARE AND THEN KILLING SCRIPT
var_dump($mysqli);
exit();
//$sql="DELETE FROM intrasdump
$stmt=$mysqli->prepare($sql);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>
Когда я запускаю браузер, я вижу следующее:
База данных по умолчанию - dbname.
ЗАГРУЗИТЬ ИНФИЛЬ ДАННЫХ 'C: /xampp/htdocs/myfile.csv' на вкладку ТАБЛИЦА ПОЛЯ, ЗАПРЕЩЕННЫЕ ',' ЛИНИИ, ПРЕКРАЩЕННЫЕ '\ r \ n' ИГНОР 1 ЛИНИИ
Не удалось подготовиться: (1295) Эта команда не поддерживается в протоколе подготовленного оператора yetobject (mysqli) # 1 (19) {["disabled_rows"] => int (-1) ["client_info"] => string (79) " mysqlnd 5.0.11-dev - 20120503 - $ Id: 40933630edef551dfaca71298a83fad8d03d62d4 $ "[" client_version "] => int (50011) [" connect_errno "] => int (0) [" connect_error "] => NULL [" errno " => int (1295) ["error"] => string (68) "Эта команда еще не поддерживается в подготовленном протоколе операторов" ["error_list"] => array (0) {} ["field_count"] => int (1) ["host_info"] => string (20) "localhost via TCP / IP" ["info"] => NULL ["insert_id"] => int (0) ["server_info"] => string ( 6) "5.6.11" ["server_version"] => int (50611) ["stat"] => string (133) "Время работы: 7993 Тем: 2 Вопросы: 865 Замедленных запросов: 0 Открытий: 75 Сброс таблиц: 1 Открытые таблицы: 68 запросов в секунду avg: 0.108 "[" sqlstate "] => string (5)" 00000 "[" protocol_version "] => int (10) [" thread_id "] => int (117) [" warning_count "] => int (0)}
Примечание: если я скопирую вставленную выше строку sql в приглашение mysql, она будет работать нормально. Это должно означать, что проблема с расположением файла и самой строкой sql в порядке, нет ???
как это может быть так сложно ?!
РЕДАКТИРОВАТЬ 3.
Ткс за все ответы и комментарии. Окончательная версия кода ниже работает:
<?php
$mysqli = new mysqli('localhost','root','pass','dbname');
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql = "LOAD DATA INFILE 'C:/xampp/htdocs/myfile.csv' INTO TABLE tab
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\r\\n'
IGNORE 1 LINES";
//Try to execute query (not stmt) and catch mysqli error from engine and php error
if (!($stmt = $mysqli->query($sql))) {
echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;
};
?>
полезные заметки:
обратите внимание, что путь к файлу используетFRW-слэш вместо обратной косой черты по умолчанию. Orderwise просто отметит работу. Бог знает, как я понял это ...
Воспользуйтесь многими кодами отладки, предлагаемыми в ответах. Я думаю, один эффективный способ проверить, правильно ли ваш sql echo (echo $sql
) это и скопировать / вставить в вашей командной строке. не доверяйте phpmyadmin функциональности «создавать PHP-код PHP».
имейте в виду, что «подготовленные stmts не поддерживают загрузку данных»