Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankabfrage

Einklappen

Neue Werbung 2019

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

  • Datenbankabfrage

    Moin Leute!

    Ich habe folgendes Problem:
    Momentan arbeite ich an einer Datenbank zum Registrieren. Wenn ich jedoch die Datenbank abfrage, ob email und/oder benutzername bereits vergeben sind, komme ich zu dieser Fehlermeldung:

    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\regis1.php on line 26
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\regis1.php on line 27

    Mein Code für die betreffenden Zeilen sieht wie folgt aus:
    PHP-Code:
    $result $statement->execute(array('email' => $email));
    $result $statement->execute(array('benu' => $benu)); 
    Anbei noch eine Frage, wenn ich im folgenden Block
    PHP-Code:
    if(isset($_POST['absenden'])) {
        
    $error false;
        
    $benu $_POST['benu'];
        
    $email $_POST['email'];
        
    $psw $_POST['psw'];
        
    $psw1 $_POST['psw1']; 
    POST durch GET ersetze, werden nichtmal mehr die Zuordnungen für (benu,email etc) erkannt. Kann mir jemand sagen wieso?

    PS: Ich bin Anfänger, bitte seid gnädig.

    MfG

  • #2
    Zeige doch mal den ganzen Code und nicht Teile daraus, so dass man sich ein gesamtes Bild machen kann.
    Das Warning sagt dir das die Anzahl der Parameter nicht stimmt.

    Ob das so sein muss kann ich nicht sagen ist nur eine Vermutung:
    PHP-Code:
    $result $statement->execute(array(':benu' => $benu':email' => $email)); 
    Den Doppelpunkt muss du im Prepare Teil dann auch anwenden.
    In der Wissenssammlung findest du darüber hinaus noch weitere Beispiele.

    Es ist zudem besser lesbar wenn deine Variablenbezeichner nicht so kryptisch aussehen würden.
    Ausserdem solltest du nicht Englisch und Deutsch (email <> absenden) vermischen. Verwende also besser eine Sprache durchgängig, am besten natürlich Englisch.

    GET und POST kann man nicht einfach austauschen, das sind verschiedene Übertragungskonzepte.
    PHP-Code:
    <form action="foo.php" method="post"
    überträgt die Daten per POST
    PHP-Code:
    <form action="foo.php" method="get"
    überträgt die Daten per GET, sie sind dann in der URL im Empfängerscript sichtbar.

    Kommentar


    • #3
      Danke für die schnelle Hilfe,

      hier der gesamte code mit durchgehend englishen Begriffen:

      PHP-Code:
      <?php
      session_start
      ();
      $pdo = new PDO('mysql:host=localhost;dbname=datenbank''root''');
      if(isset(
      $_POST['send'])) {

          
      $error false;
          
      $username $_POST['username'];
          
      $email $_POST['email'];
          
      $password $_POST['password'];
          
      $password1 $_POST['password1'];

          if(!
      filter_var($emailFILTER_VALIDATE_EMAIL)) {
              echo 
      'Bitte eine gültige E-Mail-Adresse eingeben<br>';
              
      $error true;
          }
          if(
      strlen($password) == 0) {
              echo 
      'Bitte ein Passwort angeben<br>';
              
      $error true;
          }
          if(
      $password != $password1) {
              echo 
      'Die Passwörter müssen übereinstimmen<br>';
              
      $error true;
          }

          if(!
      $error) {
              
      $statement $pdo->prepare("SELECT * FROM benutzer WHERE email = :email");
              
      $statement $pdo->prepare("SELECT * FROM benutzer WHERE username = :username");
              
      $result $statement->execute(array(':username' => $username));
              
      $result $statement->execute(array(':email' => $email));
              
      $user $statement->fetch();
              
      $user1 =$statement->fetch();

              if(
      $user !== false) {
                  echo 
      'Diese E-Mail-Adresse ist bereits vergeben<br>';
                  
      $error true;
                }
                if(
      $user1 !== false){
                  echo 
      'Dieser Benutzername ist bereits vergeben<br>';
                  
      $error true;
                }
          }

          if(!
      $error) {
              
      $passwort_hash password_hash($passwordPASSWORD_DEFAULT);

              
      $statement $pdo->prepare("INSERT INTO benutzer (email, pasword) VALUES (:email, :password)");
              
      $result $statement->execute(array('email' => $email'password' => $passwort_hash));

              if(
      $result) {
                  echo 
      'Du wurdest erfolgreich registriert.';
              } else {
                  echo 
      'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
              }
          }
      }
      ?>
      Habe deinen Tipp versucht, aber es hat nicht funktioniert. Ich vermute, dass ich irgendwo einen lächerlichen Fehler drin habe, finde ihn aber nicht -.-

      Kommentar


      • #4
        Bei deiner Datenbank-Verbindung fehlt die Zeichensatzangabe. Wenn du dazu noch die Fehlerausgabe aktivierst, werden dir auch bei eingeschultem Error-Reporting resultierende Fehler mit ausgegeben.
        PHP-Code:
        $options = [
            
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
            
        PDO::ATTR_EMULATE_PREPARES => false
        ];
        $pdo = new PDO('mysql:host=localhost;dbname=datenbank;charset=utf8''root'''$options); 
        Ein mal Password reich eigentlich, auch beim Eingabeformular.

        Hier überschreibst du die Variable $statement mit der zweiten Zuweisung.
        PHP-Code:
         $statement $pdo->prepare("SELECT * FROM benutzer WHERE email = :email");
         
        $statement $pdo->prepare("SELECT * FROM benutzer WHERE username = :username"); 
        SELECT * ist unnötig hier, wenn du eine id hast nimm die.
        Besser
        PHP-Code:
        if( !$error ) {
                
        $statement $pdo->prepare("SELECT `id` FROM benutzer WHERE email = :email");
                
        $result $statement->execute(array(':email' => $email));

                if( 
        $statement->fetch() ) {
                    echo 
        'Diese E-Mail-Adresse ist bereits vergeben<br>';
                    
        $error true;
                }

                
        $statement $pdo->prepare("SELECT 'id` FROM benutzer WHERE username = :username");
                
        $result $statement->execute(array(':username' => $username));

                if( 
        $statement->fetch() ) {
                    echo 
        'Dieser Benutzername ist bereits vergeben<br>';
                    
        $error true;
                }
            } 
        Die echos solltest du durch eine Variable ersetzen, sonst hast du mitten im Script ausgaben. zum Testen kann man das noch durchgehen lassen, aber später solltest du das ändern und dich mit dem EVA-Prinzip befassen.

        PHP-Code:
        $statement $pdo->prepare("INSERT INTO benutzer (email, pasword) VALUES (:email, :password)");f
        $result 
        $statement->execute(array('email' => $email'password' => $passwort_hash)); 
        Hier fehlen in der 2. Zeile die Doppelpunkte vor email und password, das sind Arrayschlüssel die müssen genau so heissen, wie im prepare Statement angegeben.

        Du kannst in deinem Formular das Attribut requred verwenden um sicher zu stellen, das der Benutzer Eingabefelder nicht leer lässt, dann sparst du dir folgendes
        PHP-Code:
        if(strlen($password) == 0) {
                echo 
        'Bitte ein Passwort angeben<br>';
                
        $error true;
            } 
        Das man Eingaben dennoch misstrauen sollte und auf Validität prüfen ist davon unberührt.

        Probier mal wie weit du mit diesen Hinweisen voran kommst.

        Kommentar


        • #5
          Also der Code sieht nun so aus:
          PHP-Code:
          <?php
          session_start
          ();
          $options = [
              
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
              
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
              
          PDO::ATTR_EMULATE_PREPARES => false
          ];
          $pdo = new PDO('mysql:host=localhost;dbname=datenbank''root'''$options);

          if(isset(
          $_POST['send'])) {

              
          $error false;
              
          $username $_POST['username'];
              
          $email $_POST['email'];
              
          $password $_POST['password'];
              
          $password1 $_POST['password1'];

              if(!
          filter_var($emailFILTER_VALIDATE_EMAIL)) {
                  echo 
          'Bitte eine gültige E-Mail-Adresse eingeben<br>';
                  
          $error true;
              }
              if(
          strlen($password) == 0) {
                  echo 
          'Bitte ein Passwort angeben<br>';
                  
          $error true;
              }
              if(
          $password != $password1) {
                  echo 
          'Die Passwörter müssen übereinstimmen<br>';
                  
          $error true;
              }

              if(!
          $error) {
                  
          $statement $pdo->prepare("SELECT 'id' FROM benutzer WHERE email = :email");
                  
          $result $statement->execute(array(':email' => $email));

                  if(
          $statement->fetch()){
                    echo 
          "Diese E-Mail-Adresse wird bereits benutzt<br>";
                    
          $error true;
                  }

                  
          $statement $pdo->prepare("SELECT 'id' FROM benutzer WHERE username = :username");
                  
          $result $statement->execute(array(':username' => $username));

                  if(
          $statement->fetch()) {
                    echo 
          "Dieser Benutzername ist bereits vergeben<br>";
                    
          $error true;
                  }
              }

              if(!
          $error) {
                  
          $passwort_hash password_hash($passwordPASSWORD_DEFAULT);

                  
          $statement $pdo->prepare("INSERT INTO benutzer (username, email, password) VALUES (:username, :email, :password)");
          /* Zeile 53 */        $result $statement->execute(array(':username' => $username':email' => $email':password' => $passwort_hash));

                  if(
          $result) {
                      echo 
          'Du wurdest erfolgreich registriert.';
                  } else {
                      echo 
          'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
                  }
              }
          }
          ?>
          Nun kommt die Fehlermeldung: Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY' in C:\xampp\htdocs\regis1.php:53 Stack trace: #0 C:\xampp\htdocs\regis1.php(53): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\regis1.php on line 53

          Es tut mir leid, aber ich kann nicht sagen, was ich falsch gemacht habe..

          Kommentar


          • #6
            Stell mal in deiner Tabelle den Primary Key auf auto increment.
            Ohne verwendet er immer 0 wenn der nicht angeben wird oder eben den Default Wert.

            Kommentar


            • #7
              1000 Dank für deine Hilfe!
              Frohes Fest!

              Kommentar


              • #8
                Noch ein letzter Tipp. Warum hast du bei der Verbindung mit PDO den Zeichensatz wieder raus genommen?
                So hatte ich es vorgegeben
                PHP-Code:
                $pdo = new PDO('mysql:host=localhost;dbname=datenbank;charset=utf8''root'''$options); 
                Bei dir fehlt das charset=utf8

                Du solltest immer utf8 verwenden, wenn du keine Probleme mit Sonderzeichen und Umlauten riskieren willst.

                Kommentar

                Lädt...
                X