2016-12-15 37 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