2016-12-22 4 views
3

Ich habe vor kurzem begonnen, MySQLi vorbereitete Anweisungen zu verwenden. Ich mochte nicht, wie viele Codezeilen nur für eine einfache SELECT-Anweisung benötigt wurden. Also habe ich eine Wrapper-Funktion erstellt, siehe den Code unter den Fragen unten. Hinweis: get_results() oder PDO ist keine Option für mich.MySQLi vorbereitete Anweisungen - Wrapper-Funktion für SELECT

Meine Fragen sind:

  1. Wird es merklich die Leistung verlangsamen?

  2. Wird es aufgrund der Verwendung des Ergebnisarrays speicherintensiver sein?

  3. Wird die $ stmt-> close() vor der Rückkehr irgendwelche Probleme verursachen? Zum Beispiel könnten die Ergebnis-Array-Daten auch aus dem Speicher freigegeben werden?
  4. Muss ich irgendetwas anderes schließen oder freigeben (außer die db-Verbindung zu schließen)?
  5. Sehen Sie weitere Probleme mit der Funktion oder könnte sie verbessert werden?

Code:

class DatabaseHelper{ 

static function select($con, $query, $formats, $params){ 
    $a_params = array(); 

    $param_type = ''; 
    $n = count($formats); 
    for($i = 0; $i < $n; $i++) { 
     $param_type .= $formats[$i]; 
    } 

    $a_params[] = & $param_type; 

    for($i = 0; $i < $n; $i++) { 
     $a_params[] = & $params[$i]; 
    } 

    $stmt = $con->prepare($query); 
    call_user_func_array(array($stmt, 'bind_param'), $a_params); 
    $stmt->execute(); 

    $meta = $stmt->result_metadata(); 
    while ($field = $meta->fetch_field()) { 
     $columns[] = &$row[$field->name]; 
    } 

    call_user_func_array(array($stmt, 'bind_result'), $columns); 

    while ($stmt->fetch()) { 
     foreach($row as $key => $val) { 
      $x[$key] = $val; 
     } 
     $results[] = $x; 
    } 
    $stmt->close(); 
    return $results; 
} 

} 

wie folgt verwendet zum Beispiel:

$users = DatabaseHelper::select($conn, "SELECT name,username FROM users WHERE id > ?", "i", array(30)); 
foreach ($users as $row){ 
    echo $row['username'] . " ". $row['name'] . "<br />"; 
} 
+0

Was ist Ihre PHP-Version? –

+0

PHP Version 5.6.27 – Danie

Antwort

0

Wird es die Leistung merklich verlangsamen?

Nr

Wird es wegen der Verwendung des Ergebnisses Array mehr speicherintensiv sein?

Nein, solange Sie vernünftige Datenmengen auswählen. In einer modernen Anwendung müssen Sie zuerst alle Daten auswählen, da die Geschäftslogik von der Anzeigelogik getrennt sein soll.

Wird die $ stmt-> close() vor der Rückkehr irgendwelche Probleme verursachen? Zum Beispiel könnten die Ergebnis-Array-Daten auch aus dem Speicher freigegeben werden?

Warum nicht versuchen zu sehen?

Muss ich etwas anderes schließen oder freigeben (außer die db-Verbindung zu schließen)?

Sie müssen eine Aussage auch nicht schließen.

Sehen Sie andere Probleme mit der Funktion oder könnte sie verbessert werden?

  • In erster Linie.Da es sich um eine Klasse handelt, die Sie schreiben, und nicht um eine Funktion, ist es absolut sinnlos, die Verbindung über einen Parameter zu übergeben. Machen Sie es zu einer statischen Eigenschaft.
  • Auch würde ich vorschlagen, Typen den letzten Parameter mit Standardwert zu machen. In den meisten Fällen müssen Sie nicht mit Typen picken - eine Standard-Zeichenfolge reicht aus.
  • Außerdem, wie Ihre PHP-Version ist 5.6 können Sie den Splat-Operator verwenden, nur um die Menge an Code zu reduzieren. Sie können überprüfen, this answer of mine für die Details
  • Ich würde auch vorschlagen, Ihre Funktion in mehrere Methoden zu teilen - eine zur Ausführung der Abfrage und andere, um die Ergebnisse zu erhalten. Es wird Ihnen
  • stellen Sie sicher, den gleichen Code für alle Arten von Anfragen wieder verwenden Sie watching for mysqli errors as explained here

So sind, im Idealfall würden Sie Ihre Abfrage auf diese Weise rufen

$users = DatabaseHelper::getAll("SELECT name,username FROM users WHERE id > ?", [30]); 
foreach ($users as $row){ 
    echo $row['username'] . " ". $row['name'] . "<br />"; 
} 

wo getAll() -Methode verwendet intern die query() -Methode, um eine Abfrage durchzuführen und dann alle Ergebnisse abzurufen. Ähnlich möchten Sie vielleicht getRow() und getOne() Methoden schreiben

+0

Vielen Dank! :) – Danie

Verwandte Themen