2016-12-15 46 views
1

爲了給您一些背景知識,流程如下:連接到第三方API,將數據存儲爲json,轉換爲php並使用下面的代碼中的數據。使用PDO和循環插入多個值

我發現this work最初,但無法弄清楚如何修改它以滿足我的需求。也許你們中的一個可以更好地理解它?

我在這裏做3件事。首先檢查一個房子的ID + last_update戳記以確定哪些房屋需要在我的數據庫中更新。如果它們存在但細節已更改,請刪除當前數據並將其存儲在準備插入的變量中。如果數據不存在,請插入它。

需要注意的是:腳本需要很長的時間來執行,我必須設置set_time_limit(0);我意識到這是不好的做法,但我需要強制腳本完成。

我已經把我的代碼下了不少因爲我有超過40個不同的手動輸入準備好的發言之一:

  • 更新記錄
  • 刪除記錄
  • 插入記錄

我已經使用屏幕截圖確定了預期的輸出,所以請忽略此處的任何開啓的大括號,因爲主要問題是將代碼改進爲更加動態的方法,並且mak當然更快。

<?php 


$update = ''; 
$add = ''; 

if (!empty($houses)) { 
foreach($houses as $travel_Prop) { 

    $Prop = $travel_Prop['data'][0]; // Need to check this! 

    if ($Prop['id'] > '0') { // Ignore empty arrays 

     $sql= "SELECT * FROM travel_a_property WHERE travel_prop_id = :travel_prop_id"; 
     $stmt = $extDb->prepare("$sql"); 
     $stmt->bindParam(':travel_prop_id', $Prop['id'], PDO::PARAM_INT); 
     $stmt->execute(); 
     $Result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
     if (!empty($Result)) { 
      $travel_last_update = $Prop['last_update']; 
      $local_last_update = $Result[0]['last_update']; 

      if ($travel_last_update > $local_last_update) { 
       $update[] = $Prop; 
       echo 'Property ID: ' .$Prop['id'] .' Property modified: Updating Records.<br>'; 
      } else { 
       echo 'Property ID: ' .$Prop['id'] .' Property details: Up to Date.<br>'; 
      } 

     } else { 
      $add[] = $Prop; 
      echo 'Property ID: ' .$Prop['id'] .' Property Created: Adding to Records.'; 
     } 
    } 
} 

注:截圖後輸出的代碼將進行

enter image description here

# UPDATE 
if (!empty($update)) { 
//print_r($update); 
foreach ($update as $PropUpdate) { 

    // Get all_prop_id 
    $sql= "SELECT * FROM travel_a_property WHERE travel_prop_id = :travel_prop_id"; 
    $stmt = $extDb->prepare("$sql"); 
    $stmt->bindParam(':travel_prop_id', $PropUpdate['id'], PDO::PARAM_INT); 
    $stmt->execute(); 
    //$Result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    $obj = $stmt->fetchObject(); 
    //echo $obj->filmName; 

    $all_prop_id = $obj->all_prop_id; 
    echo $all_prop_id; 


    // Update master db table a_property 
    $sql = "UPDATE travel_a_property SET last_update = :last_update 
    HERE all_prop_id = :all_prop_id"; 
    $stmt = $extDb->prepare($sql); 
    $stmt->bindParam(':last_update', $PropUpdate['last_update'], PDO::PARAM_STR); 
    $stmt->bindParam(':all_prop_id', $all_prop_id, PDO::PARAM_INT); 
    $stmt->execute(); 

    echo '<br>Prop Updated - all_prop_id : ' .$all_prop_id .'<br>'; 


    # DELETe & INSERT 

    $sql = "DELETE FROM ot_b_address WHERE glob_prop_id = :glob_prop_id"; 
    $stmt = $extDb->prepare($sql); 
    $stmt->bindParam(':glob_prop_id', $glob_prop_id, PDO::PARAM_INT); 
    $stmt->execute(); 

    $sql = "INSERT INTO ot_b_address(glob_prop_id, address1, address2, city, state, zip_code, 
    country, latitude, longitude) VALUES (:glob_prop_id, :address1, :address2, :city, :state, 
    :zip_code, :country, :latitude, :longitude)"; 

    $stmt = $extDb->prepare($sql); 

    $stmt->bindParam(':glob_prop_id', $glob_prop_id, PDO::PARAM_INT); 
    $stmt->bindParam(':address1', $PropUpdate['address']['address1'], PDO::PARAM_STR); 
    $stmt->bindParam(':address2', $PropUpdate['address']['address2'], PDO::PARAM_STR); 
    $stmt->bindParam(':city', $PropUpdate['address']['city'], PDO::PARAM_STR); 
    $stmt->bindParam(':state', $PropUpdate['address']['state'], PDO::PARAM_STR); 
    $stmt->bindParam(':zip_code', $PropUpdate['address']['zip_code'], PDO::PARAM_STR); 
    $stmt->bindParam(':country', $PropUpdate['address']['country'], PDO::PARAM_STR); 
    $stmt->bindParam(':city', $PropUpdate['address']['city'], PDO::PARAM_STR); 
    // use PARAM_STR although a number 
    $stmt->bindParam(':latitude', $PropUpdate['address']['latitude'], PDO::PARAM_STR); 
    $stmt->bindParam(':longitude', $PropUpdate['address']['longitude'], PDO::PARAM_STR); 

    $stmt->execute(); 

    echo 'Address Updated <br>'; 



    $sql = "DELETE FROM travel_d_urls WHERE all_prop_id = :all_prop_id"; 
    $stmt = $extDb->prepare($sql); 
    $stmt->bindParam(':all_prop_id', $all_prop_id, PDO::PARAM_INT); 
    $stmt->execute(); 

    if (!empty($PropUpdate['urls'])) { 
     foreach($PropUpdate['urls'] as $row => $Url) { 
      $sql = "INSERT INTO travel_d_urls(all_prop_id, type, url) 
      VALUES (:all_prop_id, :type, :url)"; 
      $stmt = $extDb->prepare($sql); 

      $stmt->bindParam(':all_prop_id', $all_prop_id, PDO::PARAM_INT); 
      $stmt->bindParam(':type', $Url['type'], PDO::PARAM_STR); 
      $stmt->bindParam(':url', $Url['url'], PDO::PARAM_STR); 
      $stmt->execute(); 

      echo 'URL '.$row .' Updated <br>'; 
     } 
    } 
} 
} else { 
echo 'no rates to Update <br>'; 
} 

