В НИЖНЕЙ ЧАСТИ ЭТОГО ВОПРОСА ОКОНЧАТЕЛЬНЫЙ КОД, КОТОРЫЙ НАКОНЕЧНО РАБОТАЕТ!Импорт CSV-данных с использованием PHP/MySQL - синтаксис Mysqli
Пытается реализовать это (Importing CSV data using PHP/MySQL). Я, должно быть, почти там ...
notes1: мой $ sql пришел прямо из копии/вставки phpmyadmin (сгенерировал PHP-код) и отлично работал в phpmyadmin.
примечание2: если я прокомментирую строку $ sql = "DELETE FROM dbase", код работает просто отлично (и таблица очищается).
Так что, если я знаю, что мой sql прав, и мой код может запускать другие sqls, почему нижеследующее не работает ?! Im получение:
вызов функции члена выполнить() на не-объект - для линии
$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();
?>
ТКС заранее!
EDIT:
Сделано ниже изменений и по-прежнему не работает!
новый код:
<?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();
?>
Что я вижу в моем браузере, когда я побежал это следующее:
По умолчанию база данных имя_бд.
LOAD DATA 'C: /xampp/htdocs/myfile.csv' входной_файл в таблицу Поля вкладки TERMINATED BY '' LINES TERMINATED BY '\ г \ п' ИГНОРИРУЙТЕ 1 ЛИНИИ
Подготовьте не удалось: (1295) Эта команда не поддерживается в подготовленном протоколе whileobject (mysqli) # 1 (19) {["affected_rows"] => int (-1) ["client_info"] => string (79) "mysqlnd 5.0.11-dev - 2012-07-14 - $ 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 "] => строка (20)" localhost через 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 в порядке, нет ???
как это может быть так сложно ?!
EDIT 3.
Tks для ответов на все вопросы и комментарии.Окончательный код версии ниже работы:
<?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-слэш вместо окон-умолчанию обратно-слэш. По порядку просто заметьте работу. Бог знает, как я понял, что один из них ...
использовать многие коды отладки, предлагаемые в ответах. Я думаю, один эффективный способ проверить, правильно ли ваш sql для эха (
echo $sql
), и скопировать/вставить в вашу подсказку sql. не доверяйте функциям phpmyadmin 'create php PHP code'.иметь в виду 'Подготовленные stmts не поддерживают LOAD DATA'
Я думаю, что phpmyadmin предположил, что вы должны заключить запрос в одинарные кавычки, чтобы он ускользнул от них. Просто удалите \ before all ', и я думаю, что он должен работать. Или заключите запрос в «вместо двойных кавычек» – AbraCadaver
Поскольку вы используете двойные кавычки снаружи, вам не нужно избегать одиночных кавычек. И не проблема, но \ n и \ r вообще не нужны , и загромождать вашу строку.Вы можете смело удалить их – fvu
И что @fvu сказал, я не смотрел на это :) – AbraCadaver