2016-12-15 1 views
1

Um Ihnen ein wenig Hintergrundinformationen zu geben, gehen Sie wie folgt vor: Verbinden Sie sich mit einer API von Drittanbietern, ziehen Sie Daten als JSON, konvertieren Sie sie in PHP und verwenden Sie die Daten im folgenden Code.Einfügen mehrerer Werte mit PDO und einer Schleife

Ich fand ursprünglich this work, aber nicht in der Lage, herauszufinden, wie ich es an meine Bedürfnisse anpassen kann. Vielleicht könnte einer von euch es besser verstehen?

Ich mache 3 Dinge hier. Überprüfen Sie zuerst die ID eines Hauses + last_update, um festzustellen, welche Häuser in meiner Datenbank aktualisiert werden müssen. Wenn sie vorhanden sind, aber Details geändert wurden, löschen Sie die aktuellen Daten und speichern Sie sie in einer Variablen, die eingefügt werden kann. Wenn die Daten nicht vorhanden sind, fügen Sie sie ein.

Etwas zu beachten: Das Skript dauert so lange, dass ich set_time_limit (0) setzen muss; was ich realisiere, ist eine schlechte Übung, aber ich musste das Skript zum Abschluss zwingen.

Ich habe meinen Code unten ziemlich viel gegeben geschnitten, dass ich über 40 verschiedene manuell eingegeben vorbereitete Anweisungen mussten entweder:

  • Aktualisieren von Datensätzen
  • Löschen von Datensätzen
  • Einfügen von Datensätzen

Ich habe die erwarteten Ausgaben mit Screenshots identifiziert, also ignoriere bitte alle offenen Klammern an dieser Stelle, da das Hauptproblem darin besteht, den Code zu einem dynamischeren Ansatz und Mak zu verfeinern es natürlich schneller.

<?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.'; 
     } 
    } 
} 

HINWEIS: Code wird nach Screenshot Ausgabe

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>'; 
} 
machen

Der Ausgang ist so ziemlich genau die gleiche Sache (was auch immer aktualisiert wird) URL hinzugefügt URL ADDED usw.

Der folgende Code ist die letzte if-Anweisung h weist das Skript an, die verbleibenden Eigenschaften hinzuzufügen, wenn sie nicht vorhanden sind.

} // end foreach $ update

# 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; 
} 
?> 

So zu wiederholen, hier die Frage nicht zu erkennen ist, was mit meinem Code als andere ist als die Geschwindigkeit falsch ist, es funktioniert tatsächlich gut. Ich würde gerne wissen, ob jemand den besten Weg finden könnte, diese Dynamik zu machen, um zu vermeiden, den Code 40 + mal mühsam schreiben zu müssen?

Wenn etwas unklar ist, lass es mich wissen.

Prost, Bank.

+0

Versuchen Sie, einen Multi-Einsatz verwendet stattdessen: http://thisinterestsme.com/pdo-prepared-multi-inserts/ –

Antwort

1

Sie erstellen die vorbereiteten Anweisungen innerhalb der foreach-Schleife. Versuchen Sie, die vorbereitete Anweisung außerhalb davon zu erstellen. Die Idee einer vorbereiteten Anweisung ist, dass Sie die Anweisung einmal vorbereiten und mehrmals mit verschiedenen Parameterwerten ausführen. Auf diese Weise muss die Datenbank die SQL-Abfrage nur einmal kompilieren und optimieren, was effizienter ist als dies für jede Iteration der Fall ist.

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

Können Sie ein Beispiel dafür, wie es aussehen sollte, bitte? – benchFairy

+1

Verbesserte meine Antwort, indem ich ein Beispiel gab. –

+0

Danke für das Beispiel dort Richard, es hat wie eine Schöne funktioniert. Die Hilfe wurde sehr geschätzt – benchFairy

Verwandte Themen