SELECT COUNT(*)

AllesVergessen

Mitglied
Hallo zusammen,

ich würde gerne eine eigentlich einfache Abfrage einer MySQL-Datenbank machen in der aus der Tabelle s_order_details die kompletten Datensätze ausgelesen werden bei denen ordernumber = $bestellnummer ist. Als erstes brauche ich die Anzahl der Datensätze bei denen diese Bedingung zutrifft, dann brauche ich die Treffer in einem Array, um sie in weiteren Abfragen auseinanderzunehmen und mit den Werten andere Tabellen abzufragen. So, früher habe ich sowas mit mysql_fetch_object und/oder mysql_num_rows gelöst, habe aber nun gelesen, dass diese Befehle ab php7 nicht mehr zur Verfügung stehen. MySQLi kann ich aber bei mir nicht benutzen. Wie kann ich dieses Problem nun lösen?

Mit besten Grüßen
Olli
 
Ja, PDO steht zur Verfügung. MYSQLi steht glaube ich in Shopware nicht zur Verfügung. Aber ehrlich gesagt bin ich mir nicht 100% sicher. :(
Es steht die DBAL-Connection zur Verfügung.
 
Die offizielle PHP-Dokumentation, Abschnitt PDO hat gute Erklärungen und Beispiele. Ich könnte es nicht besser.
Die SQLs, kannst du so weiter behalten.
 
Aha, also das hier funktioniert schonmal, ein erster Erfolg. :)


PHP:
// WIE VIELE VERSCHIEDENE ARTIKEL WURDEN IN DER BESTELLUNG AUFGEGEBEN?
$db_artikelanzahl_holer = "SELECT COUNT(*) AS count FROM s_order_details WHERE ordernumber = '$bestellnummer'";
$zwischenspeicher = $connection->query($db_artikelanzahl_holer)->fetch();
$db_artikelanzahl = $zwischenspeicher['count'];

Aber jetzt brauche ich die noch zur Weiterverarbeitung... Im Moment - bei den Testspielen - ermitteln wir damit 2 Artikel, die in einer Bestellung enthalten sind. Die Daten dieser zwei Artikel umfassen in Shopware, verteilt auf ca. 20 Tabellen der Datenbank, fast 900 Zeilen code. Einige wenige dieser Daten muss ich nun zu jedem Artikel für mich herausziehen und daraus ein neues Artikel-Array anlegen, das ich dann als json-Objekt weitergeben muss. Falls jemand inspirierende Ideen hat. :) Ich entwickel natürlich immer selber, aber manchmal sind so Anstösse ja auch hilfreich.
 
Moin zusammen,

nach ein paar Tagen Urlaub mache ich nun weiter und verstehe nicht, warum die einfachsten Abfragen nicht hinhauen...


PHP:
$db_artikelanzahl_holer = "SELECT COUNT(*) AS count FROM s_order_details WHERE ordernumber = '$bestellnummer'";
$zwischenspeicher = $connection->query($db_artikelanzahl_holer)->fetch();
$db_artikelanzahl = $zwischenspeicher['count'];
   
$i=0;
while ($artikelfacts = mysql_fetch_row($zwischenspeicher))
{
       
       $wieheissendie = $wieheissendie.$i.$artikelfacts['0']['name'];
       $i++;
 }

Die $db_artikelanzahl wird korrekt ausgegeben, $wieheissendie bleibt immer leer. Warum? mysql_fetch_object in der while-Schleife liefert ebenso nichts.
 
a) Du mischt grade PDO mit der alten Variante, die nicht mehr funktioniert (zumindest mit aktueller Software).
b) Was genau willst du aus der Abfrage noch rausfetchen?

Jedenfalls, einige Verbesserungsvorschläge zuerst:

Fehlerkontrolle:
PHP:
$abfrage = "SELECT COUNT(*) AS count FROM s_order_details WHERE ordernumber = '$bestellnummer'";
$ergebnis = $connection->query($abfrage);

if(!$ergebnis)
{
    //Fehler bei der Abfrage
}
else
{
    //count(*) ergibt genau eine Zeile, daher keine Schleife
    $zeile = $ergebnis->fetch();
    $db_artikelanzahl = $zeile['count'];
}

Prepared Statements (die derzeitige Variante ist ein Sicherheitsproblem):
PHP:
$abfrage = 'SELECT COUNT(*) AS count FROM s_order_details WHERE ordernumber = ?';
$prep = $connection->prepare($abfrage);
if(!$prep)
{
    //Fehler beim prepare
}
else
{
    $ergebnis = $prep->execute(array($bestellnummer));

    if(!$ergebnis)
    {
        //Fehler bei der Abfrage
    }
    else
    {
        //count(*) ergibt genau eine Zeile, daher keine Schleife
        $zeile = $ergebnis->fetch();
        $db_artikelanzahl = $zeile['count'];
    }
}

So, und wenn du jetzt die Spalte name aus der Tabelle s_order_details ausgeben willst, hilft die Abfrage nach count(*) nicht. Da wird nur die Anzahl abgefragt. Daher noch eine Abfrage:
PHP:
$abfrage = 'SELECT name AS count FROM s_order_details WHERE ordernumber = ?';
$prep = $connection->prepare($abfrage);
if(!$prep)
{
    //Fehler beim prepare
}
else
{
    $ergebnis = $prep->execute(array($bestellnummer));

    if(!$ergebnis)
    {
        //Fehler bei der Abfrage
    }
    else
    {
        while($zeile = $ergebnis->fetch())
            echo $zeile['name'];
    }
}
 
Zuletzt bearbeitet:
Wow, vielen Dank für Deine ausführliche Antwort! So verstehe ich auch das neue System endlich mal ein wenig besser.
Das mit name war einfach nur ein Versuch, etwas auszulesen. Im Prinzip brauche ich Zugriff auf alle Felder jedes Datensatzes. Das müsste doch dann so hinhauen oder?:

PHP:
$abfrage = 'SELECT * FROM s_order_details WHERE ordernumber = ?';
$prep = $connection->prepare($abfrage);
if(!$prep)
{
    //Fehler beim prepare
}
else
{
    $ergebnis = $prep->execute(array($bestellnummer));
    if(!$ergebnis)
    {
        //Fehler bei der Abfrage
    }
    else
    {
        while($zeile = $ergebnis->fetch())
            echo $zeile['name'];
    }
}
 
Zurück