以下是示例代码:
<?php
function csv_file_to_mysql_table($source_file, $target_table, $max_line_length=10000) {
if (($handle = fopen($source_file, "r")) !== FALSE) {
$columns = fgetcsv($handle, $max_line_length, ",");
foreach ($columns as &$column) {
$column = str_replace(".","",$column);
}
while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) {
while(count($data) < count($columns)) {
array_push($data, NULL);
}
$c = count($data);
for($i = 0; $i < $c; $i++) {
$data[$i] = "'{$data[$i]}'";
}
$sql[] = '(' . implode(',',$data) . ')';
}
$query = "INSERT INTO $target_table (".implode(",",$columns).")VALUES " . implode(',',$sql) . "\n";
echo $query;
fclose($handle);
}
}
$file = 'test.csv';
$table = 'test';
csv_file_to_mysql_table($file,$table);
?>
所以现在它将回显:INSERT INTO Mytable (FirstName,LastName) VALUES ('A','B')
。我把echo而不是mysql_query($ query),因为我只是想看看查询是怎么回事。
我尝试为每个列名添加`,但得到错误。
我可以获得一些如何添加它的提示吗?
答案 0 :(得分:2)
您可以将array_map与逗号连接一起使用来执行此操作:
$columns = join(",", array_map(
function($col) { return "`".$col."`";},
array_values($columns)));
您也可以使用它来使值更容易一些:
$values = join(",", array_map(
function($val) { return "'".$val."'";},
array_values($values)));
当我有一个像:
这样的数组结构时,我经常使用它们array('FirstName'=&gt;'A','LastName =&gt;'B');
然后我可以这样做(使用PDO和预备语句):
$posted = array('FirstName' => 'A', 'LastName => 'B');
$columns = join(",", array_map(
function($col) { return "`".$col."`";},
array_keys($posted)));
$namedparams = join(",", array_map(
function($col) { return ":".$col;},
array_keys($posted)));
$query = "INSERT INTO `sometable` ({$columns}) VALUES ({$namedparams})";
$stmt = $db->prepare($query);
$stmt->execute($posted);
这将确保我的数据安全放入,将命名的参数与$ posted数组匹配。
注意:这确实需要5.3,但你可以取出内联函数,并使它们成为早期php版本的真正功能。
像:
echo join(",", array_map('colize', array_values($posted)));
function colize($col){return "`".$col."`";}
答案 1 :(得分:0)
你得到的错误是什么?您能否显示该内容以及生成的查询的内容(例如echo $sql
)。
只有实际保留字的字段或表名才需要反引号(`),例如
INSERT INTO `select` (`update`) VALUES (...)
但请注意,您的代码容易受到SQL注入攻击。即使字段名/值来自CSV文件,如果这些名称/值中的任何一个包含引号('
)或其他SQL元字符,您的查询也将失败。在将它们插入SQL查询字符串之前,必须通过mysql_real_escape_string()
传递它们。