2011-11-08 87 views
0

下面是示例代碼:如何添加符號`這個查詢

<?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')。我把替代的mysql_query($查詢),因爲我只是想看看是怎麼回聲查詢。

我試着爲每個列名添加`,但是出錯。

我可以得到一些提示如何添加它?

回答

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'=>'A','LastName =>'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); 

,這將確保我的數據存放在安全,配套命名PARAMATERS到$發佈陣列。

注意:這確實需要5.3,但是您可以取出內聯函數,並將它們作爲早期php版本的實際函數。

喜歡:

echo join(",", array_map('colize', array_values($posted))); 

function colize($col){return "`".$col."`";} 
+0

它呢?我假設你打算使用。而不是+,因爲這不是java ....但我仍然無法得到它的工作:http://codepad.org/nd7gSWXo告訴我這應該是如何工作完全一樣請,我想如果它更短,請使用它。 – Ben

+0

**更正**:代碼應該如下:「'$ columns ='\''。join('\',\'',$ columns)。'\'';'」。參見[這個鍵盤的證明](http://codepad.org/QJuk5oRi)。我原來的帖子確實錯誤地連接了,但我相信你知道如何使用它。當前版本**仍然較短,並且完全相同**,加上**與低於5.3 **的PHP兼容。 – Tadeck

+0

我沒有看到創建額外功能只是爲了連接,然後使用其結果連接,然後再次連接的原因。只需一個簡單的'join()'/'implode()'調用就足夠了,而不是複雜的解決方案。 – Tadeck

0

什麼是你的錯誤?您能否顯示以及生成的查詢的內容(例如echo $sql)。

只有實際上是保留字的字段名或表名才需要反引號(`)。

INSERT INTO `select` (`update`) VALUES (...) 

但是,請注意,您的代碼容易受到SQL注入的攻擊。即使字段名稱/值來自CSV文件,但如果其中任何名稱/值包含引號(')或其他SQL元字符,您的查詢將失敗。在將它們插入SQL查詢字符串之前,您必須將它們傳遞給mysql_real_escape_string()