Aufwand eingrenzen
bearbeitet vonHallo
> ~~~php
> function test123($mysqli) {
> $stmt = $mysqli->prepare("SELECT id FROM warenkorb
> WHERE DATE( FROM_UNIXTIME( datum ) ) > NOW() - INTERVAL 2 DAY");
> $stmt->execute();
> $stmt->bind_result($id);
> $stmt->store_result();
>
> if($stmt->num_rows() > 0) {
>
> while ($stmt->fetch()){
> $test123[] = array(
> 'id' => $id
> );
> }
> return $test123;
> }
> }
>
> $EinfachTest = test123($mysqli);
>
> if($EinfachTest > 0) {
>
> foreach($EinfachTest as $array){
>
> $stmt = $mysqli->prepare("DELETE FROM warenkorb WHERE id=? ");
> $stmt->bind_param("i", $array['id']);
> $stmt->execute();
> $stmt->close();
> }
> }
> else { echo "Leer"; }
> ~~~
Mal 'ne grundsätzliche Manöverkritik.
Du holst dir in der Funktion `test123` alle Datensätze, in denen der Wert von `datum` mehr als zwei Tage in der Vergangenheit liegt. Danach nimmst du das Array der in der Funktion ermittelten Datensätze und führst in der Schleife über das Array *jeweils eine* Löschanfrage aus.
Das ganze Procedere funktioniert auch in einem einzigen Query. In dem ermittelst du mit einem Subquery die zu löschenden Datensätze und übergibst diese Liste in die WHERE-Klausel des Hauptquerys, der diese Datensätze löschen soll.
~~~sql
DELETE FROM warenkorb
WHERE id IN(
(SELECT id FROM warenkorb WHERE DATE(FROM_UNIXTIME(datum)) > NOW() - INTERVAL 2 DAY)
);
~~~
Da in der Abfrage keine variablen Werte vorhanden sind, ist nicht mal ein Parameter zu binden. Weiterhin kann der PHP-Code hier stark vereinfacht werden, da entweder die Funktion oder, bei Behalt der Funktion, die Ergebnisverarbeitung wegfällt.
Tschö, Auge
--
Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
Toller Dampf voraus von Terry Pratchett