Alte mysql_query() Abfrage auf pdo "Upgraden" & verbessern

  • PHP

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Link.

    Alte mysql_query() Abfrage auf pdo "Upgraden" & verbessern

    Huhu, ich bin gerade auf ein altes Projekt gestoßen und versuche die Abfragen n bissl zu verbessern.

    Habe hier Folgende:

    PHP-Quellcode

    1. $qry = mysql_query("SELECT id,firma FROM kunden");
    2. $reihen = array();
    3. while ($kd = mysql_fetch_array($qry)) {
    4. $subqry = mysql_query("SELECT COUNT(*) FROM auftraege WHERE kundennr=$kd[0]");
    5. $reihen[] = "['" . $kd[1] . "'," . mysql_result($subqry, 0) . "]";
    6. }
    7. $datastring = implode(",", $reihen);

    Den datastring brauche ich für ne API.

    Jetzt versuche ich das ganze auf PDO zu upgraden & zusätzlich zu verbessern. Es gab doch so sum() Befehl, kann man den nicht hier verwenden, um diese Subquery zu überspringen?

    Natürlich erstmal ne neue PDO Instanz erstellen:

    PHP-Quellcode

    1. $db = new PDO('mysql:host=derHost;dbname=dieDB;charset=utf8', 'derBenutzer', 'dasPW');


    Dann die Query vorbereiten:

    PHP-Quellcode

    1. $sq = $db->prepare("SELECT COUNT(*) FROM auftraege WHERE kundennr=?");
    2. if ($sq->execute(array($kdid))) {
    3. $oAU = $sq->fetch(PDO::FETCH_OBJ);
    4. }


    Hab hier aber Schwierigkeiten das unter einem Hut zu kriegen, mag vlt. daran liegen das ich gerade nicht ganz bei der Sache bin, gestrige Nacht war ein bisschen schlaflos :P..

    Also zusammengefasst, soll das Script auslesen welche Firma (Kunde) wie viele Aufträge bei uns hat und dies wie folgt ins reihen-Array packen:
    ['Firma', AnzahlAufträge]
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Hi,

    ich persönlich fetche mir die Ergebnisse am liebsten in ein assoziatives Array. Du hast momentan FETCH_OBJ - ggf. ändern in FETCH_ASSOC oder noch besser direkt die setAttribute()-Methode der PDO-Klasse aufrufen, um diese als Standard-FetchMethod anzugeben.
    Natürlich bekommst du -sofern dein SQL-Statement korrekt ist- ein Ergebnis, aber in deinem Fall wie gesagt vom Typ FETCH_OBJ, also ein Objekt. Stell um auf PDO::FETCH_ASSOC, führe das Statement aus, und hau dir das Zeugs mit fetchAll() in dein Array.

    Wenn du Code-Beispiele brauchst, gern. Aber versuch erst, das so hinzubekommen ;)

    Link :thumbup:
    Hello World
    Bin jetzt in der Zeit auf folgende Abfrage gekommen, is das so ungefähr richtig?

    SQL-Abfrage

    1. SELECT firma,(SELECT COUNT (*) FROM auftraege WHERE kundennr = kunden.id) as 'anzauftraege' FROM kunden


    Achja, die Tabellenstruktur wäre ja auch interessant ;)
    Tabelle: auftraege
    Spalten:
    - nr (int, auto increment, unique)
    - kundennr
    - .....

    Tabelle: kunden
    Spalten:
    - id (int, auto increment, unique)
    - firma (text, da kommt der firmenname rein)
    - .....
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Hi,

    willst du wissen, wieviele Aufträge ein bestimmter Kunde bei euch hat (WHERE `kunden`.`nr` = '...'), oder insgesamt einer Auflistung aller Kunden inkl. der Anzahl der Aufträge?


    Link :thumbup:
    Hello World
    Letzteres, im Endeffekt eine Abfrage, die sowas liefert:

    PHP-Quellcode

    1. While ($row=fetchbla()) {
    2. echo "der Kunde " . $row->firma . " hat " . $row->anzauftraege . " bei uns."
    3. }
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Hi,

    SQL-Abfrage

    1. SELECT k.id, k.firma, COUNT(a.kundennr) AnzahlAuftraege FROM kunden AS k LEFT JOIN auftraege AS a ON k.id = a.kundennr GROUP BY k.id, k.firma

    sollte klappen, hab's getestet.
    Die Ausgabe des Arrays (z.B. mit var_dump() oder print_r()) setzt du in <pre>-Tags, für bessere Lesbarkeit der Array-Ausgabe.


    EDIT:
    Alte mysql_query() Abfrage auf pdo "Upgraden" & verbessern

    Je nachdem wie dein Code aussieht, kann das eine Menge Arbeit bedeuten (überall die entsprechenden Stellen in allen files ändern), oder aber mit einem Aufwand von 15 Minuten Arbeit ganz einfach erfolgen, vorausgesetzt du hast dir bereits eine Datenbank-Wrapper-Klasse geschrieben, sodass du eigentlich nur noch den Datenbanktreiber ändern musst - das wäre der Optimalfall. Falls bei dir erstgenannten zu tun ist - mach es gleich richtig und schreibe dir einen DB-Wrapper - so kannst du z.B. allein durch ändern eines Wertes den Datenbank-Treiber umstellen (Beispiel: $mysql_driver hat ab jetzt den Wert "pdo" statt "mysql" oder "mysqli"). So würde ich es dir empfehlen.



    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Link“ ()

    Hey, danke für deine Zeit.

    Ich habe es auch mit der Abfrage unten hinbekommen, die verstehe ich auch leichter. Ich habe mir schon öfters mal die JOIN-Geschichte angeschaut, aber irgendwie nicht richtig verstanden.
    Weiß nicht wann genau man Sie benutzt und wieso :(.

    PHP-Quellcode

    1. $reihen = array();
    2. $db = new PDO('mysql:host=host;dbname=db;charset=utf8', 'usr', 'pw');
    3. $sq = $db->prepare("SELECT firma,(SELECT COUNT(*) FROM auftraege WHERE kundennr = kunden.id AND rof=?) as 'anzauftraege' FROM kunden");
    4. if ($sq->execute(array($roderf))) {
    5. while ($r = $sq->fetch(PDO::FETCH_OBJ)) {
    6. $reihen[] = "['" . $r->firma . "'," . $r->anzauftraege . "]";
    7. }
    8. $datastring = implode(",", $reihen);
    9. }


    So eine Wrapper-Klasse habe ich leider nicht gemacht :P.. Heißt ich krieg die volle Ladung ab, aber egal, die Arbeit mach ich mir :).
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Hi,

    So eine Wrapper-Klasse habe ich leider nicht gemacht :P.. Heißt ich krieg die volle Ladung ab, aber egal, die Arbeit mach ich mir :).

    Ja, und wie gesagt, macht es gleich richtig und schreibe dir nen Datenbank-Wrapper.

    JOIN: wiki.selfhtml.org/wiki/Datenbank/Einf%C3%BChrung_in_Joins
    Schnell erklärt: Joins sind dazu da, um mehrere Tabellen auszulesen. Mit SELECT bekommst du immer nur die Daten aus einer Tabelle - mit JOIN kannst du Daten (oder nur bestimmte Spalten) aus weiteren Tabellen in einem Rutsch mit auslesen. Wird aber in dem Link den ich dazugeschrieben hab ganz gut erklärt.


    Link :thumbup:
    Hello World

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Link“ ()