PHP-Array mit MySQL Datenbank ersetzen(PDO)



  • Hallo,

    der Titel sagt eigentlich alles. Das Problem dabei ist das ich nicht genau weiß wie ich mit diesen PDO-Methoden meine Datenbank durchsuchen, abfragen kann.

    SQL befehle kenne ich ja schon, nur werden hier auch parameter übergeben und wie kann ich dann genau "diese" Zeile/Spalte löschen? Oder zB Überprüfen ob ein element gesetzt ist? ->Ausgeben der Tabelle?

    Wenn Ihr den Code seht werdet Ihr verstehen was ich meine.

    Verbindung kriege ich, die Funktionen sind mein Problem.

    <?php
    
    /**
     * Datenbank-klasse
     */
    class ShoppingCard {
    
        protected $db;
        protected $orderid;
    
        public function __construct($hostname, $username, $password) {
            try 
            {
                /**Mit Datenbank verbinden**/
                $this->$db = new PDO("mysql:host=$hostname;dbname=blabla", $username, $password);
                echo 'Verbindung zur Datenbank hergestellt';
    
                /**PDO Error-Mode auf Exceptions setzen**/
                $this->$db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                //$this->$db -> exec("Insert into ShoppingCard(orderID, name, quantity, price) Values ('34','jacoc', 435, 89.3)");
            } 
            catch (PDOException $e) {
                echo "Fehler bei Verbindung: " . $e -> getMessage();
            }
    
        }
    
        public function setOrderid($orderid)
        {
            $this->$orderid = $orderid;
        }
    
        public function add($name, $price, $quantity)
        {
    
        }
    
        public function delete($name, $quantity)
        {
    
        }
    
        public function display()
        {
    
        }
    
    }
    
    $hostname = 'localhost';
    $username = '***';
    $password = '***';
    
    $Card = new ShoppingCard($hostname,$username,$password);
    
    ?>
    


  • Hä? Wie wärs, wenn du dich einfach mal ein bisschen in das Thema einliest? Soll das jetzt jemand für dich zusammenfassen, weil du zu faul bist, deine kostbare Zeit zu investieren? Ja, wenn ich Code sehe, verstehe ich nur, dass du gar nichts weißt und keine Lust hast, dich damit zu beschäftigen.



  • Also Faul auf keinen Fall 😃 aber die Zeit für das einlesen, bis jetzt hättet Ihr mir natürlich mit einpaar sätzen ersparen können, ist natürlich Charackter/Einstellungs frage.

    Jedenfalls habe ich weiter gemacht und meine If-Abfrage geht immer auf False, also in den else Zweig. Und hier komme ich wirklich nicht weiter:

    public function add($name, $price, $quantity) {
            $stmt = $this -> db -> prepare('Insert into ShoppingCard values (:orderid, :name, :quantity, :price)');
            $stmt -> bindParam(':orderid', $this -> orderid);
            $stmt -> bindParam(':name', $name);
            $stmt -> bindParam(':quantity', $quantity);
            $stmt -> bindParam(':price', $price);
            $rekurs = $this -> db -> prepare('Select * From ShoppingCard Where name Like :name');
            $rekurs -> bindParam(':name', $name);
            if (!$rekurs -> execute()) {
                $stmt -> execute();
            } else {
                echo "Artikel darf nur 1mal enthalten sein...";
            }
        }
    

    Sie sollte bei identischem Namen kein Insert ausführen! Nur tut es das Nie.



  • Warum sollte $rekurs->execute nicht funktionieren? Funktionen tut es schon, nur gibt es keine Zeilen zurück. Du könntest z.B. ein SELECT Count(*) ausführen und dir dann den Wert mit fetchColumn holen.
    Natürlich ist es generell besser, Anweisungen so spät wie möglich auszuführen. Die ersten zig Befehle brauchst du doch erst, wenn du ein Insert machen willst, wenn du es dann doch nicht machen willst, waren sie völlig umsonst.



  • Das Problem ist das es immer den else Zweig ausführt.

    weiter unten wird die funktion mit: $Card -> add("name1e", 4, 3); aufgerufen.
    "name1" existiert jedoch bereits in meiner Tabelle. Trotzdem wird "Artikel darf nur 1mal enthalten sein..." angezeigt und INSERT INTO wird überhaupt nicht ausgeführt.

    Also $stmt->execute() macht er nicht!

    /**
         * Neue Artikel hinzufügen, ohne Redundanz
         */
        public function add($name, $price, $quantity) {
            $rekurs = $this -> db -> prepare('Select * From ShoppingCard Where name Like :name');
            $rekurs -> bindParam(':name', $name);
            if (!$rekurs -> execute()) {
                $stmt = $this -> db -> prepare('Insert into ShoppingCard values (:orderid, :name, :quantity, :price)');
                $stmt -> bindParam(':orderid', $this -> orderid);
                $stmt -> bindParam(':name', $name);
                $stmt -> bindParam(':quantity', $quantity);
                $stmt -> bindParam(':price', $price);
                $stmt -> execute();
            } else {
                echo "Artikel darf nur 1mal enthalten sein...";
            }
        }
    


  • Ja, hab ich doch geschrieben. Wieso sollte $rekurs->execute nicht funktionieren? Das Ausführen des Statements funktioniert doch, deswegen kommt da auch true zurück und er geht in den entsprechenden Zweig. Du musst dir die Anzahl der entsprechenden Zeilen mit Select count(*) holen.



  • Ich weiss jetzt wo das Problem liegt. Die if-Bedingung wird immer TRUE zurückgeben solange der SQL Befehl erfolgreich ausgeführt werden kann. Ich wollte aber nicht das er den Befehl prüft, sondern die Spalte durchgeht in denen die namen stehen und guckt ob dort, der vom Benutzer eingegebene name mit den schon vorhandenen identisch ist.

    In einem Array würde es heißen:

    if(!isset($this->Array[$name]))
    {nicht vorhanden, ... }
    else
    {schon vorhanden!}
    

    Wie kann ich das mit PDO realisieren?



  • gast55 schrieb:

    Ich weiss jetzt wo das Problem liegt. Die if-Bedingung wird immer TRUE zurückgeben solange der SQL Befehl erfolgreich ausgeführt werden kann.

    Das hab ich doch schon ZWEI mal geschrieben. Und auch, wie du das löst.



  • wieso verwendet keiner array_key_exists() 😕

    Example #2 array_key_exists() vs isset()

    isset() does not return TRUE for array keys that correspond to a NULL value, while array_key_exists() does.


Anmelden zum Antworten