2016-07-20 1 views
1

Bei der Überprüfung meiner Skripte, erkannte ich, dass ich zwei verschiedene Möglichkeiten zum Abrufen/Aktualisieren von Daten verwendet: mehrere Anrufe innerhalb einer try/catch oder mehrere try/catch mit jeweils einem Anruf.PHP/PDO/Mysql mehrere DB Anrufe Best Practice

Die Ergebnisse sehen gut aus mit meinen Testdaten, wenn ich eine der beiden Methoden verwende, aber ich möchte mich auf die beste Praxis in einer Produktionsumgebung festlegen, da Testdaten kein wirkliches Leben sind. Ich frage mich zum Beispiel, ob es eine Chance gibt, die richtige Ausnahme bei mehreren Anrufen innerhalb einer try/catch nicht zu bekommen.

Auf einigen Skripten ich wie 30 db haben Anrufe mit 30 open/close dbtry/catch verwenden, auf andere, die ich habe, wie 30 db Anrufe mit 6 open/close dbtry/catch verwenden.

Danke.

Beispiel Methode 1

try { 
    $connexion = new PDO("mysql:host=$serveur;dbname=$db;charset=$charset", $login, $pwd); 
    $connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    select table1/execute/process 
    join table1 & table2/execute/process 
    update table3/execute/process 
    ... 
    $connexion = null; // close 

    } catch (PDOException $e) { 
     echo "Connexion failed:".$e -> getMessage(); 
    } 

Beispiel Methode 2

try { 
    $connexion = new PDO("mysql:host=$serveur;dbname=$db;charset=$charset", $login, $pwd); 
    $connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    select table1/execute/process 

    $connexion = null; // close 

    } catch (PDOException $e) { 
     echo "Connexion failed:".$e -> getMessage(); 
    } 

try { 
    $connexion = new PDO("mysql:host=$serveur;dbname=$db;charset=$charset", $login, $pwd); 
    $connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    join table1 & table2/execute/process 

    $connexion = null; // close 

    } catch (PDOException $e) { 
     echo "Connexion failed:".$e -> getMessage(); 
    } 

try { 
    $connexion = new PDO("mysql:host=$serveur;dbname=$db;charset=$charset", $login, $pwd); 
    $connexion -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    update table3/execute/process 

    $connexion = null; // close 

    } catch (PDOException $e) { 
     echo "Connexion failed:".$e -> getMessage(); 
    } 

aktualisieren

Ich wusste, dass ich etwas falsch mache (ich PHP auf meinem eigenen Lernen). Auf der anderen Seite kann ich jetzt den Wert von Lösungen schätzen, die von Shudhansh Shekhar und e4c5 gemacht wurden.

Also baute ich eine DBaccess-Klasse und ich kann alle Vorteile sehen. Einer enthält am Anfang des Skripts eine neue Instanz und Sie sind fast fertig. Ich habe an einem Skript getestet und es funktioniert wie ein Zauber.

Können Sie bitte meinen Code validieren, bevor ich alle meine Skripte neu überarbeite? Ich bin mir nicht sicher, ob $this->connexion = null; an der richtigen Stelle ist, um db zu schließen.

Nochmals vielen Dank für Ihre Hilfe.

DBaccess.class.php

<?php 
class DBaccess{ 
    private $serveur = "localhost"; 
    private $db_name = "qh61test"; 
    private $charset = "utf8"; 
    private $login = "root"; 
    private $pwd = ""; 

    private $connexion; // dbh name 
    private $erreur; 
    private $requete;  // sql stmt 

    public function __construct(){ 
     $this->connexion = null; // <----------- NOT SURE ? 
     try{ 
      $this->connexion = new PDO("mysql:host=" . $this->serveur . ";dbname=" . $this->db_name. ";charset=". $this->charset, $this->login, $this->pwd); 
      $this->connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
     catch(PDOException $e){ 
      echo "Connexion foirée :".$e -> getMessage(); 
      // $this->erreur = $e->getMessage(); 
     } 
    } 

    public function sql($sql){ 
     $this->requete = $this->connexion->prepare($sql); 
    } 
    public function execute(){ 
     return $this->requete->execute(); 
    } 
    public function resultAll(){ 
     $this->execute(); 
     return $this->requete->fetchAll(PDO::FETCH_ASSOC); 
    } 
} 
?> 

script.php