輸出是非常簡單,只是同樣的事情(無論是更新) 網址添加的 網址添加的 etc

以下代碼是最後一條if語句h告訴腳本添加剩餘的屬性,如果它們不存在的話。

} //結束的foreach $更新

# INSERT ONLY 
if (!empty($add)) { 
    foreach ($add as $PropAdd) { 

     $sql = "INSERT INTO travel_a_property(travel_prop_id, last_update) 
     VALUES (:travel_prop_id, :last_update)"; 

     $stmt = $extDb->prepare($sql); 

     $stmt->bindParam(':travel_prop_id', $PropAdd['id'], PDO::PARAM_INT); 
     $stmt->bindParam(':last_update', $PropAdd['last_update'], PDO::PARAM_STR); 

     $stmt->execute(); 

     $all_prop_id = $extDb->lastInsertId(); // Use this ID in all the following record inserts 

     echo '<br>Prop Added - all_prop_id : ' .$all_prop_id .'<br>'; 

     ########################## 

     $sql = "INSERT INTO travel_b_address(all_prop_id, address1, address2, city, state, zip_code, country, 
     latitude, longitude) VALUES (:all_prop_id, :address1, :address2, :city, :state, :zip_code, :country, 
     :latitude, :longitude)"; 

     $stmt = $extDb->prepare($sql); 

     $stmt->bindParam(':all_prop_id', $all_prop_id, PDO::PARAM_INT); 
     $stmt->bindParam(':address1', $PropAdd['address']['address1'], PDO::PARAM_STR); 
     $stmt->bindParam(':address2', $PropAdd['address']['address2'], PDO::PARAM_STR); 
     $stmt->bindParam(':city', $PropAdd['address']['city'], PDO::PARAM_STR); 
     $stmt->bindParam(':state', $PropAdd['address']['state'], PDO::PARAM_STR); 
     $stmt->bindParam(':zip_code', $PropAdd['address']['zip_code'], PDO::PARAM_STR); 
     $stmt->bindParam(':country', $PropAdd['address']['country'], PDO::PARAM_STR); 
     // use PARAM_STR although a number 
     $stmt->bindParam(':latitude', $PropAdd['address']['latitude'], PDO::PARAM_STR); 
     $stmt->bindParam(':longitude', $PropAdd['address']['longitude'], PDO::PARAM_STR); 

     $stmt->execute(); 

     echo 'Address Added <br>'; 
    } // end foreach 
} // end !empty 
$extDb = null; 
} 
?> 

所以要重申的是,這裏的問題不在於確定哪些是錯我的代碼的速度比其他的,它實際上是工作的罰款。我想知道是否有人能夠確定實現這種動態的最佳方式,以避免必須繁瑣地編寫代碼40次?

如果有什麼不清楚的地方,請告訴我。

乾杯, 板凳。

+0

嘗試使用多插入代替:http://thisinterestsme.com/pdo-prepared-multi-inserts/ –

回答

1

您正在foreach循環內創建預處理語句。嘗試在其外部創建準備好的語句。準備好的陳述的想法是,您準備一次陳述並用不同的參數值多次執行陳述。這樣數據庫只需要編譯和優化一次SQL查詢,這比迭代的效率更高。

if (!empty($houses)) { 
    $stmt = $extDb->prepare("SELECT * FROM travel_a_property WHERE travel_prop_id = :travel_prop_id"); 
    //$stmt2 = ... 
    foreach ($houses as $travel_Prop) { 

     $prop = $travel_Prop['data'][0]; // Need to check this! 

     if ($prop['id'] > '0') { // Ignore empty arrays 
      if ($stmt->execute(array(':travel_prop_id' => $prop['id']))) { 
       $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
       //Do something with $result 
      } 
     } 
     //$stmt2->execute(...); 
    } 
} 
+0

你能提供怎樣看,請的例子嗎? – benchFairy

+1

通過舉例改進我的答案。 –

+0

謝謝你在那裏的例子理查德,它像一個漂亮的工作。非常感謝幫助 – benchFairy