SELECT COUNT(*)

Mhm, die Lösung ergibt leider eine php-Fehlermeldung:

mod_fcgid: stderr: PHP Fatal error: Call to a member function fetch() on boolean

Betreffend dieser Zeile: $zeile = $ergebnis->fetch(); im ersten Block in dem es nur um die Zahl der Datensätze geht. Muss es vorher nicht einfach $ergebnis = $prep->execute($bestellnummer); heißen?
 
Ah, ich merk meinen Fehler grad.
Aber zuerst die Antwort: Nein, das array() kann nicht weg. Was man da übergibt ist praktisch ein Wert für jedes ? in der SQL-Anweisung, in einem Array. Auch wenns nur ein Wert ist muss es trotzdem ein Array sein.
(Warum überhaupt die Fragezeichen? SQL-Injection: So direkt in die SQL-Anweisung eingefügt kann ein absichtlich falscher Wert (zB. von Benutzereingaben oder so) die Art der SQL-Anweisung selber verändern)

Mein Fehler: execute gibt nichts zurück, womit man fetchen kann, sondern nur true/false obs geklappt hat, und fetch wird auf $prep selber aufgerufen.
Also, die count-Abfrage:
PHP:
$abfrage = 'SELECT COUNT(*) AS count FROM s_order_details WHERE ordernumber = ?';
$prep = $connection->prepare($abfrage);
if(!$prep)
{
    //Fehler beim prepare
}
else
{
    if(!$prep->execute(array($bestellnummer)))
    {
        //Fehler bei der Abfrage
    }
    else
    {
        //count(*) ergibt genau eine Zeile, daher keine Schleife
        $zeile = $prep->fetch();
        $db_artikelanzahl = $zeile['count'];
    }
}
und die andere Abfrage:
PHP:
$abfrage = 'SELECT name AS count FROM s_order_details WHERE ordernumber = ?';
$prep = $connection->prepare($abfrage);
if(!$prep)
{
    //Fehler beim prepare
}
else
{
    if(!$prep->execute(array($bestellnummer)))
    {
        //Fehler bei der Abfrage
    }
    else
    {
        while($zeile = $prep->fetch())
            echo $zeile['name'];
    }
}
Und "SELECT *" kann man zwar prinzipiell machen, die Spaltennamen ausschreiben ist auf Dauer aber weniger fehleranfällig (zB. wenn man im Nachhinein die DB-Struktur und/oder die Abfragen ändert und vergisst irgendeine Stelle im Code anzupassen...)

9000 :D:D:D
 
Zuletzt bearbeitet:
Klasse, nun funktioniert es. Demnach entspricht nun also ein fetch() automatisch immer nur einem Datensatz einer Abfrage?
Und was wäre die Vergehensweise wenn ich kein array sondern ein Objekt als Rückgabewert haben möchte? So habe ich früher eigentlich immer gearbeitet und das gefiel mir persönlich um einiges besser.
 
Genau, pro fetch bekommt man immer eine Zeile als Array.
Es gibt auch fetchObject für Objekte, und fetchAll um gleich alle Zeilen als großes Array zu bekommen (allerdings nicht so toll wenn man zB. 100Millionen Zeilen hat ... PHP im Webserver hat Speicherlimits).

Was man auf $prep sonst noch aufrufen kann gibts hier ca. in der Mitte der Seite.
 
Also, vielleicht bin ich ja einfach zu doof dafür. :-(
Seit mind. 2 Stunden versuche ich nun, einen ganz normalen String aus einer Tabelle auszulesen. Wie man an meinem Quellcode erkennen kann habe ich schon etliche Kontrollen eingebaut, um zu sehen ob alles richtig durchlaufen wird und so ist es. Alle Werte sind korrekt, vorhanden, die Schleife wird exakt passend zur vorhandenen Datensatzzahl der Tabelle durchlaufen, aber egal was ich aus der Tabelle auslesen will: Die Variable $attr1 bleibt immer leer. :-(


PHP:
while($zeile = $prep->fetch())
{
    $p_holer = 'SELECT * FROM s_articles_attributes WHERE articleID = ?';
    $prep_p = $connection->prepare($p_holer);
    if(!$prep_p)
    {
         //Fehler beim prepare
    }
    else
    {
           $articleID = $zeile['articleID'];
           $ergebnis_p = $prep_p->execute(array($articleID));
           if(!$ergebnis_p)
           {
                  //Fehler bei der Abfrage
           } 
          else
          {
                $idiotie = $idiotie." Einmal hier gewesen"." ".$articleID." ";
                $attr1 = $attr1." ".$ergebnis_p['attr1'];
           }
     }
}
 
Soll das innerhalb der Schleife von einer "Überabfrage" stehen? Wäre evt. hilfreich die auch zu sehen.

Jedenfalls, in der inneren Abfrage machst du gerade den gleichen Fehler wie ich oben: Das, was execute zurückgibt, hat keine Daten aus der DB, nur true/false ob es geklappt hat. Im else (wo es also geklappt hat) sollte dann von $prep_p fetch aufgerufen werden, un die Daten zu erhalten.

Außerdem $idiotie und $attr1 irgendwo vorher mal auf einen Anfangswert setzen (zB. ""), bevor man Sachen anhängt.
 
Boah, und ich wollte schon alles hinschmeißen, vielen Dank für den Hinweis!!! Tröstlich auch, dass ich das nicht als Einziger falsch mache. ;-) Nun läuft alles so wie es soll und alle Werte sind korrekt vorhanden. :)
Jetzt muss ich mir das wirklich super auskommentieren, damit dieser Fehler nicht nochmal passiert!
 
Zurück