如何为此查询添加符号`

时间:2011-11-08 19:49:18

标签: php mysql csv

以下是示例代码:

<?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),因为我只是想看看查询是怎么回事。

我尝试为每个列名添加`,但得到错误。

我可以获得一些如何添加它的提示吗?

2 个答案:

答案 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()传递它们。