Importowanie danych CSV przy użyciu składni PHP / MySQL - Mysqli
W DOLE NINIEJSZEGO PYTANIA KOŃCOWY KOD, KTÓRY W końcu DZIAŁAŁ!
Próbuję to wdrożyć (Importowanie danych CSV przy użyciu PHP / MySQL). Muszę być prawie tam ...
notes1: mój $ sql pochodził prosto z kopiowania / wklejania phpmyadmin (wygeneruj kod php) i działał dobrze w phpmyadminie.
note2: Jeśli skomentuję linię $ sql = "DELETE FROM dbase", kod działa dobrze (a tabela jest czyszczona).
Więc jeśli wiem, że mój sql ma rację, a mój kod może uruchamiać inne sqls, dlaczego nie działa poniżej ?! Otrzymuję:
Wywołanie funkcji członka execute () na obiekcie nie będącym obiektem - dla linii
$stmt->execute();
Pełny kod:
<?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();
?>
tks z góry!
EDYTOWAĆ:
Wykonane poniżej zmian i nadal nie działa!
nowy kod:
<?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();
?>
To, co widzę w mojej przeglądarce po uruchomieniu, jest następujące:
Domyślna baza danych to dbname.
LOAD DATA INFILE 'C: /xampp/htdocs/myfile.csv' INTO TABLE tab FIELDS TERMINATED BY ',' LINES TERMINATED BY 'r' IGNORE 1 LINES
Przygotuj się niepowodzeniem: (1295) Ta komenda nie jest obsługiwana w przygotowanym jeszcze protokole protokołu instrukcji (mysqli) # 1 (19) {["chron_rows "] => int (-1) [" client_info "] => ciąg (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) "To polecenie nie jest jeszcze obsługiwane w przygotowanym protokole instrukcji" ["error_list"] => array (0) {} ["field_count"] => int (1) ["host_info"] => ciąg (20) "localhost przez TCP / IP" ["info"] => NULL ["insert_id"] => int (0) ["server_info"] => ciąg ( 6) „5.6.11” [„server_version”] => int (50611) [„stat”] => string (133) „Uptime: 7993 Threads: 2 Questions: 865 Slow queries: 0 Otwiera: 75 Flush tables: 1 Otwarte tabele: 68 zapytań na sekundę śred: 0,108 "[" sqlstate "] => ciąg (5)" 00000 "[" protocol_version "] => int (10) [" thread_id "] => int (117) [" warning_count "] => int (0)}
Uwaga: Jeśli skopiuję wklej łańcuch sql echo powyżej w wierszu polecenia mysql, działa dobrze. Powinno to oznaczać, że zarówno problem z lokalizacją pliku, jak i sam łańcuch sql są w porządku, nie ??
jak to może być takie trudne ?!
EDYCJA 3.
Tks za wszystkie odpowiedzi i komentarze. Ostatnia wersja kodu poniżej działa:
<?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;
};
?>
przydatne notatki:
zauważ, że ścieżka pliku używafrw-slash zamiast ukośnika domyślnego Windows. Orderwise zanotuje pracę. Bóg wie, jak to sobie wymyśliłem ...
skorzystaj z wielu kodów debugowania oferowanych w odpowiedziach. chyba jeden skuteczny sposób, aby sprawdzić, czy twój sql ma rację (echo $sql
) to i skopiuj / wklej w podpowiedzi sql. nie ufaj funkcjonalności phpmyadmin 'create php PHP code'.
pamiętaj „Przygotowane znaki nie obsługują danych LOAD”