2012-09-24 56 views
2

想知道如果有人能找到这个错误:你在你的SQL语法错误

$sqlinsert = "LOAD DATA LOCAL INFILE 
\'$target_path\' INTO TABLE 'db_usergroup' 
FIELDS TERMINATED BY \',\' ENCLOSED BY \'\"\' ESCAPED BY \'\\\\\' 
LINES TERMINATED BY \'\\r\\n\'"; 

$target_path在其确切的名称略有不同,但一个例子是:

temp/24_09_12_16_57_27_invoice_example.csv 

我得到这个错误:

An error occurred. The file could not be imported. 
Error with MySQL Query: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near 
'\'temp/24_09_12_16_57_27_invoice_example.csv' INTO TABLE 
'db_usergroup' FIELDS T' at line 1 

所有帮助是非常感谢。

+0

使生活更轻松,而且不易出错,使用定界符语法。 http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc –

回答

0

你为什么要逃避目标路径中的引号?我不认为这是必要的。

您通常可以通过检查for the right syntax to use near之后的前几个字符来准确地确定错误是什么,这似乎表明反斜杠存在错误。

尝试:

$sqlinsert = "LOAD DATA LOCAL INFILE '$target_path' INTO TABLE ... 
+0

另外,封装表名的约定是什么? :) – Erik

+0

埃里克:是的,但我怀疑这将是_next_问题:-)这一特定的一个是由逃逸引起的。自从MarcB已经介绍它以后,我不会将其添加到我的答案中。 – paxdiablo

+0

@Erik我试过不逃避目标路径,但它也给出了一个错误,按照你和Marc建议的以及两者的各种组合,我仍然得到语法错误 –

0

'db_usergroup'是无效的。 '单引号将该表名转换为一个字符串,MySQL将禁用该字符串。除非是保留字,否则不需要引用/转义表或字段名称。为此,您使用反引号,例如

LOAD DATA ... `db_usergroup` ... 
       ^--   ^-- 

后续:

$sqlinsert = <<<EOL 
LOAD DATA LOCAL INFILE '$target_path' 
INTO TABLE db_usergroup 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
ESCAPED BY '\\' 
LINES TERMINATED BY '\r\n' 
EOL; 
+0

已经完成它,因此它是: $ sqlinsert =“LOAD DATA LOCAL INFILE \'$ target_path \'INTO TABLE'db_usergroup' FIELDS TERMINATED BY \',\'ENCLOSED BY \'\'\'ESCAPED BY \'\\\\\'LINES TERMINATED BY \'\\ r \\ n“'; 我现在得到: 发生错误,无法导入文件MySQL查询错误:您的SQL语法错误;查看与您的MySQL服务器版本对应的手册在第一行\'\',\'ENCLOSED BY \'\'ESCAPED BY \'\\\'LINES TERMINATED BY \'\ r \ n \'上使用正确的语法 –

+0

您正在过度逃避。没有必要在''''引用的字符串中转义'''引号,MySQl会看到这些转义字符,并且认为你正在尝试使用文字'''作为字段名的一部分,而不是。 –

+0

好吧我试过了几个组合,似乎无法得到它,我明显错过了明显的。你能为我拼出来吗?谢谢。 –