Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP - SQL Verknüpfung funktioniert nicht wie gewollt

Einklappen

Neue Werbung 2019

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

  • PHP - SQL Verknüpfung funktioniert nicht wie gewollt

    Moin zusammen,
    ich bin gerade dabei mir ein kleines "Ticketsystem" zu schreiben, um besser in die harmonierende Ebene von PHP und MySQL einzusteigen.
    Nun habe ich das Problem das Werte in meiner Datenbank nicht verändert werden, obwohl sich meiner Meinung nach meine Query (beginnend ab case"theme") für schlüssig erklärt.
    Hierbei scheint mein Code einfach die if zu ignorieren, da sobald der Button getriggert wird, dieser die else ausführt.
    Dabei handelt es sich einfach nur darum,dass jeder User seine eigene Theme auswählen kann.
    Validiert etc. habe ich auch, dementsprechend muss es ein logischer Fehler sein der mir unterlaufen ist.
    Viel Dank im Voraus für Eure Antworten.

    PHP-Code:
    //Einstellungen
    if(isset($_GET['settings'])){
        
    $settings $_GET['settings'];
        switch(
    $settings){
            case 
    "newuser":
                echo 
    '<form action="index.php" method="post">
                        <input type="text" name="vorname" placeholder="Vorname"><br>
                        <input type="text" name="nachname" placeholder="Nachname"><br>
                        <input type="text" name="email" placeholder="E-Mail"><br>
                        <input type="password" name="password" placeholder="Passwort"><br><br>
                        <input type="submit" value="Neuen User anlegen">
                    </form>'
    ;
                break;
            case 
    "alleuser":            
                echo(
    "<b>Alle Registrierten User:<br/></b>");
                while(
    $row mysqli_fetch_array($result)){
                    echo 
    $row['vorname']." ".$row['nachname']." mit der Email <i>".$row['email']."</i><br/>";
                }
                echo(
    "<br/>");
                break;
            
    //Fehler???
            
    case "theme";
                if (
    $db->query("select * from users where vorname='$sessionvorname' and nachname='$sessionnachname' and passwort='$sessionpasswort' and theme='0'") === TRUE){

                    
    $db->query("update users set theme= '1' where vorname='$sessionvorname' and nachname='$sessionnachname' and passwort='$sessionpasswort' and theme='0'");
                    echo 
    '<body style="background-color:black";>';
                }
                else{
                    
    $db->query("update users set theme= '0' where vorname='$sessionvorname' and nachname='$sessionnachname' and passwort='$sessionpasswort and theme='1'");
                    echo 
    '<body style="background-image:linear-gradient(to right, #2c3e50, #fd746c)">';
                }
                break;
            case 
    "killmysession":
                
    session_destroy();
                echo 
    "erfolgreich ausgeloggt";
        }


  • #2
    Also wenn dein IF nicht greift, dann ist die Bedingung halt false. Du kannst dir die Bedingung einfach mal mit var_dump ausgeben und das hier mit abgleichen:

    http://php.net/manual/de/types.comparisons.php

    Und benutz mal Prepared Statements, sonst löscht dir irgendwer die Datenbank.
    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

    Kommentar


    • #3
      lasse das mal weg
      PHP-Code:
      === TRUE 

      Kommentar


      • #4
        Zitat von protestix Beitrag anzeigen
        lasse das mal weg
        PHP-Code:
        === TRUE 
        Wenn ich das weglasse wird der Hintergrund wie zu erwarten schwarz, in der Datenbank tut sich jedoch immer noch nichts :/

        Kommentar


        • #5
          Zitat von chorn Beitrag anzeigen
          Also wenn dein IF nicht greift, dann ist die Bedingung halt false. Du kannst dir die Bedingung einfach mal mit var_dump ausgeben und das hier mit abgleichen:

          http://php.net/manual/de/types.comparisons.php

          Und benutz mal Prepared Statements, sonst löscht dir irgendwer die Datenbank.
          Danke für den Tipp, aus dem var_dump werde ich zwar noch nicht allzu schlau aber das ist aller Anfang. In Prepared Statements muss ich mich noch einmal einarbeiten, bin wie gesagt noch am Anfang was SQL etc angeht

          Kommentar


          • #6
            Du fragst halt auch nach keinen Fehler oder sowas ab. https://php-de.github.io/jumpto/sql/

            Und auch davor schon.. was ist in $sessionvorname? Lass es dir ausgeben, ist da wirklich drinnen was du vermutest.. https://php-de.github.io/jumpto/faq/#debugging

            Dann Query ausgeben lassen - siehe Link oben und so weiter Schritt für Schritt den Code im Detail nachverfolgen. irgendwann findest du den Grund und damit auch den Fehler und dann hast du meinstens auch schon die Lösung.

            Und SELECT * ist pfui. Zähle die Felder immer auf, die du auch wirklich im Ergebnis haben willst. Du willst alle? Dann zähl auch alle auf.
            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


            • #7
              Zitat von hausl Beitrag anzeigen
              Du fragst halt auch nach keinen Fehler oder sowas ab. https://php-de.github.io/jumpto/sql/

              Und auch davor schon.. was ist in $sessionvorname? Lass es dir ausgeben, ist da wirklich drinnen was du vermutest.. https://php-de.github.io/jumpto/faq/#debugging

              Dann Query ausgeben lassen - siehe Link oben und so weiter Schritt für Schritt den Code im Detail nachverfolgen. irgendwann findest du den Grund und damit auch den Fehler und dann hast du meinstens auch schon die Lösung.

              Und SELECT * ist pfui. Zähle die Felder immer auf, die du auch wirklich im Ergebnis haben willst. Du willst alle? Dann zähl auch alle auf.
              Danke für deine Antwort. Ich probiere halt die Daten vorerst in Sessions zu speichern, siehe:
              PHP-Code:
              //Check-In
              if(isset($_POST['vname_in'])&&isset($_POST['nname_in'])&&isset($_POST['pass_in'])){
                  
              $vname mysqli_real_escape_string($db$_POST["vname_in"]);
                  
              $nname mysqli_real_escape_string($db$_POST["nname_in"]);
                  
              $pass mysqli_real_escape_string($db$_POST["pass_in"]);    

                  if(
              mysqli_num_rows($result) > 0){
                      echo 
              "angemeldet als: ".mysqli_fetch_array($result)['vorname'];
                      if (
              $db->query("update users set check_in=CURRENT_TIMESTAMP where vorname='$vname' and nachname='$nname' and passwort='$pass'") === TRUE) {
                      echo 
              "<br/>Check-In Erfolgreich<br>";

                      echo 
              '<form action="https://privat.me">
                          <input type="submit" value="zurück" />
                          </form>'
              ;
                          
              $currentuserv=$_POST['vname_in'];
                          
              $currentusern=$_POST['nname_in'];
                          
              $currentuserp=$_POST['pass_in'];
                          
              $_SESSION['sessionvorname'] = $currentuserv;
                          
              $_SESSION['sessionnachname'] = $currentusern;
                          
              $_SESSION['sessionpasswort'] = $currentuserp;
                          echo 
              "Hallo ".$currentuserv." ".$currentusern." Du wurdest erfolgreich eingeloggt<br>";
                          
              $sessionvorname $_SESSION['sessionvorname'];
                          
              $sessionnachname $_SESSION['sessionnachname'];
                          
              $sessionpasswort $_SESSION['sessionpasswort'];
                      } else {
                      echo 
              "Error: <br>" $db->error;
                      }
                  }else{
                      echo 
              "Falsche Zugangsdaten.";
                  }


              Demzufolge erschließt sich mir der Fehler irgendwie noch nicht so ganz...

              EDIT: Ich weiß auch das der Check-In noch nicht das bezweckt, was es am Ende werden soll, hier geht es jedoch nur um die Sessions ^^

              Kommentar


              • #8
                PHP-Code:
                        case "theme"
                Augen auf! Das ist ein Semikolon, kein Doppelpunkt!
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #9
                  Die ganze If Prüfung stimmt schon nicht.
                  query() liefert bei einem select immer(!) ein Resultat zurück, auch wenn keine eine Einträge gefunden wurden.
                  Wenn ein Fehler aufgetreten ist wird natürlich kein Ergebniss zurück geliefert.

                  Du musst die select Abfrage aus dem If rausnehmen und dann die Anzahl der gefundenen Datensätze prüfen im If.

                  Das dürfte dann wohl der gewünschten Logik entsprechen.

                  ​​​​​​
                  darueber hinaus solltest du die Abfrage nicht mit Namen und Passwort gestalten sondern eher mit einer Id (Primary Key)

                  Kommentar


                  • #10
                    Alternativvorschlag
                    erst aktualisieren, dann den Zustand auslesen.

                    PHP-Code:
                    <?PHP //...

                    case "theme";
                        
                    // Todo Werte in SQL Statements mit real escape Strings versehen oder prepated Statements verwenden
                        // Todo Empfehlung - User ID statt kombination von Einzelwerten des Datensatzes verwenden zur identifizierung

                    ​      $db->query("update users set theme= If(theme='1', '0', '1') where vorname='$sessionvorname' and nachname='$sessionnachname' and passwort='$sessionpasswort'");
                    // Todo SQL Error handling


                    $result $db->query("select theme from users where vorname='$sessionvorname' and nachname='$sessionnachname' and passwort='$sessionpasswort'");
                    // Todo SQL Error handling

                    If($result->num_rows === 1)
                    {
                        
                    $row $result->fetch_assocc();
                        If( 
                    $row['theme'] === '1')
                        {
                            echo 
                    '<body style="background-color:black";>';
                        }
                        Else
                        {
                            echo 
                    '<body style="background-image:linear-gradient(to right, #2c3e50, #fd746c)">';
                      }
                    }
                    Else 
                    {
                        
                    // Unexpected Data      // Es wurde kein User oder gleich mehrere gefunden, was beides nicht sein sollte
                        // Todo Error handling
                        
                    Echo '<Body>';
                    }
                      break;

                    PS: ich schreib gerade von unterwegs, daher bitte die mäßige Formatierung entschuldigen. Code ist nicht getestet.

                    Kommentar

                    Lädt...
                    X