MYSQL zur Löschung des Warenkorbes wird nicht durchgeführt

php_anfaenger

Grünschnabel
Hallo zusammen! Hoffentlich könnt Ihr mir helfen.
Gerade sitze ich an einem Lernheft und komme nicht weiter. Ich soll einen Warenkorb, der nicht bestellt wurde, nach einer gewissen Zeit in der Datenbank MYSQL löschen.
Hier ist meine Methode:
PHP:
 private function keineBestellung() {
  if (!isset($this->kunde) && !is_integer($this->kunde)) {# Gültige Kundennummer?
#print_r($this->kunde);
  throw new Exception('Keine Kundennummer'); # Fehler ausgeben
  } else {
  try {

  $sql = "SELECT w_timestamp AS w_timestamp
  FROM ws_warenkorb";
  $result = $this->dbh->query($sql);
  $datum = $result->fetch(PDO::FETCH_ASSOC);

  #echo $datum['w_timestamp'];
  $datum = strtotime($datum['w_timestamp']);
  #echo $datum;
  return $datum;
  } catch (PDOException $e) {
  echo $e->getMessage();
  }
  }

  if (!isset($this->datum))
  throw new Exception('Kein Datum');# Fehler ausgeben
  else {
  try {
  $sql = "DELETE FROM ws_warenkorb
  WHERE (UNIX_TIMESTAMP(w_timestamp) + 1) = :datum) < UNIX_TIMESTAMP(NOW())";
  /*$sql = "DELETE FROM ws_warenkorb
  WHERE DATEDIFF(UNIX_TIMESTAMP(w_timestamp) = :datum, UNIX_TIMESTAMP(NOW())) > 1";*/

  $result = $this->dbh->prepare($sql);
  $result->bindParam(':datum', $datum, PDO::PARAM_INT);
  $result->execute();
  echo $dbh->affected_rows;

  } catch (PDOException $e) {
  echo $e->getMessage();
  }
  }
  }

Diese Methode wird aufgerufen, wenn der Benutzer sich eingeloggt hat und die Auflistung der angebotenen Artikel sieht. Hier der Code:

PHP:
public function anzeigen() {

  $this->keineBestellung();

  print " <table align=\"center\" cellpadding=\"5\">\n";
#print "  <tr align=\"center\">\n";

  if (!isset($this->kunde) && !is_integer($this->kunde)) {# Gültige Kundennummer?
#print_r($this->kunde);
  throw new Exception('Keine Kundennummer'); # Fehler ausgeben
  } else {
  try {
  $sql = "SELECT a_artikelnr,
  DATE_FORMAT(a_datum,'%e.%m.%y') AS a_datum,
  a_name AS a_veranstaltung,
  a_menge AS a_kartenvorrat,
  a_preis
  FROM ws_artikel
  WHERE a_menge > 0";

  $result = $this->dbh->query($sql);
  $tmp = $result->fetchAll(PDO::FETCH_ASSOC);

  $tempo = array_keys($tmp[0]);

  print "  <tr align=\"center\">\n";
  foreach ($tempo as $key => $value) {

  $name = substr($value, 2);
  print "<th>" . ucwords($name) . "</th>";
  }
  print "  </tr>\n";

  foreach ($tmp as $key => $values) {
  print "<tr style=\"text-align: center;\">\n";

  foreach ($values as $subKey => $subVal) {
  if ($subKey == "preis") {
  print "<td align=\"center\">" . $subVal . " Euro</td>"; #&euro;
  } else {
  print"<td align=\"center\">" . $subVal . "</td>";
  }
  }
  print "<td align=\"center\"><a href=\"" . $_SERVER['PHP_SELF'] . "?id=" . $key . "\">In den Warenkorb</a></td>\n";
  }
  } catch (PDOException $e) {
  echo $e->getMessage();
  }
  }

  print " </tr>\n";
  print " </table>\n";
  }

  private function keineBestellung() {
  if (!isset($this->kunde) && !is_integer($this->kunde)) {# Gültige Kundennummer?
#print_r($this->kunde);
  throw new Exception('Keine Kundennummer'); # Fehler ausgeben
  } else {
  try {

  $sql = "SELECT w_timestamp AS w_timestamp
  FROM ws_warenkorb";
  $result = $this->dbh->query($sql);
  $datum = $result->fetch(PDO::FETCH_ASSOC);

  #echo $datum['w_timestamp'];
  $datum = strtotime($datum['w_timestamp']);
  #echo $datum;
  return $datum;
  } catch (PDOException $e) {
  echo $e->getMessage();
  }
  }

  if (!isset($this->datum))
  throw new Exception('Kein Datum');# Fehler ausgeben
  else {
  try {
  $sql = "DELETE FROM ws_warenkorb
  WHERE (UNIX_TIMESTAMP(w_timestamp) + 1) = :datum) < UNIX_TIMESTAMP(NOW())";
  /*$sql = "DELETE FROM ws_warenkorb
  WHERE DATEDIFF(UNIX_TIMESTAMP(w_timestamp) = :datum, UNIX_TIMESTAMP(NOW())) > 1";*/

  $result = $this->dbh->prepare($sql);
  $result->bindParam(':datum', $datum, PDO::PARAM_INT);
  $result->execute();
  echo $dbh->affected_rows;

  } catch (PDOException $e) {
  echo $e->getMessage();
  }
  }
  }

