使用PHP / MySQL导入CSV数据-Mysqli语法
技术问答
260 人阅读
|
0 人回复
|
2023-09-14
|
最后,最终代码生效了!& {$ R% l5 i0 \2 T" { H4 Z
尝试实现这一点PHP /MySQL导入CSV数据)。我一定快到了。…+ T: D5 |. s; ~
notes1:我的$ sql直接来自复制/粘贴phpmyadmin(生成php而且在phpmyadmin运行得很好。 A; s% A/ G6 Q) e4 P5 Y6 K1 V9 F
note如果我注释的话$ sql =“ DELETE FROM dbase”行,代码将正常运行(并且表已清除)。0 J* f4 E% _9 _, L* t8 i; f; I" k
因此,如果我知道我的sql是的,我的代码可以运行其他代码sql,为什么下面的代码不能运行?我越来越多:/ D+ U& X( f" l/ r: m9 {) U3 m
在非对象上调用成员函数execute()-对于该行
, C* x4 X7 M4 H4 N$stmt->execute();完整代码:
8 H/ \6 K3 `+ n) lprepare($sql);$stmt->execute(); $stmt->close();$mysqli->close();?>提前tks!
! p0 _/ U+ B! s; s! y编辑:
( b8 C% U, a; v下列变更仍不能正常工作!
* j, Y/ o1 W/ S4 B新代码:
" y$ W) x. ~2 [; ] dquery("SELECT DATABASE()")) $row = $result->fetch_row(); printf("Default database is %s.\n",$row $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 " u: x( L3 I4 t
";echo "
9 r' x; w' ~# r+ \9 z5 a7 |";echo $sql;echo "
+ a+ ~5 x$ e, w$ z: i3 j";echo "% ?9 t) f& C. y; E5 |; r
";$stmt=$mysqli->prepare($sql);/* Prepared statement,stage 1: prepare */if (!($stmt = $mysqli->prepare($sql))) echo "repare 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();?>在操作此命令时,我在浏览器中看到的内容如下:
$ N+ x4 h0 B6 c缺乏数据库是dbname。1 S* ]2 v8 @6 O6 w" A8 `( ~7 R
LOAD DATA INFILE’C:/xampp/htdocs/myfile.csv’到TABLE选项卡字段’,’终止,’\ r \
+ V- {+ [) }6 t4 fn’终止行忽略1行2 g; Z& w$ u/ h2 C
准备失败1295)预备语句协议不支持此命令yetobject(mysqli)#(19){ affected_rows”] =>/ F% b- l& M4 U p9 |2 j
int(-1)[“ client_info”] => string(79)“ mysqlnd 5.0.11-dev-20120503-$. A7 B1 G( R, _7 B
Id:40933630edef551dfaca71298a83fad8d03d62d4 $“ [” client_version“] =>" z l& ^: n8 b- I3 {. N
int(50011)[” connect_errno“] => int(0)[” connect_error“] => NULL [” errno“] =># D4 \7 E/ Q1 V; f; D" n: V
int(1295)[“ error”] => [error_list“] => array(0){}
- {8 S: o; |+ M! Z[” field_count“] => int(1)[“ host_info”] =>通过字符串(20)TCP / IP [ info”]
1 A% d) n8 {# q9 ^2 b=> NULL [“ insert_id”] => int(0)[“ server_info”] =>字符串( 6).6.11”6 c, L! S4 q0 ~6 Q
[“server_version“] => int(50611)[” stat“] =>, h: c; J* i7 a, j+ ^
string(133)正常运行时间:7993线程:2个问题:865慢查询:0打开:75个刷新表:1个打开表:68个平均每秒查询: 0.108“ [”
; I2 r7 R# L. |0 Z( x8 Tsqlstate“] => [protocol_version“] => int(10)[” thread_id“] =>
( D+ K1 M9 H u- fint(117)[” warning_count“] => int(0)}
+ ^$ i; D* M9 Y/ u注意:如果我把上面的回显回来sql复制粘贴字符串mysql在提示符中,运行正常。这应该意味着文件位置和sql字符串本身很好,不是吗?; b# P1 ?" D( ^
怎么会这么难?
8 J, r9 R v5 o9 j8 X) G5 v编辑3。' e' }9 q2 h( y0 w5 C8 K5 D
感谢您的所有答案和意见。以下最终代码版本有效:% z9 o7 N$ N' ^" Q9 d
query($sql))) echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;};?>有用说明:* b6 @* W* b/ O% M/ W& P8 O+ {; M
请注意,文件路径使用 frw-slash 而不是Windows-default反斜杠。Orderwise只记录工作。上帝知道我怎么知道那个。…9 N! \# i4 A- e
使用答案中提供的许多调试代码。我想有效的方法来检查你sql是否正确回显(echo $sql)并复制/粘贴sql提示符中。不要相信phpmyadmin’创建php PHP代码’功能。
) |( n( C3 ]1 Y1 w; _) o6 \记住准备好了stmts不支持LOAD DATA”
; Q9 V+ u8 }8 w 2 ]) a. S# D& k$ d
解决方案:
; l) k4 w+ m4 ~% i% T ?- |( C 编辑可能的解决方案:准备好stmts不支持LOAD DATA。
0 a ] r; D# O R如果使用mysqli_query-而不是mysqli->prepare..-> execute(); 这应该工作。' J) V i$ F6 M
所以:
# N& |; R9 ]% c4 C//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 errorif (!($stmt = $mysqli->query($sql))) echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;}对于var_dump($ mysqli)还是有用的,这里可以看到拒绝访问的结果,因为在我的环境中,我们不允许LOAD- S$ B9 P9 C. K' ]7 g3 Y1 _ x+ ~
FILE,但这告诉我,引擎已经成功分析并试图执行查询。% t- T1 Q& o; @2 c
您需要获得更好的错误信息,这可能会继续,这是我想研究的方法:
$ ^, c# T' b3 Y<strong>/strong>
' q+ E4 \ \) o) _4 R! k5 T/ `$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();我盒子上的结果(不是最好的表达方式):
) C. t3 Z! \3 X8 H" v( {; P4 l: A7 {4 L3 @ object(mysqli)#1 (18) ... string(68) "This command is not supported in the prepared statement protocol yet"2.你可能会看到的其他可能的错误4 m) J \1 f q4 L
FILE privs不足或文件Loc目录不正确
# x! O" o; B8 V0 D' AphpMyAdmin非常漂亮,它的工作原理和mysqli / php完全不同。7 E5 h+ q8 O9 l' ~2 X
从MySQL解决以下内容,阅读本节。正如我所说,LOAD..FILE操作非常敏感,限制很多。LOAD...FILE
5 n; u' {* ?* v" Y+ U7 C; k0 c+ wMySQL文档0 s" i+ n; Z9 u9 R3 U
出于安全原因,在阅读服务器上的文本文件时,必须位于数据库目录中,或者每个人都可以阅读。此外,还应使用服务器文件LOAD DATA3 o, i6 T8 J& f8 K' `
INFILE,您必须具有FILE特权。请参见第六.2.1节“& J5 B# D- x- B# w
MySQL提供的漏洞。LOCAL如果将加载操作secure_file_priv如果将系统变量设置为非空目录名称,则必须在该目录中加载文件。 |
|
|
|
|
|