Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT-Abfrage funktioniert nicht

Einklappen

Neue Werbung 2019

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

  • SELECT-Abfrage funktioniert nicht

    Ein Wunderschönen,

    ich sitze seit mehreren Tagen an folgendem Problem und hoffe mit eurer Hilfe endlich eine Lösung zu finden:

    Für meine Webseite soll es ein einfach Accountsystem geben, so wie man es kennt. Habe alles programmiert und hat lokal auch wunderbar funktioniert. Nun habe ich alles auf einen Strato-Server hochgeladen und seitdem funktioniert das auslesen mittels SELECT nicht mehr. INSERT und UPDATE funktionieren wiederum wunderbar. Ich habe ne Menge recherchiert, versucht und gebastelt, nichts hilft. Strato selber konnte mir sowohl telefonisch als auch schriftlich nicht weiterhelfen.

    Ich bin noch recht frisch im PHP/SQL-Universum daher übersehe ich womöglich grundlegendes Wissen.

    Als erstes der Verbindungsaufbau zur Datenbank (mit Platzhaltern):
    PHP-Code:
      <?php  
    session_start
    ();  
    error_reporting(-1);
    ini_set('display_errors'1);
    define ("ZEILENUMBRUCH""\r\n");   
    $db = new mysqli('rdbms.strato.de','benutzer','passwort','Datenbank');

    if(
    $db->connect_errno) {      
         die(
    'Keine Verbindung zum Server');
     }
    Dann auf der Seite zum Registrieren die Überprüfung, ob die eingegebene E-Mail schon in der DB ist (funktioniert nicht):

    PHP-Code:
     $mail "";    
     if (isset(
    $_POST['mail'])) {        
         
    $mail trim($_POST['mail']);    
     }          

     
    $erstellt date("Y-m-d H:i:s");    
     
    $kontrollzahl random_int (100000000999999999);            

     
    $login $db->prepare("SELECT mail FROM users WHERE mail=? ");    
     
    $login->bind_param('s',$mail);    
     
    $login->execute();    
     
    $login->bind_result($mail);              
     while (
    $login->fetch()) {                
      }

     if (  
    $login->num_rows == ) {        
         
    header('Location: register.php?aktion=vergeben');        
         die();                  
     } 
    Falls nicht, wird eine Authentifizierungsmail verschickt und die Eingaben in die DB eingetragen (inkl. Backup)(funktioniert):

    PHP-Code:
     if($email->send()){            
         
    $erfolg true;              
         
    $einfuegen $db->prepare("INSERT INTO users (username, passwort, mail, s_zugang, g_zugang, erstellt, auth_code, auth)  
                                                 VALUES (?, ?, ?, 0, 0, NOW(), 
    $kontrollzahl, 0)");            
         
    $einfuegen->bind_param('sss'$username$password$mail);            
         if (
    $einfuegen->execute()) {                
             
    $einfuegen2 $db->prepare("INSERT INTO backup (username, passwort, mail, s_zugang, g_zugang, erstellt, auth_code, auth)                                        
                                                       VALUES (?, ?, ?, 0, 0, NOW(), 
    $kontrollzahl, 0)");                
             
    $einfuegen2->bind_param('sss'$username$password$mail);      
               if (
    $einfuegen2->execute()) {                                      
               }                                  
               else {                          
                     
    $fehlschlag true;              
               }                                  
           }        
     }  

     else {      

       
    $ungueltig true;      
     } 
    Über den Link in der E-Mail gelangt man dann zu einer anderen Seite, welche die Echtheit des Links überprüft und dann die Spalte "auth" in der Datenbank auf 1 (funktioniert) setzt für "authentifiziert".

    PHP-Code:

     if ( $mail == $_GET['mail'] AND $kontrollzahl == $_GET['id']) {    
                 $update = $db->prepare("UPDATE users SET auth = 1 WHERE mail=? LIMIT 1");    
                 $update->bind_param('s', $_GET['mail']);    
                 if ($update->execute()) {                  
                         ?>        
                         <div class="text_box_one_liner">E-Mail wurde authentifiziert</div>      
                         <?php    
                  
    }
     }
    Ich habe mir schon alles erdenklich ausgeben lassen aber da meine Kenntnisse begrenzt sind, hilft mir das nur bedingt weiter. Jedenfalls scheint die Problematik in den folgenden Zeilen zu stecken.

    PHP-Code:
          $login $db->prepare("SELECT mail FROM users WHERE mail=? ");    
          
    $login->bind_param('s',$mail);    
          
    $login->execute(); 
    Wenn ich mir $login danach ausgeben lassen, kommt immer affected-rows-> -1, was meinen Recherchen nach bedeutet, dass die SQL-Abfrage nicht geklappt hat.
    Über den Strato Error-Logfile wird mir kein Fehler ausgegeben, das Programm macht weiter, als wenn die E-Mail noch nicht in der DB wäre, was sie aber definitiv ist.

    Dasselbe Spiel auf der Seite zum Einloggen, die DB wird nicht korrekt ausgelesen, sprich ich kann mich nicht einloggen.


  • #2
    mach Dich schlau wie der INSERT-Befehl richtig heißt ...
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Huch, falls sich das auf INSERTINTO bezieht, bei meinem Code ist da ein Leezeichen zwischen.

      Kommentar


      • #4
        Wenn du Deinen Beitrag editierst hats oben dran so einen PHP-Knopf, kannst du mal all den Code in solche Blöcke packen damit man das besser lesen kann?

        Kommentar


        • #5
          Sorry, schwere Geburt aber habs endlich

          Kommentar


          • #6
            Ganz am Anfang:

            PHP-Code:
                                        mysqli_report(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT); 
            Und anschliessend mysqli_error() benutzen um Dir den Fehler ausgeben zu lassen:
            https://www.php.net/manual/de/mysqli.error.php

            Kommentar


            • #7
              Ich geb das vorsichtshalber aus, falls ich was falsch gemacht habe. Am Anfang:

              PHP-Code:
              mysqli_report(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);  
              $db = new mysqli('rdbms.strato.de','benutzer','passwort','Datenbank');

              if(
              $db->connect_errno) {      
                   die(
              'Keine Verbindung zum Server');
               } 
              und dann

              PHP-Code:
              if ( ! $mysqli->query("SELECT mail FROM users WHERE mail=?")) {
                  
              printf($mysqli->error());

              dann kommt folgendes:

              Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1 in /mnt/web518/d1/47/510652847/htdocs/register.php:122 Stack trace: #0 /mnt/web518/d1/47/510652847/htdocs/register.php(122): mysqli->query('SELECT mail FRO...') #1 {main} thrown in /mnt/web518/d1/47/510652847/htdocs/register.php on line 122

              So richtig werde ich daraus aber nicht schlau, zumal das "manual" zu MySQL 5.6 riesig ist.

              Kommentar


              • #8
                Das muss ja ein Fehler ergeben, weil du query mit einem Platzhalter verwendest.

                Kommentar


                • #9
                  In meinem Code stehen da die richtigen Werte, ich habe das hier nur so wegen dem Passwort gepostet.

                  Kommentar


                  • #10
                    Was denn für ein Passwort.

                    Die Fehlermeldung sagt dir doch wo der Fehler steckt

                    Code:
                    ...to use near '?' at line 1...
                    Beim Fragezeichen, und komm jetzt nicht wieder mit irgendwelchen anderen Ausreden.

                    Kommentar


                    • #11
                      Ah, sorry, missverstanden. Ich hatte das schon wie folgt, nur die "db" hier falsch eingegeben:

                      PHP-Code:
                      mysqli_report(MYSQLI_REPORT_ERROR MYSQLI_REPORT_STRICT);  
                      $mysqli = new mysqli('rdbms.strato.de','benutzer','passwort','Datenbank');

                      if(
                      $mysqli->connect_errno) {      
                           die(
                      'Keine Verbindung zum Server');
                       } 
                      PHP-Code:
                      if ( ! $mysqli->query("SELECT mail FROM users WHERE mail=?")) {
                          
                      printf($mysqli->error);

                      Fehlermeldung bleibt die Selbe.

                      Kommentar


                      • #12
                        Wenn ich es so mache

                        PHP-Code:

                        if( ! $mysqli->query("SELECT mail FROM users WHERE id=1")) {
                            
                        printf($mysqli->error)

                        gibt er zwar keine Fehlermeldung aus aber für meine ursprüngiche SELECT Abfrage brauch ich doch ein "mail=?"

                        Kommentar


                        • #13
                          Wenn du Prepared Statements verwenden willst, darfst du keine Queries benutzen.

                          Kommentar


                          • #14
                            Bin ich hiermit auf dem richtigen Weg?

                            PHP-Code:
                            $mail "";
                            if (isset(
                            $_POST['mail'])) {
                                    
                            $mail trim($_POST['mail']);
                            }

                            if (!(
                            $stmt $mysqli->prepare("SELECT mail FROM users WHERE mail=?"))) {
                                echo 
                            "Prepare failed: (" $mysqli->errno ") " $mysqli->error;
                            }

                            if (!
                            $stmt->bind_param("s"$mail)) {
                                    echo 
                            "Binding parameters failed: (" $stmt->errno ") " $stmt->error;
                            }

                            if (!
                            $stmt->execute()) {
                                echo 
                            "Execute failed: (" $stmt->errno ") " $stmt->error;
                            }

                            var_dump($stmt); 
                            Falls ja, gibt er mir zwar keine Fehler aus aber $stmt hat nach wie vor keine Rows:

                            object(mysqli_stmt)#2 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(1) ["field_count"]=> int(1) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["sqlstate"]=> string(5) "00000" ["id"]=> int(1) }

                            Kommentar


                            • #15
                              Zitat von Bracko Beitrag anzeigen
                              Falls ja, gibt er mir zwar keine Fehler aus aber $stmt hat nach wie vor keine Rows:
                              Laut Handbuch funktioniert mysqli_stmt::$affected_rows nicht bei SELECT (im Gegensatz zu mysqli::$affected_rows), es wird auf mysqli_stmt::$num_rows verwiesen - bist du ganz sicher dass es einen Datensatz mit der angegebenen E-Mailadresse gibt? Nein, nicht "ja" schreiben, nachschauen!

                              Kommentar

                              Lädt...
                              X