2013-09-30 104 views
0

我正在嘗試爲從cs文件加載一些值的cron作業構建腳本。此CSV文件有2個字段加載CSV值,然後在mysql數據庫中搜索匹配

product_id 
price 

該腳本將從CSV中加載值,然後在mysql表中搜索product_id匹配項。如果找到,它將使用CSV中的相應價格更新表格中特定匹配的product_id的價格。

到目前爲止我已經到了下面的代碼,但我被困在需要比較CSV數組值和mysql數組值的部分。

<?php 
// DB part 
$con = mysqli_connect('localhost','user','pass','db'); 
if (!$con) 
    { 
    die('Could not connect: ' . mysqli_error($con)); 
    } 

mysqli_select_db($con,"products"); 

     $sql="SELECT product_id, price, FROM products"; 

     $result = mysqli_query($con,$sql); 
     $row = mysqli_fetch_array($result); 

// CSV part 
$file_handle = fopen("prices.csv", "r"); 


while (!feof($file_handle)) { 

    $line_of_text = fgetcsv($file_handle, 1024); 

    $code = str_replace(' ', '', $line_of_text[0]); // 
    $price = str_replace(' ', '', $line_of_text[1]); // 



    if (in_array($code, str_replace(' ', '', $row))) 
      { 
      echo "Match found"; 
      print $code . " - " . $price . "<br />"; 
      } 
      else 
      { 
      echo "Match not found"; 
      print $code . " - " . $price . "<br />"; 
      } 
    } 
fclose($file_handle); 
mysqli_close($con); 
?> 
+2

發現[LOAD DATA INFILE(http://dev.mysql.com/doc/refman/5.1/en/load-data.html) –

+0

我確實已經閱讀過這個問題,但問題是創建CSV文件的用戶並不像數據庫中那樣完全插入product_id,有時候只是其中的一部分,並且因爲可以在數據庫中找到多個匹配項,所以每個cotaining部分那product_id和我需要對這些重複項和那些未找到的項進行report.txt並將它們通過電子郵件發回給用戶,以便他可以重新檢查product_ids並更新CSV。 –

+0

這就是爲什麼我想檢查表中的值,如果只有一個被發現,更新價格,如果發現多個不更新,並通過電子郵件報告和未發現的報告,報告他們太。這將作爲每週的臨時工作。 –

回答

1

你存儲只是你產品$row第一線。然後你正在做一些難以理解的比較,但所有這些比較只是比較你的第一行。

這裏就是我想要做的:

// Untested Code Below, Not Suited For Production Use 

// ... 
// open the DB connection, open the file, etc. 
// ... 

// iterate over the complete CSV file 
while (!feof($file_handle)) { 
    $line_of_text = fgetcsv($file_handle, 1024); 
    $product_id = clean_product_id($line_of_text[0]); 
    $price = $line_of_text[1]; 
    // for any entry in the CSV file check if there is more than one result 
    $sql="SELECT COUNT(*) FROM products WHERE product_id='$product_id'"; 
    $result = mysqli_query($con,$sql); 
    $row = mysqli_fetch_array($result); 
    if($row[0] == 1) { 
     // update the table price for the corresponding row (product), if there is just a single result for this $product_id 
     $sql="UPDATE products SET price = '$price' WHERE product_id='$product_id' LIMIT 1"; // in production code use mysqli_real_escape_string() on $price and $product_id! 
     $result = mysqli_query($con,$sql); 
    } else { 
     // if there are more results for this $product_id, add an error to your report.txt file 
    } 
} 
+0

它超時失敗,可能是因爲我的數據庫表包含超過500.000個產品。 沒有辦法只掃描一次數據庫表,然後將每個CSV行與這些值進行比較? –

+0

「product_id」字段中是否有索引?如果有的話,500,000個產品應該不成問題。超時何時發生?在調用MySQL時發生,或者由於超過max_execution_time時間而終止PHP腳本?如果後者是這種情況,那麼你的CSV文件會很大。將其拆分爲更小的塊或增加php.ini中的'max_execution_time'。 – z80crew

+0

那麼,我只是在該列上添加了一個索引。 CSV只有28 KB和1900行,它絕不會超過3000行。 對於其他某些測試,max_exec_time設置爲999。 加載20秒後,我收到500個內部服務器錯誤。 –

相關問題