Ankündigung

Einklappen
Keine Ankündigung bisher.

Fragen zur PDO

Einklappen

Neue Werbung 2019

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

  • #16
    Siehe Posting #11 und/oder #12
    Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

    Kommentar


    • #17
      Halllo nochmal,
      das Problem mit dem zählen hat sich nun erledigt.
      Lösung ist
      PHP-Code:
          $kartensumme 0;
          
      $sql "SELECT
                      SUM(tb_karte_transfer_anzahl) inhalt,
                      tb_karte_transfer_preis,
                      
                  FROM
                      db_karte_transfer
                  WHERE
                      db_karte_transfer.tb_karte_transfer_rechnung = "
      .intval($_GET['id'])."";
          
      $statement $db->prepare($sql);
          
      $statement->execute();  
          while(
      $row $statement->fetch(PDO::FETCH_ASSOC))
              {
                  
      $kartensumme $kartensumme floatval($row['tb_karte_transfer_preis'] * $row['tb_karte_transfer_anzahl']);
              } 
      So zur nächsten frage.
      Wenn ich eine Karte Tausche und ich einen (neunen) Trader habe.
      Überprüfe ich die mit Selct und fals er nicht vorhanden ist in der DB.
      Wird der mit Insert eingetragen.
      Dabei wird der neu eingetragene Trader deren ID weitergegeben in die Tabelle der Karte.

      So sieht der alte Code davon aus
      PHP-Code:
      if(isset($_POST['add']))
          {
              
      $tb_rechnung_versand floatval(str_replace(",""."$_POST['add_versand']));
              
      $tb_karte_wo $_POST["add_wo"];
              
      $tb_kunde_vorname str_replace($suche$ersetze$_POST["add_vorname"]);
              
      $tb_kunde_nachname str_replace($suche$ersetze$_POST["add_nachname"]);
              
      $tb_rechnung_wo $_POST["add_wo"];
              
      $datum time();
              
      $eintrag "SELECT
                              tb_kunde_id
                          FROM
                              db_kunde
                          WHERE
                              tb_kunde_vorname = '"
      .$tb_kunde_vorname."'
                          AND
                              tb_kunde_nachname = '"
      .$tb_kunde_nachname."'";

              
      $eintragen mysql_query($eintrag) OR die("Error: ".mysql_error()."</ br> Zeile ".__LINE__);
              if(
      mysql_num_rows($eintragen) < 1)
                  {
                      
      $strSQL "
                              INSERT INTO
                                  db_kunde
                                      (
                                      tb_kunde_vorname,
                                      tb_kunde_nachname
                                      )
                              VALUES
                                  (
                                  '"
      .$tb_kunde_vorname."',
                                  '"
      .$tb_kunde_nachname."'
                                  );"
      ;
                      
      $eintragen mysql_query($strSQL) OR die("Error: ".mysql_error()."</ br> Zeile ".__LINE__);
                      
      $id_kunde mysql_insert_id();
                  }
              else
                  {
                      
      $ar_kund mysql_fetch_assoc($eintragen);
                      
      $id_kunde $ar_kund["tb_kunde_id"];
                  }
          } 
      Mit der Umstellung sieht das so aus
      PHP-Code:
      if(isset($_POST['reserviert']))
          {
              
      $tb_kunde_land $_POST["add_land"];
              
      $tb_karte_wo $_POST["add_wo"];
              
      $tb_kunde_vorname str_replace($suche$ersetze$_POST["add_vorname"]);
              
      $tb_kunde_nachname str_replace($suche$ersetze$_POST["add_nachname"]);
              
      $tb_rechnung_datum date("Y.m.d");
              if(
      $tb_kunde_land == "" OR $tb_kunde_vorname == "" OR $tb_kunde_nachname == "" OR $tb_karte_wo == "" OR $_POST['id_karte'] == "")
                  {
                      echo 
      "Du hast nicht alle Felder ausgefühlt";
                  }
              
      $client_array = array();
              
      $select_client "SELECT
                              tb_kunde_id
                          FROM
                              db_kunde
                          WHERE
                              tb_kunde_vorname = '"
      .$tb_kunde_vorname."'
                                  AND
                                      tb_kunde_nachname = '"
      .$tb_kunde_nachname."'
                                  AND
                                      tb_kunde_land = '"
      .$tb_kunde_land."'";
              
      $select $db->query($select_client) OR die("Error: ".$db->error()."</br> Zeile ".__LINE__);
              if (
      $select->fetchColumn() < 1)
                  {
                      
      $client_data['tb_kunde_vorname'] = $tb_kunde_vorname;
                      
      $client_data['tb_kunde_nachname'] = $tb_kunde_nachname;
                      
      $client_data['tb_kunde_land'] = $tb_kunde_land;
                      
      $add_client $db->insert("db_kunde",$client_data) OR die("Error: ".$db->error()."</br> Zeile ".__LINE__);
                      
      $id_kunde $add_client->lastInsertId();
                  }
              else
                  {
                      
      $ar_kund $client_array[0];
                      
      $id_kunde $ar_kund["tb_kunde_id"];
                  }
          } 
      Wenn ich das so abschicke, bekomme ich die Meldung
      Notice: Undefined offset: 0 in ....\angebot.php on line 37

      Keine Ahnung warum.
      Könnt ihr mir da weiter helfen
      Ja ich weiß das MySQL_ API was ich verwende veraltet ist.
      Aber ich nutze diese Version nur auf meinem Rechner.

      Kommentar


      • #18
        Warum nutzt du nicht Prepared Statments? So brings das nicht viel, sind die Queries ja wieder nicht abgesichert. Mach es doch gleich "richtig".
        The string "()()" is not palindrom but the String "())(" is.

        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


        • #19
          Zitat von Germanikus Beitrag anzeigen
          das Problem mit dem zählen hat sich nun erledigt.
          Lösung ist
          PHP-Code:
           $kartensumme 0;
          $sql "SELECT
          SUM(tb_karte_transfer_anzahl) inhalt,
          tb_karte_transfer_preis,

          FROM
          db_karte_transfer
          WHERE
          db_karte_transfer.tb_karte_transfer_rechnung = "
          .intval($_GET['id'])."";
          $statement $db-&gt;prepare($sql);
          $statement-&gt;execute();
          while(
          $row $statement-&gt;fetch(PDO::FETCH_ASSOC))
          {
          $kartensumme $kartensumme floatval($row['tb_karte_transfer_preis'] * $row['tb_karte_transfer_anzahl']);

          Das kann so nicht richtig sein.
          Was ist tb_karte_transfer_preis? Ist das der Einzelpreis einer ... was ... Rechnungsposition?
          Ist folglich tb_karte_transfer_anzahl die Menge der Rechnungsposition? Wenn das so ist, dann macht SUM(tb_karte_transfer_anzahl) hier keinen Sinn.

          Zumal du PDO auch richtig benutzen solltest:

          PHP-Code:
          <?php
          $query 
          "
              SELECT
                  kt.tb_karte_transfer_anzahl AS anzahl,
                  kt.tb_karte_transfer_preis AS preis,
                  kt.tb_karte_transfer_preis * kt.tb_karte_transfer_anzahl AS gesamtpreis
              FROM
                  db_karte_transfer kt
              WHERE
                  kt.tb_karte_transfer_rechnung = :id
          "
          ;
          $statement $db->prepare($query);
          $statement->execute(['id' => $_GET['id']]);
          foreach(
          $statement->fetchRows(PDO::FETCH_ASSOC) as $row) {
              
          print_r($row);
          }
          Wie viel Sinn macht es Datenbank-Tabellen den Prefix db_ voranzustellen? Stellst du deinen PHP-Klassen und -Funktionen auch den Prefix Php_ oder php_ voran?

          Wenn das eine Rechnung/Bestellung sein soll, dann ist das Schemadesign möglicherweise kaputt.

          Kommentar


          • #20
            So bin schon wieder ein kleines stück weiter gekommen.
            Aber nun habe ich mal ne frage, warum das nicht (mal wieder, wie soll es den sonst sein^^) hinhaut.
            Also wenn ein neuer Trader erstellt wird, der nicht in der DB steht.
            Wird er erstellt und desen ID wird in der rechnung abgesichert.
            Aber warum wird die ID von den vorhandenen Trader nicht in der rechnung abgespeichert.
            Bei vardump bekomme ich den wert aus.
            Aber der fehler verweist mich in die klasse
            array(1) { ["tb_kunde_id"]=> string(1) "1" }
            Notice: Array to string conversion in ...\classes.php on line 29
            warenkorp.php
            PHP-Code:
            if(isset($_POST['reserviert']))
                {
                    
            $tb_kunde_vorname str_replace($suche$ersetze$_POST["add_vorname"]);
                    
            $tb_kunde_nachname str_replace($suche$ersetze$_POST["add_nachname"]);
                    
            $sql "SELECT
                                    tb_kunde_id
                                FROM
                                    db_kunde
                                WHERE
                                    tb_kunde_vorname = :vorname
                                        AND
                                            tb_kunde_nachname = :nachname"
            ;
                    
            $select $db->prepare($sql);
                    
            $select->bindParam(':vorname'$tb_kunde_vorname);
                    
            $select->bindParam(':nachname'$tb_kunde_nachname);
                    
            $select->execute();
                    if(
            $select->rowCount() < 1)
                        {
                            
            $client_data['tb_kunde_vorname'] = $tb_kunde_vorname;
                            
            $client_data['tb_kunde_nachname'] = $tb_kunde_nachname;
                            
            $add_client $db->insert("db_kunde",$client_data) OR die("Error: ".$db->error()."</br> Zeile ".__LINE__);
                            
            $id_kunde $db->lastInsertId();
                        }
                    else
                        {
                            
            $results $select->fetchAll(PDO::FETCH_ASSOC);
                            
            $id_kunde $results[0];
                            
            var_dump($id_kunde);
                        }
                    
            $rechnung['tb_rechnung_kunde'] = $id_kunde;
                    
            $add_rechnung $db->insert("db_rechnung",$rechnung) OR die("Error: ".$db->error()."</br> Zeile ".__LINE__);
                } 
            klasse.php
            PHP-Code:
                class Database extends PDO {

                    public function 
            __construct($DB_TYPE$DB_HOST$DB_NAME$DB_PASS$DB_USER){
                        
            parent::__construct($DB_TYPE.":host=".$DB_HOST.';dbname='.$DB_NAME.";charset=utf8"$DB_USER$DB_PASS);
                    }

                    public function 
            select($sql$array = array(), $fetchMode PDO::FETCH_ASSOC){
                        
            $sth $this->prepare($sql);
                        foreach(
            $array as $key => $value){
                            
            $sth->bindValue($key$value);
                        }

                        
            $sth->execute();
                        return 
            $sth->fetchAll($fetchMode);
                    }

                    public function 
            insert($table$data){
                        
            //ksort($data);
                        
            $this->setAttributePDO::ATTR_ERRMODEPDO::ERRMODE_WARNING );
                        
                        
            $fieldNames implode('` , `'array_keys($data));
                        
            $fieldValues ":".implode(', :'array_keys($data));

                        
            $sth $this->prepare("INSERT INTO `".$table."` (`".$fieldNames."`) VALUES (".$fieldValues.")");

                        foreach (
            $data as $key => $value) {
                            
            $sth->bindValue(":".$key$value);
                        }

                        return 
            $sth->execute();
                    } 
            Ja ich weiß das MySQL_ API was ich verwende veraltet ist.
            Aber ich nutze diese Version nur auf meinem Rechner.

            Kommentar


            • #21
              Zitat von Germanikus Beitrag anzeigen
              Notice: Array to string conversion in ...\classes.php on line 29


              Zitat von Germanikus Beitrag anzeigen
              warenkorp.php
              klasse.php
              Fällt dir was auf?
              Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

              Kommentar


              • #22
                "Database extends PDO" -> schlecht

                PDO ist ein Verbindungsobjekt und da haben Funktionen wie select() und insert() nichts verloren. Übergib PDO an deine Instanz, aber leite nicht davon ab.

                Kommentar

                Lädt...
                X