# MySQL Datenbank mit PHP auslesen



## Anfänger2011 (2. Jan 2016)

Hallo und ein FROHES NEUES JAHR EUCH ALLEN,

Ich habe ein kleines Problem beim auslesen *bestimmter Einträger* in einer DB.

*Aufbau:*
-id
-date
-time
-content

*Mein Ziel* ist es alle Einträge von Samstag 11:54:59 bis Samstag 11:55:00 der vorherigen Woche zu erhalten.

*Mein Ansatz:*

```
$date = $row_main ['date'];
         $wd = date("w", strtotime($date));

          if($wd == "6"){
                $counter = 0;
                $lastSaturday = date("Y-m-d", strtotime($date . " -1 week"));
                $sql = "SELECT * FROM operations WHERE date<='$date' AND date>='$lastSaturday' ORDER BY id DESC";
                $query = mysql_query($sql) or die(mysql_error());

                while($row = mysql_fetch_assoc($query)){
                     $counter++;
                }
           }
```

Vielen DANK schon mal im voraus


----------



## redJava99 (2. Jan 2016)

Der Ansatz sieht gut aus, außer dass 'time' noch nicht berücksichtigt wird... wo liegt das Problem?


----------



## Dukel (2. Jan 2016)

Jetzt fehlt nur noch, dass du das Problem benennst. Kommen gar keine Ergebnisse? Kommen die falschen? Kommen zu wenig oder zu viele Einträge?
Funktioniert der SQL Befehl, wenn du den manuell mit den entsprechenden Werten ausführst?


----------



## Anfänger2011 (2. Jan 2016)

Ich weiß nicht genau wie ich das einbinden der Zeit umsetzen soll. Sprich die Umsetzung der oben genannten Bedingung in Quellcode.

Zeit und Datum müssen ja denke ich irgendwie verschaltet werden, da sonst nur Einträge zwischen 11:54:59 und 11:55:00 angezeigt werden würden.


----------



## redJava99 (2. Jan 2016)

Du musst dann explizit das Datum auf den Grenzfall prüfen.

```
SELECT * FROM operations
        WHERE
            (date<'$date'
            OR
            date='$date' AND time<'11:55:00')
        AND
            (date>'$lastSaturday'
            OR
            date='$lastSaturday' AND time>='11:55:00')
        ORDER BY id DESC
```
Klammern nicht vergessen (AND hat eine höhere Präzedenz als OR).
Statt getrennter Spalten für Date & Time könntest du auch eine DATETIME-Spalte verwenden, damit wäre die Abfrage einfacher.


----------



## Tobse (2. Jan 2016)

Ich würde zwei SQL-formatierte DateTimes für den Start- und Endbereich der Abfrage erstellen: $start und $end. Die kannst du dann mit BETWEEN einfach  benutzen:


```
$query = "SELECT ... FROM ... WHERE CONCAT(date, ' ', time) BETWEEN $start AND $end";
```

P.S.: noch ein paar PHP-seitige Tipps.

1. Benutze den PDO treiber und prepared statements, die mysqli_* funktionen sind deprecated. Beispiel:

```
$stmt = $pdo->prepareStatement("SELECT ... FROM ... WHERE CONCAT(date, ' ', time) BETWEEN :start AND :end");
$stmt->bindValue("start", $start);
$stmt->bindValue("end", $end);
$result = $stmt->execute();
```

2. *NIE* _SELECT *, _siehe: http://www.php-faq.de/q-sql-select.html

3. Es sieht so aus, als wolltest du nur die Anzahl an Zeilen ermitteln. Sich von der DB alle zeilen her senden zu lassen, nur im sie zu zählen, kostet viel Performance (je nach Menge der Daten). Benutze die SQL COUNT funktion.


----------

