当前位置: 首页 > 面试题库 >

使用PHP / MySQL导入CSV数据-Mysqli语法

庄弘业
2023-03-14
问题内容

在此问题的最后,最后的代码终于生效了!

尝试实现这一点使用PHP /MySQL导入CSV数据)。我一定快到了…

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();
?>

提前tks!

编辑:

进行以下更改,仍然无法正常工作!

新代码:

<?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。

LOAD DATA INFILE’C:/xampp/htdocs/myfile.csv’到TABLE选项卡字段以’,’终止,’\ r \
n’终止的行忽略1行

准备失败:(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”] =>字符串(68)“此命令在预准备语句协议中尚不支持”“ [” error_list“] => array(0){}
[” field_count“] => int(1)[“ host_info”] =>字符串(20)“通过TCP / IP的本地主机” [“ info”]
=> NULL [“ insert_id”] => int(0)[“ server_info”] =>字符串( 6)“ 5.6.11”
[“server_version“] => int(50611)[” stat“] =>
string(133)”正常运行时间:7993线程:2个问题:865慢查询:0打开:75个刷新表:1个打开表:68个每秒平均查询: 0.108“ [”
sqlstate“] =>字符串(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-slash 而不是Windows-default反斜杠。Orderwise只会记录工作。上帝知道我怎么知道那个…

  • 利用答案中提供的许多调试代码。我想一种有效的方法来检查您的sql是否正确回显(echo $sql)并复制/粘贴到sql提示符中。不要相信phpmyadmin’创建php PHP代码’功能。

  • 记住“准备好的stmts不支持LOAD DATA”


问题答案:

编辑可能的解决方案:准备好的stmts不支持LOAD DATA

如果使用mysqli_query-而不是mysqli->prepare..-> execute(); 这应该工作。

所以:

//Connect as normal above
$sql = "LOAD DATA INFILE '/myfile.csv' INTO TABLE tab"
. " FIELDS TERMINATED BY ','"
. " LINES TERMINATED BY '\r\n'"
. " IGNORE 1 LINES";

//$sql="DELETE FROM dbase";
// $stmt = $mysqli->query($sql);
// Integrate other posters good recc to catch errors:

//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;
}

对于var_dump($ mysqli)仍然有用,在这里可以看到结果拒绝访问,因为在我的环境中,我们不允许LOAD
FILE,但这告诉我引擎已成功解析并尝试执行查询。

您需要获取更好的错误信息,这可能会继续,这是我要研究的方法:

诊断过程:

$sql = "LOAD DATA INFILE ...";
echo $sql;
$stmt=$mysqli->prepare($sql);

// 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();

我的盒子上的结果(不是最好的表示形式):

  object(mysqli)#1 (18) {
  ...
  string(68) "This command is not supported in the 
              prepared statement protocol yet"

2.您可能会看到的其他可能的错误

FILE privs不足或文件Loc的目录不正确

phpMyAdmin非常漂亮,它的工作原理与mysqli / php完全不同。

从MySQL文档中解决以下内容,并阅读本节内容。就像我说的那样,LOAD..FILE是一个非常敏感的操作,有很多限制。LOAD...FILE
MySQL文档

出于安全原因,在读取服务器上的文本文件时,这些文件必须位于数据库目录中,或者所有人都可以读取。另外,要在服务器文件上使用LOAD DATA
INFILE,您必须具有FILE特权。请参见第6.2.1节“
MySQL提供的漏洞”。对于非LOCAL加载操作,如果将secure_file_priv系统变量设置为非空目录名称,则要加载的文件必须位于该目录中。



 类似资料:
  • 问题内容: 尝试从CSV导入数据时遇到了一些问题,但还有一些问题,我还没有解决。 首先,这是我的代码,可以帮助您更好地了解事物(将其整理一些,删除CSS和DB连接): 从本质上讲,这是我对各种方法进行多次尝试后发现的示例的改编。 我的CSV有两列数据,第一列是文本,第二列是整数数据库中的表也有两列,第一列称为“文本”,第二列为“数字” 所以我的问题是: 正在上传的文本只是在每个字段中显示为0,我不

  • 问题内容: 我有这样的.csv文件数据 我正在使用以下代码将数据插入数据库 但是什么也没插入;错误在哪里? 问题答案: 如果执行该操作,您会发现查询语法不正确,原因如下: 文件名应该用引号而不是反引号引起来,因为它是字符串文字而不是标识符。 绝对不需要调用在and 和子句中指定分隔符。 您过度使用了反引号。实际上,在您的情况下,由于没有使用保留字,因此请放弃所有保留字。它们只会增加混乱。 在CSV

  • 我正在将一个CSV文件中的20000行数据导入Mysql。 CSV中的列与MySQL表中的列的顺序不同。如何自动分配Mysql表列对应的列? 当我执行 此查询将所有数据添加到第一列。 请建议将数据导入Mysql的自动语法。

  • 本文向大家介绍php将csv文件导入到mysql数据库的方法,包括了php将csv文件导入到mysql数据库的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php将csv文件导入到mysql数据库的方法。分享给大家供大家参考。具体分析如下: 本程序实现数据导入原理是先把csv文件上传到服务器,然后再通过php的fopen与fgetcsv文件把数据保存到数组,然后再用while把数据一

  • 问题内容: 我有以下结构的csv文件: 使用以下MySQL函数如何导入MySQL表的第一和第三列: 我为我的英语道歉! 提前致谢 ! 问题答案: 您可以指定列,并将不需要的列标记为“ @dummy”。 替换,并且只要你喜欢。要设置不在数据文件中的其他列,您可以这样做: 作为进一步的参考,我建议您看一下MySQL参考。

  • 本文向大家介绍PHP编程实现csv文件导入mysql数据库的方法,包括了PHP编程实现csv文件导入mysql数据库的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP编程实现csv文件导入mysql数据库的方法。分享给大家供大家参考,具体如下: config.db.php内容如下; index.php内容如下: insertdb.php内容如下: 更多关于PHP相关内容感兴趣的读