Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ich habe ein Array von Ganzzahlen, wie verwende ich jede in einer MySQL-Abfrage (in PHP)?

Wie bei fast allen "Wie mache ich SQL aus PHP heraus"-Fragen - Sie wirklich sollten vorbereitete Anweisungen verwenden. Es ist nicht so schwer:

$ids  = array(2, 4, 6, 8);

// prepare an SQL statement with a single parameter placeholder
$sql  = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
$stmt = $mysqli->prepare($sql);

// bind a different value to the placeholder with each execution
for ($i = 0; $i < count($ids); $i++)
{
    $stmt->bind_param("i", $ids[$i]);
    $stmt->execute();
    echo "Updated record ID: $id\n";
}

// done
$stmt->close();

Alternativ können Sie es auch so machen:

$ids    = array(2, 4, 6, 8);

// prepare an SQL statement with multiple parameter placeholders
$params = implode(",", array_fill(0, count($ids), "?"));
$sql    = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id IN ($params)";
$stmt   = $mysqli->prepare($sql);

// dynamic call of mysqli_stmt::bind_param                    hard-coded eqivalent
$types = str_repeat("i", count($ids));                        // "iiii"
$args = array_merge(array($types), $ids);                     // ["iiii", 2, 4, 6, 8]
call_user_func_array(array($stmt, 'bind_param'), ref($args)); // $stmt->bind_param("iiii", 2, 4, 6, 8)

// execute the query for all input values in one step
$stmt->execute();

// done
$stmt->close();
echo "Updated record IDs: " . implode("," $ids) ."\n";

// ----------------------------------------------------------------------------------
// helper function to turn an array of values into an array of value references
// necessary because mysqli_stmt::bind_param needs value refereces for no good reason
function ref($arr) {
    $refs = array();
    foreach ($arr as $key => $val) $refs[$key] = &$arr[$key];
    return $refs;
}

Fügen Sie bei Bedarf weitere Parameterplatzhalter für andere Felder hinzu.

Welche soll ich wählen?

  • Die erste Variante arbeitet mit einer variablen Anzahl von Datensätzen iterativ und trifft dabei mehrfach auf die Datenbank. Dies ist am nützlichsten für UPDATE- und INSERT-Operationen.

  • Die zweite Variante arbeitet ebenfalls mit einer variablen Anzahl von Datensätzen, trifft aber nur einmal auf die Datenbank. Dies ist viel effizienter als der iterative Ansatz, offensichtlich können Sie nur dasselbe mit allen betroffenen Datensätzen tun. Dies ist am nützlichsten für SELECT- und DELETE-Operationen oder wenn Sie mehrere Datensätze mit denselben Daten AKTUALISIEREN möchten.

Warum vorbereitete Erklärungen?

  • Vorbereitete Anweisungen sind viel sicherer, da sie SQL-Injection-Angriffe unmöglich machen. Dies ist der Hauptgrund, vorbereitete Anweisungen zu verwenden, auch wenn es mehr Arbeit bedeutet, sie zu schreiben. Eine sinnvolle Angewohnheit ist:Verwenden Sie immer vorbereitete Aussagen, auch wenn Sie der Meinung sind, dass es „nicht wirklich notwendig“ ist. Vernachlässigung wird kommen und Sie (oder Ihre Kunden) beißen.
  • Die mehrfache Wiederverwendung derselben vorbereiteten Anweisung mit unterschiedlichen Parameterwerten ist effizienter als das Senden mehrerer vollständiger SQL-Strings an die Datenbank, da die Datenbank die Anweisung nur einmal kompilieren muss und sie auch wiederverwenden kann.
  • li>
  • Nur Parameterwerte werden bei execute() an die Datenbank gesendet , sodass bei wiederholter Verwendung weniger Daten übertragen werden müssen.

Bei längeren Schleifen macht sich der Unterschied in der Ausführungszeit zwischen der Verwendung einer vorbereiteten Anweisung und dem Senden von einfachem SQL bemerkbar.