【发布时间】:2013-12-24 12:29:21
【问题描述】:
在这个问题的底部,最终工作的最终代码!
正在尝试实现这一点 (Importing CSV data using PHP/MySQL)。我一定快到了……
notes1:我的 $sql 直接来自复制/粘贴 phpmyadmin(生成 php 代码)并在 phpmyadmin 中运行良好。
note2:如果我注释 $sql="DELETE FROM dbase" 行,代码运行正常(并且表已清理)。
所以如果我知道我的 sql 是正确的并且我的代码可以运行其他 sql,为什么下面的不运行?!我得到:
在非对象上调用成员函数 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 行
Prepare failed: (1295) 在准备好的语句协议中不支持此命令 Yetobject(mysqli)#1 (19) { ["affected_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) "prepared statement 协议尚不支持此命令" ["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) "Uptime: 7993 Threads: 2 Questions: 865 Slow queries: 0 Opens: 75 Flush表:1 打开表:每秒 68 次查询平均:0.108" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(117) ["warning_count"]=> int(0) }
注意:如果我将上面回显的 sql 字符串复制粘贴到 mysql 提示符中,它运行得很好。那应该意味着文件位置问题和sql字符串本身都很好,不是吗???
怎么这么难?!
编辑 3.
所有答案和 cmets 的 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-slash 而不是 windows-default 反斜杠。 Orderwise 只会记下工作。天知道我是怎么想出来的……
利用答案中提供的许多调试代码。我想一种有效的方法来检查你的 sql 是否正确回显 (
echo $sql) 它并在你的 sql 提示符中复制/粘贴。不要相信 phpmyadmin 'create php PHP code' 功能。请记住“准备好的 stmts 不支持加载数据”
【问题讨论】:
-
我认为 phpmyadmin 假设您会将查询括在单引号中,以便将其转义。只需在所有 ' 之前删除 \ ,我认为它应该可以工作。或者将查询括在 ' 而不是双引号 "
-
当您在外部使用双引号时,您不需要转义单引号。不是问题,但是根本不需要 \n 和 \r ,并且会使您的字符串混乱。您可以安全地删除它们。
-
@fvu 说的,我没看 :)
-
@fvu - 实际上最好指定 LINES。默认情况下没有 LINES.. 语句,mysql 在 v5.6 中查找 LINES TERMINATED BY '\n' 而不是 '\r\n'。
-
@cerd 我的意思是语句字符串部分末尾的 \n,而不是行终止符定义,但我现在发现这根本不清楚......
标签: php sql csv mysqli load-data-infile