Auge: Aufwand eingrenzen

Beitrag lesen

Hallo

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 die Spalte „id“ aller 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 einer 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.

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