 <?php 
     session_start(); 
     include 'DBaccess.class.php'; 
     $db = new DBaccess(); 
     ... 
     if (isset($_POST['periode'])) { 

      // sales within a period 
      if (!empty($_POST['datebeg']) && !empty($_POST['dateend'])) { 

       // datepicker dates 
       $datebeg = preg_replace("([^0-9/])", "", $_POST['datebeg']); 
       $dateend = preg_replace("([^0-9/])", "", $_POST['dateend']); 

      $search_row = "SELECT COUNT(cmdID) as nbcmd FROM Commande2 WHERE date_cmd BETWEEN '$datebeg' AND '$dateend'" 
      ); 

       $db->sql("$search_row"); 
       $db->execute(); 
       $resultat = $db->resultAll(); 

      foreach($resultat as $row) 
      { 
      if ($row['nbcmd'] == 0) {    
       $no_rows = "No sales for that period"; 
       $all = '<div> 
        <button class="btn btn-mini btn-primary bold" type="submit" name="all">All saless</button></div>'; 
        } 
      } 
     } 
     } 

    // retrieve all sales or sales within period 
    if (empty($errors) && empty($no_rows) || isset($_POST['all'])) { 

    $search_tot = array(
     "select" => "SELECT COUNT(cmdID) as nbcmd, SUM(`articles_cmd`) as total_articles, SUM(`total_cmd_nofp`) as somme, AVG(`total_cmd_nofp`) as moyenne, MIN(`total_cmd_nofp`) as mini, MAX(`total_cmd_nofp`) as maxi, MIN(`date_cmd`) as date_mini, MAX(`date_cmd`) as date_maxi FROM Commande2", 
     "where" => " WHERE ", 
     "periode" => "date_cmd BETWEEN '$datedeb' AND '$datefin'" 
    ); 

     if (empty($datebeg) && empty($dateend)) { 
      unset($search_tot["where"],$search_tot["periode"]); 
     } 
    } 
    $search_tot = implode(' ', $search_tot); 

     // fetch all matching rows 
     $db->sql("$search_tot"); 
     $db->execute(); 
     $resultat = $db->resultAll(); 

     foreach($resultat as $row) 
     { 
      $date1 = date('d-m-Y', strtotime($row['date_mini'])); 
      $date1 = str_replace('-', '/', $date1); 
      $date2 = date('d-m-Y', strtotime($row['date_maxi'])); 
      $date2 = str_replace('-', '/', $date2); 

      $orders= '<div style="text-align: center; font-size: 16px; font-weight: bold;">Sales for '.$date1.' to '.$date2.'/div>'; 
      ... 
     } 
... 
+0

Warum bevorzugen Sie nicht, eine DB-Handler-Klasse zu erstellen, so dass ....... Sie Code mit Ruhe mit nur einem Zeilencode $ this-> db. –

+0

Wenn diese Abfragen weiter wachsen, mache ich mir Sorgen, dass Sie Ihre Datenbank brennen –

+0

mysql Verbindungsprotokoll ist nicht besonders "schwer", aber es ist immer noch eine Verschwendung von Ressourcen zu verbinden/ausführen/trennen jedes Mal. es macht es auch unmöglich, Dinge wie Multi-Query-Transaktionen zu machen, serverseitige Variablen zu behalten, usw., weil all diese bei jeder Trennung zerstört/bereinigt werden. –

Antwort

0

Auf einigen Skripten ich wie 30 db haben Anrufe mit 30 zum Öffnen/Schließen db mit try/catch

Aber warum? Sie müssen nur einmal eine Verbindung öffnen. Diese Verbindung kann für eine Reihe von Abfragen verwendet werden und ist für acht ganze Stunden gut!

Löschen Sie einfach alle bis auf eines dieser Paare.

Besser noch verschieben Sie es in eine andere Datei, die Sie in jeder Seite enthalten, die eine Verbindung zur Datenbank herstellen müssen. Wenn sich Ihre Datenbankeinstellungen ändern, müssen Sie nur eine Datei ändern.

auf andere habe ich wie 30 db Anrufe mit 6 öffnen/schließen db mit versuchen/fangen.

Wenn Sie von 30 Abfragen sprechen, ist das ungewöhnlich für eine einzelne Webseite. Das ist etwas, was Sie vielleicht noch einmal überdenken möchten. Es könnte möglich sein, Ihren Code neu zu schreiben, um das gleiche Ziel in weniger Abfragen zu erreichen.

+0

Ich denke, Sie müssen ihm einen Beispielcode zeigen. –

+0

wie kann ich, da er nur Dinge wie 'Select Tabelle1/execute/Prozess Join Tabelle1 & Tabelle2/ausführen/Prozess Update Tabelle3/ausführen/process' @ShudhanshShekhar – e4c5

+0

Atleast zeigen ihm, wie man Verbindung wieder verwenden. Ich denke, das kann genug sein. –