Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP in Verbindung mit POSTGRES - Probleme

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP in Verbindung mit POSTGRES - Probleme

    Hallo ihr Lieben,

    habe folgendes Problem. Bin gerade an einem kleinen Projekt und hänge an manchen Stellen...

    Ich möchte eine Tabelle ausgeben mit Daten aller Produkte, die ein angemeldeter User selbst zur Auktion eingestellt hat. Die Tabelle soll 4 Spalten haben (Bezeichnung des Produkts, Mindestgebot, Aktueller Preis (falls schon auf dieses Artikel geboten wurde), und Status (also ist die Auktion noch aktiv oder nicht).
    Mein Problem liegt bei der 3. Spalte. Mit diesem Code (siehe unten) schreibt er mir für beide Produkte den gleichen Wert in beide Zeilen (also für beide Produkte, das Gebot von dem einen Produkt). Ich habe es gestern versucht in einer Abfrage mit Case zu gestalten, leider erfolglos. Eigentlich sollte in der 2 Zeile bei Samsung noch kein Gebot abgegeben stehen. Eventuell kann jemand auf die Sprünge helfen...

    Ausgabe:
    Antiker Teppich 1500.00 1501.00 beendet
    Samsung Galaxy S8 100.00 1501.00 aktiv
    PHP-Code:
    <?php

    ... (session übergabe)

    $conn_str="host=... port=... dbname=... user=...
    password=..."
    ;
    $link=pg_connect($conn_str);
    if (!
    $link) {
    die(
    'Verbindung schlug fehl.');
    }


    $query1 "SELECT bezeichnung, mindestgebot, p_status
    FROM produkt,userdata
    WHERE userdata.uid=produkt.uid
    AND username='"
    .$_SESSION['username']."';";

    $rs1=pg_query($link$query1) or die("Cannot execute query: ".$query1);
    $gefunden=0;

    $query2 "SELECT gebotsbetrag
    FROM gebote, produkt, userdata
    WHERE gebote.pid=produkt.pid
    AND userdata.uid=produkt.uid
    AND username='"
    .$_SESSION['username']."';";

    $rs2=pg_query($link$query2) or die("Cannot execute query: ".$query2);
    $row2 pg_fetch_row($rs2);

    if(!
    $rs2)
    {
    $row2[0]='noch kein Gebot abgegeben';
    }


    echo 
    '<br>';
    echo 
    '<table border=1>';

    while (
    $row1 pg_fetch_row($rs1))
    {
    echo 
    '<h1><tr><td>'.$row1[0].'</td><td>'.$row1[1].'</td><td>'.$row2[0].'</td><td>'.$row1[2].'</td></tr><h1>';
    $gefunden=1;
    }
    echo 
    '</table>';
    echo 
    '<a href="index.php"><h2> Zurück zur Startseite </h2></a>';


    if(!
    $gefunden) echo '<h3>Sie bieten zurzeit keine Produkte an!</h3>';


    pg_close($link);
    ?>


  • #2
    Das ist ein grausamer Code. Nummerierte Variablen, keine Einrückungen, Sprachenmischmasch, lauter echos, kaputter HTML-Code, usw. Und warum machst du überhaupt zwei Datenbankabfragen statt einer, die genau das liefert, was du darstellen willst?

    Kommentar


    • #3
      .. und wäre es nicht besser PDO zu nutzen als die speziellen PostgreSQL Functions ?
      PHP-Klassen auf github

      Kommentar


      • #4
        Zitat von hellbringer Beitrag anzeigen
        Das ist ein grausamer Code. Nummerierte Variablen, keine Einrückungen, Sprachenmischmasch, lauter echos, kaputter HTML-Code, usw. Und warum machst du überhaupt zwei Datenbankabfragen statt einer, die genau das liefert, was du darstellen willst?
        Ich bin ein Anfänger. )

        Einrückungen sind nicht mit übernommen wurden, leider.
        Was ist an nummerierten variablen schlecht?
        Sprachenmischmasch, lauter echos, kaputter HTML-Code ... hm, sind ja nur 2 Sprachen = html und php, echos damit ich das ergebnis ausgeben kann, etc. Aber wie gesagt, bin ein Anfänger.

        Warum nicht eine Abfrage? Hab ja geschrieben, dass ich es mit Case When versucht habe, aber es leider nicht ging. Anders weiß ich nicht, wie ich es umsetzen soll. Hätte ich es gewusst, würde ich ja hier nicht schreiben ))

        Kommentar


        • #5
          Zitat von jspit Beitrag anzeigen
          .. und wäre es nicht besser PDO zu nutzen als die speziellen PostgreSQL Functions ?
          Wie schon gesagt, bin ein Anfänger.

          Kommentar


          • #6
            Zitat von abd11 Beitrag anzeigen
            Was ist an nummerierten variablen schlecht?
            Ernstgemeinte Frage? Würdest du deine Kinder "Kind 1" und "Kind 2" nennen? Würdest du in ein Lokal essen gehen, wo auf der Speisekarte "Gericht 1", "Gericht 2", "Getränk 1", "Getränk 2", usw. steht?

            Wieso denkst du also, dass ein Programmierer gerne nummerierte Variablen liest, statt aussagekräftige Namen?

            Zitat von abd11 Beitrag anzeigen
            Sprachenmischmasch, lauter echos, kaputter HTML-Code ... hm, sind ja nur 2 Sprachen = html und php
            Deutsch und Englisch. Warum nicht nur Englisch? Eine Mischung of different Sprachen ist diffucult to lesen.

            Zitat von abd11 Beitrag anzeigen
            echos damit ich das ergebnis ausgeben kann
            Brauchst du nicht:
            PHP-Code:
            <p>Ich habe ein <?= htmlspecialchars($colorENT_COMPAT'UTF-8'?> Auto.</p>
            Zitat von abd11 Beitrag anzeigen
            Warum nicht eine Abfrage? Hab ja geschrieben, dass ich es mit Case When versucht habe, aber es leider nicht ging. Anders weiß ich nicht, wie ich es umsetzen soll. Hätte ich es gewusst, würde ich ja hier nicht schreiben ))
            Dann wärs sinnvoller, du postest Tabellen und Beispieldaten als SQL-Code um das Problem schon bei der Quelle zu lösen und nicht erst hinterher mit PHP zusammenbasteln.

            Kommentar


            • #7
              Zitat von hellbringer Beitrag anzeigen

              Ernstgemeinte Frage? Würdest du deine Kinder "Kind 1" und "Kind 2" nennen? Würdest du in ein Lokal essen gehen, wo auf der Speisekarte "Gericht 1", "Gericht 2", "Getränk 1", "Getränk 2", usw. steht?

              Wieso denkst du also, dass ein Programmierer gerne nummerierte Variablen liest, statt aussagekräftige Namen?
              ok, solche vergleiche sind etwas aus der luft gegriffen und übertrieben, aber ok ) wie schon ein paar mal gesagt, beschäftige mich erst seit kurzem mit programmierung dieser art )

              Zitat von hellbringer Beitrag anzeigen
              Deutsch und Englisch. Warum nicht nur Englisch? Eine Mischung of different Sprachen ist diffucult to lesen.
              ah des )

              Zitat von hellbringer Beitrag anzeigen
              Dann wärs sinnvoller, du postest Tabellen und Beispieldaten als SQL-Code um das Problem schon bei der Quelle zu lösen und nicht erst hinterher mit PHP zusammenbasteln.
              Ok, weiß zwar nicht, wie genau du es meinst, aber ich versuch es. Hab keine Erfahrung mit Foren.



              Für mein "Problem" sind die Tabellen "Produkt", "Userdata" und "Gebote" von Bedeutung.


              Tabelle "Produkt" hat Spalten: pid / bezeichnung / mindestgebot / einstellunngsdatum (current_timestamp) / p_status.
              Tabelle "Userdata" hat Spalten: uid / username / passwort / name / vorname / ... / etc.
              Tabelle "Gebote" hat Spalten: gid / pid / uid / gebotszeitpunkt (current_timestamp) / gebotsbetrag.

              Bsp.-daten, die in meinem Fall wichtig wären:

              User "rene1" hat insgesamt 2 Produkte zur Auktion eingestellt:
              PID UID Bezeichnung Mindestgebot P_status
              3 3 Antiker Teppich 1500,00 beendet
              4 3 Samsung Galaxy S8 100,00 aktiv

              Es wurde auf Teppich geboten und auf S8 noch nicht:
              GID PID UID Gebotsbetrag
              2 3 2 1501,00




              Was ich möchte ist es, wenn der eingeloggter User sich Produkte anzeigen lässt, die von ihm eingestellt wurden, eine Tabelle erscheint, die folgende Daten in diesem Fall hat:
              Bezeichnunug Mindestgebot Aktueller Preis Status
              Antiker Teppich 1500.00 1501.00 beendet
              Samsung Galaxy S8 100.00 noch kein Gebot abgegeben aktiv

              Die erste Zeile der Tabelle hatte ich gestern nicht mit eingeschrieben, die ist aber leicht zu beschreiben. Was mir "Probleme" bereitet, ist die 3. Spalte bzw. die Unterscheidung der Ausgaben in den Zeilen.

              Viele Grüße.

              Kommentar


              • #8
                Wieder eine ganze schlechte Benennung. Vermeide kryptische Abkürzungen wie PID, UID, GID, P_status. Verwende außerdem nur englische Bezeichnungen.

                Beispiel:

                Tabelle products -> id, seller_id, description, minimum_bid_amount, status
                Tabelle bids -> id, product_id, tenderer_id, bid_amount

                Und so kriegst du dein Ergebnis:
                Code:
                SELECT
                    p.description, p.minimum_bid_amount, MAX(b.bid_amount) AS current_maximum_bid_amount, p.status
                FROM
                    products p
                LEFT JOIN
                    bids b ON ( b.product_id = p.id )
                WHERE
                    p.seller_id = @current_user_id
                GROUP BY
                    p.id, p.description, p.minimum_bid_amount, p.status
                (ungetestet)

                Kommentar


                • #9
                  Zitat von hellbringer Beitrag anzeigen
                  Wieder eine ganze schlechte Benennung. Vermeide kryptische Abkürzungen wie PID, UID, GID, P_status. Verwende außerdem nur englische Bezeichnungen.

                  Beispiel:

                  Tabelle products -> id, seller_id, description, minimum_bid_amount, status
                  Tabelle bids -> id, product_id, tenderer_id, bid_amount

                  Und so kriegst du dein Ergebnis:
                  Code:
                  SELECT
                  p.description, p.minimum_bid_amount, MAX(b.bid_amount) AS current_maximum_bid_amount, p.status
                  FROM
                  products p
                  LEFT JOIN
                  bids b ON ( b.product_id = p.id )
                  WHERE
                  p.seller_id = @current_user_id
                  GROUP BY
                  p.id, p.description, p.minimum_bid_amount, p.status
                  (ungetestet)
                  Danke, ich versuche es.

                  Kommentar


                  • #10
                    Zitat von hellbringer Beitrag anzeigen
                    Wieder eine ganze schlechte Benennung. Vermeide kryptische Abkürzungen wie PID, UID, GID, P_status. Verwende außerdem nur englische Bezeichnungen.

                    Beispiel:

                    Tabelle products -> id, seller_id, description, minimum_bid_amount, status
                    Tabelle bids -> id, product_id, tenderer_id, bid_amount

                    Und so kriegst du dein Ergebnis:
                    Code:
                    SELECT
                    p.description, p.minimum_bid_amount, MAX(b.bid_amount) AS current_maximum_bid_amount, p.status
                    FROM
                    products p
                    LEFT JOIN
                    bids b ON ( b.product_id = p.id )
                    WHERE
                    p.seller_id = @current_user_id
                    GROUP BY
                    p.id, p.description, p.minimum_bid_amount, p.status
                    (ungetestet)

                    Vielen lieben Dank!

                    Wollte jetzt nicht die ganze DB umschmeißen und habe etwas gebastelt, aber es hat geklappt

                    Musste die Tabelle userdata auch hinzufügen mit LEFT JOIN, da ich bei der session nur den usernamen übergeben habe. Aber ich habe es hinbekommen )) Jetzt zeigt es mir sowohl die eingestellten Produkte des angemeldeten Users an als auch in anderem "Menüpunkt" die Produkte, bei denen der angemeldeter User Gebote abgegeben hat (natürlich abgeänderte Abfrage). Danke nochmal!

                    Werde deine Ratschläge fürs nächste mal zu Herzen nehmen, ist mein 1. Versuch in Programmierung.

                    Kommentar


                    • #11
                      Zitat von abd11 Beitrag anzeigen

                      Wie schon gesagt, bin ein Anfänger.
                      Dann empfehle ich dir PDO anzuschauen und zu nutzen. Das brauchst du nur ein mal zu begreifen, und kannst das Gelernte für mehrere Datenbanksysteme (POSTGRES, MySQL, SQLite..) nutzen. PDO hat noch weitere Vorteile, die ich jetzt hier aber nicht aufzähle..
                      PHP-Klassen auf github

                      Kommentar


                      • #12
                        Zitat von jspit Beitrag anzeigen

                        Dann empfehle ich dir PDO anzuschauen und zu nutzen. Das brauchst du nur ein mal zu begreifen, und kannst das Gelernte für mehrere Datenbanksysteme (POSTGRES, MySQL, SQLite..) nutzen. PDO hat noch weitere Vorteile, die ich jetzt hier aber nicht aufzähle..
                        Danke für deinen Ratschlag!

                        Kommentar


                        • #13
                          Guckst du hier.. Fast Copy & Paste fähige Beispiele und Erklärungen auf wichtige Dinge auf die man achten sollte.. UTF-8, Prepared Statments etc.. wenn man so wie zB du externe Werte in der Query hast.
                          PHP-Code:
                          AND username='".$_SESSION['username']."';"; 
                          https://php-de.github.io/jumpto/pdo/

                          https://www.php-rocks.de/thema/49-ei...tatements.html
                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Zitat von abd11 Beitrag anzeigen
                            Musste die Tabelle userdata auch hinzufügen mit LEFT JOIN, da ich bei der session nur den usernamen übergeben habe.
                            Der Username hat in der Session nichts verloren. Dort solltest du nur die User-ID speichern.

                            Davon abgesehen hast du eine Sicherheitslücke (wie hausl schon darauf hingewiesen hat), weil du den Benutzernamen direkt in SQL-Code einfügst.

                            Kommentar

                            Lädt...
                            X