Leider funktioniert es nicht und die affected_rows zeigt kein Ergebnis.
Hat jemand eine Idee?
Über eine Antwort würde ich mich sehr freuen,
PHP_Anfaenger
 
Hi PHP_Anfaenger,

in der Funktion "keineBestellung" wird ein Query über alle Zeilen der Datenbank durchgeführt:
$sql="SELECT w_timestamp AS w_timestamp
FROM ws_warenkorb";
$result=$this->dbh->query($sql);
$datum=$result->fetch(PDO::FETCH_ASSOC);

#echo $datum['w_timestamp'];
$datum=strtotime($datum['w_timestamp']);
#echo $datum;
return $datum;

- Die Abfrage sollte sich rein logisch nur auf den eingeloggten User beziehen, oder? => WHERE a.userID = :userID
- Du Selektierst alle Zeilen der Tabelle, nimmst aber nur die erste Zeile als "Träger" des Ergebnisses. Ich verstehe den Sinn dahinter nicht so ganz.
Was genau soll der o.g. Query erfüllen?
- Nach dem Query wird ein "return $datum;" durchgeführt - dadurch ist der restliche Code quasi komplett hinfällig, da der Interpreter dort niemals ankommen wird.
- In der Funktion "anzeigen" feuerst Du die Funktion keineBestellung, welche jedoch wie gerade genannt einen wert zurückgeliefert bekommt (return $datum). Diesen Wert nimmst Du hier nicht entgegen => $datum = $this->keineBestellung();

Ich sehe noch etliche Punkte.

Kannst Du bitte etwas genauer auf den Ablauf der Funktion eingehen, dann können wir Dir sicher helfen :)

Viele Grüße
 
Folgende Fragen solltest Du Dir stellen:
- Was möchte ich erreichen?
-> Ich möchte, dass sich der Warenkorb mit nicht bestellten Artikeln von einem definierten Benutzer löscht, welche einen definierten Zeitraum überschreiten!

- Wie komme ich dort hin?
-> Ich prüfe nach dem Login, ob sich Artikel im Warenkorb befinden, die noch nicht bestellt wurden und kleiner als ein vorher definiertes Datum sind.

Entsprechend sollte sich daraus folgender Programmablauf ergeben:

0. Ich berechne zunächst das kleinstmögliche Datum von Artikeln die im Warenkorb bleiben sollen.
PHP:
$startDate = time();
$startDateDelete = date('Y-m-d H:i:s', strtotime('-30 day', $startDate));

1. Anschließend lösche ich alle Artikel aus dem Warenkorb die zu meiner UserID gehören und kleiner als das errechnete Datum sind:
SQL:
DELETE FROM Warenkorb WHERE u.UserID = :userID AND u.Datum <= :Datum

Viele Grüße
 
Hallo Splater!
Vielen Dank! Das hilft mir sehr. Das macht es sehr viel klarer! Ich probiere das gleich mal aus.

Schöne Grüße,
PHP_Anfaenger
 
Zurück