SQL Befehl in PHP korrigieren

  • PHP

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    SQL Befehl in PHP korrigieren

    Hallo,

    Ich habe zwei Tabellen und ich will aus beiden bestimmte Einträge auslesen.

    In beiden Tabellen gibt es die UserID (wird für die Session verwendet) und ich möchte alle Einträge von Jetzt sowie der letzten 5min auslesen. Die Tabellen besitzen datetime, also Datum mit Uhrzeit.


    folgendes hab ich probiert, erhalte aber die Fehlermeldung:

    Parse Error, syntax error, unexpected " (T_ENCAPSED_AND_WHITESPACE), expecting ´-` or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in Line ...siehe angefügte Codezeile

    Quellcode

    1. $sql = "SELECT * FROM tbl1, tbl2 WHERE UserID = $_SESSION['id'] AND dateadd(mi, -5)";
    Ich habe zwar so gut wie keine Ahnung von PHP, aber ich tippe auf die Substitution innerhalb der String-Zuweisung.
    Geht das

    PHP-Quellcode

    1. $sql = "SELECT * FROM tbl1, tbl2 WHERE UserID = {$_SESSION['id']} AND dateadd(mi, -5)";
    oder das

    PHP-Quellcode

    1. $sql = "SELECT * FROM tbl1, tbl2 WHERE UserID=" . $_SESSION['id'] . " AND dateadd(mi, -5)";
    ?

    Ausserdem sollte der AND-Part vermutlich irgendwie so aussehen (Achtung PseudoCode)

    SQL-Abfrage

    1. WHERE ... AND creationdate > DateAdd(Minute, -5, GETTIME())
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Bitte benutzte mysqli/pdo mit prepared Statements, so holst du dir nur Sicherheitslücken ins System.
    mysqli: mysqli::prepare
    pdo: PDO::prepare
    @slice Danke, werde ich mir mal genauer anschauen.

    ich habs jetzt noch mal ein wenig abgeändert. Wenn ich das dateadd weglasse, funktioniert es wie gewollt, zeigt aber auch ältere Einträge an, welche ich mit dem dateadd ausblenden wollte.
    Wenn ich das dateadd drinnen lasse, bekomme ich folgende Meldung:

    FUNCTION productlist.dateadd does not exist

    Quellcode

    1. $sql = "SELECT * FROM products, offers WHERE UserID=" . $_SESSION['id'] . " AND dateadd(mi, -5) AND products.ProductID = offers.ProductID";
    Wie heißt denn die Spalte in der das Datum steht? Die Syntax wäre SELECT column1, column2, ... FROM table1 WHERE columnX = 'value1' AND columnY = 'value2'
    Also zum Beispiel: ...AND columnX > dateadd(mi, -5) AND products...
    Ich komme hier einfach auf kein sinnvolles Ergebnis. Deswegen vllt nochmal eine genaue Erklärung, was ich möchte und wie die Tabellen aufgebaut sind...

    Tabelle 1 enthält Produkte und hat ein Autoinkrement auf ProductID

    ProductIDPNamePNummer
    1Product 1#qwertz


    Tabelle zwei enthält Bestellungen

    OrderIDUserIDProductIDPAmountODate
    123122020-07-27 14:55:50
    224302020-07-27 15:30:30


    Das Problem, das ich habe, ist, dass wenn ich zweimal als selber Nutzer etwas bestelle, sind ja mehrere Einträge vorhanden. Sprich bei der Ausgabe wird der alte und neue Eintrag angezeigt.
    Deswegen wollte ich alle Einträge der letzten Minute anzeigen lassen, um auch nur den neuesten Eintrag zu haben.

    Von SQL-Befehlen versteh ich so gut wie nichts, weshalb ich auch zu keinem sinnvollen Ergebnis komme.
    wäre cool wenn jemand mir sagen könnte wie ich den Befehl jetzt umsetzen muss.

    Wenn ich jetzt zehnmal etwas bestelle bekomme ich halt alle 10 Bestellungen... aber eigentlich sollte nur 1 Bestellung kommen. Beim Aufgeben der Bestellung bekommt auch jedes bestelltes Item einen Eintrag. Deswegen wollte ich über die Zeit gehen und nur die Einträge anzeigen, welche das Datum/Uhrzeit haben, wenn ich auf den Button klicke. Also DateNow oder sowas. Oder eben alle Einträge der letzten minute oder sowas...


    Quellcode

    1. ​$sql = "SELECT * FROM products, offers WHERE UserID=" . $_SESSION['id'] . " AND dateadd(mi, -5) AND products.ProductID = offers.ProductID";
    zeigt mir alle Einträge meiner UserID an.

    mit dem Hinweis von @slice konnte ich leider nicht viel anfangen...
    Ich denke das hängt etwas am falschen Design.

    Ich würde zusätzlich zur Bestellungstabelle eine Tabelle für die Positionen einer Bestellung anlegen.
    Sodass du in deiner Tabelle Bestellung EINE Zeile PRO Bestellung hast und in der BestellungPosition-Tabelle dann mit der OrderID Verknüpft alle Positionen einer Bestellung hast.
    So kannst du dir immer per SQL die LETZTE BestellungsID(OrderID) holen und dann in der BestellungPosition-Tabelle alle Positionen der Bestellung holen.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    habe es jetzt mit einer weiteren Tabelle geloest.

    SQL-Abfrage

    1. ​$sql = "SELECT * FROM products, offers, offernumber WHERE UserID=" . $_SESSION['UserID'] . " AND offers.UserID = offernumber.OUserID AND offers.ODate = offernumber.OfferDate AND products.ProductID = offers.ProductID AND offernumber.OfferID = (SELECT Max(OfferID) FROM offernumber)";


    jetzt nur noch die Namen ein wenig sinnvoller anpassen.

    Danke an alle, die mir hier geholfen haben!

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

    Ja und trotzdem würde ich den Code nicht als Vorlage nehmen, md5 sollte zum Beispiel nicht mehr als Hash für Passwörter benutzt werden (auch fehlt da jegliche Spur von salt).

    Scroll einfach mal bei den von mir verlinkten Seiten etwas runter, da ist Beispielcode.