Ankündigung

Einklappen
Keine Ankündigung bisher.

Funktion zum laufen bringen

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

  • #16
    Wenn du jetzt noch den Schalter PHP im Editor hier verwenden würdest anstatt den Code mit den Zitat-Tags einzufügen wäre er leichter lesbar.
    Erledigt

    Die meisten User geben den Container-Code in Kleinbuchstaben ein, womit du dann einen Fehler erhältst.
    Ich würde es mit strtoupper auf Grossbustaben bringen, bevor ich es an die Funktion checkDigit übergebe.
    Ausserdem solltest du prüfen ob die Parameter auch vom Formular kommen.
    Hatte mir die Problemstellung für heute aufgespart, aber da du eine für mich neue Funktion gezeigt hast nehme ich diese gerne an.

    Auf mysqli hast du schon weiter oben hingewiesen und auf dieses habe ich danach auch sofort gewechselt.

    Das EVA-Prinzip schaue ich mir auch heute mal an.


    Ich danke vielmals!

    Unten findest du meinen aktuellen PHP-Code. Bin auch soweit fast fertig. Werde nur noch beim abspeichern der Daten den Usernamen mit hinzufügen, damit man nachvollziehen kann, welcher User welchen Eintrag getätigt hat.
    Natürlich noch ein paar Feinarbeiten, ein paar bessere Einrückungen und Kommentare, welche ich auch noch erledigen muss.

    Am Ende kann ich dann die fertige Datei gerne auch wieder hochladen.


    PHP-Code:
    <?php

    include("config.php");
    session_start();

     if(!isset(
    $_SESSION['user'])) {
        die(
    'Bitte zuerst <a href="index.php">einloggen</a>');

    }


    $mark strtoupper($_POST['cn']);
    $kzzname $_POST['kzname'];
    $kzznummer $_POST['kznummer'];
    $kennzeichen =$kzzname.$kzznummer;

             function 
    checkDigit($mark){
                     
    $char2num = array('A'=>10'B'=>12'C'=>13'D'=>14'E'=>15,
                                       
    'F'=>16'G'=>17'H'=>18'I'=>19'J'=>20'K'=>21'L'=>23,
                                       
    'M'=>24'N'=>25'O'=>26'P'=>27'Q'=>28'R'=>29'S'=>30,
                                       
    'T'=>31'U'=>32'V'=>34'W'=>35'X'=>36'Y'=>37'Z'=>38);

                     
    $acc=0;
                     
    $num=str_split($mark);
                     for(
    $i=0;$i<10;$i++){
                             if(
    $i<4$acc+=($char2num[$num[$i]]*pow(2,$i));
                             else 
    $acc+=$num[$i]*pow(2,$i);
                     }
                     
    $rem $acc 11;
                             if (
    $rem == 10$rem 0;
                     return (
    strlen($mark)==11 &&amp$num[10]==$rem);


             }


    if(
    checkDigit($mark)==1) {
        echo 
    "Kennzeichen: $kennzeichen <br />";
        echo 
    "Containernummer: $mark  <--- Richtig!<br /><br />";

        
    $eintragen mysqli_query($db"INSERT INTO container (containernr, kennzeichen, datum) VALUES ('$mark', '$kennzeichen', NOW())");

        if (!
    $eintragen)
            echo 
    "Hat nicht geklappt die Daten zur Datenbank zu senden!";
        else {
            echo 
    "Daten wurden erfolgreich gesendet. <br/> Du wirst gleich weitergeleitet auf die Loginseite!";
            
    session_destroy();
                     ?&
    gt;
                    &
    lt;SCRIPT>
                            
    setTimeout("window.location.href='index.php'",5000);
                    &
    lt;/SCRIPT>
                    &
    lt;?php
        
    }



    }
    else
    {
        echo 
    "Containernummer falsch. Bitte richtige Daten eingeben!";
                    ?&
    gt;
                    &
    lt;SCRIPT>
                            
    setTimeout("window.location.href='ok.php'",1500);
                    &
    lt;/SCRIPT>
                    &
    lt;?php
    }


    ?&
    gt

    Kommentar


    • #17
      Der Code sieht doch schon viel übersichtlicher aus.
      die > < nerven -aber gut.
      PHP-Code:
      $mark strtoupper($_POST['cn']);
      $kzzname $_POST['kzname'];
      $kzznummer $_POST['kznummer']; 
      hier lohnt sich sicher noch abzufragen, ob überhaupt etwas oder alles eingetragen wurde,
      PHP-Code:
       isset($_POST['cn']); 
      bspw.

      Kommentar


      • #18
        Zitat von tomBuilder Beitrag anzeigen
        Der Code sieht doch schon viel übersichtlicher aus.
        die > < nerven -aber gut.
        PHP-Code:
        $mark strtoupper($_POST['cn']);
        $kzzname $_POST['kzname'];
        $kzznummer $_POST['kznummer']; 
        hier lohnt sich sicher noch abzufragen, ob überhaupt etwas oder alles eingetragen wurde,
        PHP-Code:
         isset($_POST['cn']); 
        bspw.
        Die Funktion zur Kontrolle des Prüfziffers fängt dieses schon ab. "echo "Containernummer falsch. Bitte richtige Daten eingeben!";" kommt unter anderem, wenn kein Containernummer angegeben worden ist oder es nicht komplett eingetragen worden ist .

        Die &gt, etc. sind im Code auch nicht vorhanden. Ich habe anscheinend gestern Abend vergessen meine Nachricht zu senden und es heute bemerkt und die Nachricht vom Zwischenspeicher aus gesendet, welches mit den Zeichen war.

        Kommentar


        • #19
          Hallo nochmal zusammen,

          ich habe leider wieder ein Problem. Das Programm funktioniert an sich mit dem PC und in der mobile Ansicht auf Android, aber auf IOS funktioniert es leider nicht und ich suche den Grund. Ich vermute wegen der Session so wie ich es auf englischen Seiten bisschen gelesen habe, aber ich hoffe Ihr könnt mir Tipps geben oder einen Link wo ich dieses Probleme nachschlagen kann.

          Es kommt bei IOS die Meldung von ok.php, das man sich bitte zuerst einloggen muss.

          Login Daten werden von index.php an folgende Datei gesendet wo die Eingabe überprüft wird und anschließend an die untere Datei gesendet.

          ICh bedanke mich für alle Tipps und Kritik!


          PHP-Code:
          <?php
                   session_start
          ();

                   include(
          "config.php");


                  
          $name $_POST['username'];
                  
          $pw $_POST['password'];

                  if(
          $name == "" || $pw == "")
                  {
                          
          ?>
                          <SCRIPT>
                                  setTimeout("window.location.href='index.php'",0);
                          </SCRIPT>
                          <?php
                  
          }


                  
          $state1 false;
                  
          $state2 false;

                  
          $auslesen_der_user mysqli_query($db"SELECT * FROM login");
                  while(
          $row mysqli_fetch_row($auslesen_der_user))
                  {
                          
          $name2 $row['1'];
                          if(
          $name2 == $name)
                          {
                                  
          $state1 true;
                                  break;
                          }
                  }
                  
          $auslesen_der_user2 mysqli_query($db,"SELECT * FROM login WHERE user = '$name2'");
                  while(
          $row mysqli_fetch_row($auslesen_der_user2))
                  {
                          
          $pw2 $row['2'];
                          if(
          $pw2 == $pw)
                          {
                                  
          $state2 true;
                                  break;
                          }
                  }


                  if(
          $state1 == true && $state2 == true)
                  {
                     
          $_SESSION["user"] = $name;
                                    
          ?>
                          <SCRIPT>
                                  setTimeout("window.location.href='ok.php'",1000);
                          </SCRIPT>
                          <?php

                  
          }
                  else {
                  
          $_SESSION["user"] = "";
                  echo 
          '<table align="center"><tr><td>';
                  echo 
          "Falsche Eingabe. Bitte richtige Login-Daten verwenden!</td></tr></table>" ;
                   
          ?>
                          <SCRIPT>
                                  setTimeout("window.location.href='index.php'",2000);
                          </SCRIPT>
                          <?php


                  
          }

          ?>
          PHP-Code:
          <?php

          include("config.php");
          session_start();



           if(!isset(
          $_SESSION['user'])) {
              die(
          '<table align="center"><tr><td>Bitte zuerst <a href="index.php">einloggen</a></td></tr></table>');
          }



          ?>


          <html>
          <head>
          <title>Hi</title>
                   <script type="text/javascript" src="ContainerValidator.js"></script>
          </head>
          <body>


          <form action="db.php" method="post"><table align="center">

                   <tr><td>Datum und Uhrzeit:</td>
                           <td> <?php
                                   $timestamp 
          time();
                                   
          $datum date("d.m.Y - H:i"$timestamp);
                                   echo 
          $datum;
                                
          ?> </td></tr>

                   <tr><td>Fahrzeugkennzeichen:</td>
                           <td>DO - <input type="text" name="kzname" size="1" maxlength="2">
                                   <input type="number" name="kznummer" size="2" min="1" max="9999">
                           </td></tr>

                  <!--Sendet Eingabe an untere JS, welches mit JS-Datein kommuniziert und eine Rückgabe gibt. -->
                   <tr><td><div class="content">
                          <label for="container1">Containernummer: </label></td>
                          <td><input id="container1" type="text" placeholder="TEXU4645646"  onkeyup="checkValid(this)" maxlength="11" name="cn"/></td></tr>
                          <tr><td colspan="2" align=right>
                           <span id="validator1" class="validator"></span>
                   </div>   </td></tr>


                   <tr><td colspan="2" align=right><input type="submit" value="Absenden" ></td></tr></table>
          </form>







            <SCRIPT>
                      var container1 = document.getElementById('container1');
                      var validator1 = document.getElementById('validator1');

                      function getValidatorMessage(validator, containerNo){
                          var isvalid     = validator.isValid(containerNo);
                          var valMsgs     = validator.getErrorMessages();
                          var valMsgsTxt  = valMsgs.join(', ');
                          msg = isvalid;
                          if (msg == false) {
                              msg+= ' : ' + valMsgsTxt + '.';
                              if(valMsgs.indexOf('Containernummer stimmt nicht') != -1){
                              //The check digit does not match
                                //  msg+= ' Check digit must be ' + validator.createCheckDigit(containerNo.substr(0,10)) + '.';

                                //Rauskommentiert, da man ansonsten die angezeigte richtige Prüfziffer hinschreiben könnte.

                              }
                          }

                          return msg;
                      }

                      function checkValid(txt) {
                          if(txt.value != ''){
                              var validator = new ContainerValidator();
                              validator1.innerHTML = getValidatorMessage(validator, txt.value);
                          }else{
                              validator1.innerHTML = 'Bitte Containernummer eingeben!';
                          }
                      }
                      checkValid(container1);
          </script>

          </body>
          </html>

          Kommentar


          • #20
            Der Code ist ganz schön grausam...

            Validiere auch dein HTML.. Nachdem PHP am Server läuft muss es bei dir irgendwie mit dem Cleintbrowser zusammenhängen.. Ev. ist invalides HTML schon die Ursache. Check das mal. Mal nach "W3C Validator" suchen.

            Aktiviere mal die Fehlerausgabe und/ oder schau ins Logfile und behebe die Meldungen. https://php-de.github.io/jumpto/faq/#debugging

            Du vermischt Ausgabe (HTML, JS, CSS) mit der Verarbeitung. EVA beachten: https://php-de.github.io/jumpto/eva-prinzip/

            Du fragst die DB kein einziges mal ob es einen Fehler gibt. https://php-de.github.io/jumpto/sql/

            Du solltest auch dein JS in eine eigene Datei auslagern. Der Mischmach aktuell ist sehr schwer zu lesen. Ob sich da jemand findet..

            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


            • #21
              Der Code ist ganz schön grausam...
              Meinst du beide oder nur eins von denen? In Welcher Hinsicht?

              Aktiviere mal die Fehlerausgabe und/ oder schau ins Logfile und behebe die Meldungen. https://php-de.github.io/jumpto/faq/#debugging
              Werde ich mal machen bei allen Dateien.

              Du vermischt Ausgabe (HTML, JS, CSS) mit der Verarbeitung. EVA beachten: https://php-de.github.io/jumpto/eva-prinzip/
              Ich habe dies schon gelesen. Ich dachte das es soweit passt, aber anscheinend nicht. Im unteren Code wird nur Daten eingegeben und es wird durch JS eine Ausgabe erzeugt und nach Absenden wird es an die nächste Datei gesendet, wo dann die Verarbeitung stattfindet. Wie sollte ich hier vorgehen, da es meines Erachtens ja schon nach EVA ist?

              Du fragst die DB kein einziges mal ob es einen Fehler gibt. https://php-de.github.io/jumpto/sql/
              Ich habe nur im config
              PHP-Code:
                 if (mysqli_connect_errno())
                {
                echo 
              "Failed to connect to MySQL: " mysqli_connect_error();
                } 
              Ich werde aber Fehlerabfragen an den anderen Stellen auch einfügen. Dies ist mir gar nicht in den Sinn gekommen.


              Du solltest auch dein JS in eine eigene Datei auslagern. Der Mischmach aktuell ist sehr schwer zu lesen. Ob sich da jemand findet..
              Habe ich versucht, aber den Script-Abschnitt im unteren Code aus dem unteren Code hatte danach aus der ausgelagerten Datei keine Funktion mehr. Ich werde dies nochmal versuchen.


              Vielen Dank für die Kritik. Habe ja vorher auch schon geschrieben, das ich dazulernen will und meine Skills verbessern will, auch wenn es einen Start mit einem grausamen code hat

              Ich melde mich, nachdem ich die jeweiligen Punkte soweit es geht bearbeitet habe.

              Schönen Abend!

              Kommentar


              • #22
                Ich werde aber Fehlerabfragen an den anderen Stellen auch einfügen. Dies ist mir gar nicht in den Sinn gekommen.
                Da gitbs auch nen zentralen Schalter.. Siehe Link oben.
                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


                • #23
                  Guten Abend zusammen,


                  habe eventuell den Grund gefunden, weshalb die Weiterleitung nicht richtig funktioniert.
                  Die Seite ist in Strato in einem Homepage-Baukasten eingebettet und hier hat es die besagten Probleme beim iPhone.
                  Auf der eigentlichen Seite hat es diese Probleme nicht, aber diese Seite soll nicht benutzt werden. Es soll nur durch die Einbettung auf der Strato Seite benutzt werden.
                  Ist hier wegen der Einbettung eine spezielle Form von SESSION nötig, damit es auch auf dem mobilen Browser von IOS funktioniert?


                  Jetzige Stand der beiden Codes von oben:


                  PHP-Code:
                  <?php
                          session_start
                  ();
                          
                  error_reporting(-1);
                          
                  ini_set('display_errors'true);
                           include(
                  "config.php");

                           
                  ?>

                          <!DOCTYPE html>
                      <html>
                      <body>

                      <?php

                          $name 
                  $_POST['username'];
                          
                  $pw $_POST['password'];

                          if(
                  $name == "" || $pw == "")
                          {
                                  
                  ?>
                                  <SCRIPT>
                                          setTimeout("window.location.href='index.php'",0);
                                  </SCRIPT>
                                  <?php
                          
                  }


                          
                  $state1 false;
                          
                  $state2 false;



                          
                  $auslesen_der_user mysqli_query($db"SELECT * FROM login") or die(mysqli_error($db));
                          while(
                  $row mysqli_fetch_row($auslesen_der_user))
                          {
                                  
                  $name2 $row['1'];
                                  if(
                  $name2 == $name)
                                  {
                                          
                  $state1 true;
                                          break;
                                  }
                          }


                          
                  $auslesen_der_user2 mysqli_query($db,"SELECT * FROM login WHERE user = '$name2'") or die(mysqli_error($db));;
                          while(
                  $row mysqli_fetch_row($auslesen_der_user2))
                          {
                                  
                  $pw2 $row['2'];
                                  if(
                  $pw2 == $pw)
                                  {
                                          
                  $state2 true;
                                          break;
                                  }
                          }



                          if(
                  $state1 == true && $state2 == true)
                          {
                             
                  $_SESSION["user"] = $name;
                                            
                  ?>
                                  <SCRIPT>
                                          setTimeout("window.location.href='ok.php'",1000);
                                  </SCRIPT>
                                  <?php

                          
                  }
                          else {
                          
                  $_SESSION["user"] = "";
                          echo 
                  '<table align="center"><tr><td>';
                          echo 
                  "Falsche Eingabe. Bitte richtige Login-Daten verwenden!</td></tr></table>" ;
                           
                  ?>
                                  <SCRIPT>
                                          setTimeout("window.location.href='index.php'",2000);
                                  </SCRIPT>
                                  <?php


                          
                  }




                  ?>

                  </body>
                  </html>

                  PHP-Code:
                  <?php
                  session_start
                  ();
                  error_reporting(-1);
                  ini_set('display_errors'true);
                  include(
                  "config.php");



                  if (!isset(
                  $_SESSION["user"])) {
                    
                  header("Location: /Logiin/index.php");
                  exit;
                  }

                  ?>

                  <!DOCTYPE html>
                  <html>
                  <head>
                  <title>Hi</title>

                          <!--SFunktion zur Überprüfung des Containernummers-->
                           <script type="text/javascript" src="ContainerValidator.js"></script>

                  </head>
                  <body>


                  <form action="db.php" method="post"><table>

                           <tr><td>Datum und Uhrzeit:</td>
                                   <td> <?php
                                           $timestamp 
                  time();
                                           
                  $datum date("d.m.Y - H:i"$timestamp);
                                           echo 
                  $datum;
                                        
                  ?>
                                  </td>
                          </tr>



                           <tr><td>Fahrzeugkennzeichen:</td>
                                   <td>DO - <input type="text" name="kzname" size="1" maxlength="2">
                                           <input type="number" name="kznummer" size="2" min="1" max="9999">
                                   </td>
                          </tr>



                      <div class="content">
                           <tr>   <td>
                                             <label for="container1">Containernummer: </label>
                                  </td>

                                  <td>
                                      <input id="container1" type="text" placeholder="TEXU4645646"  onkeyup="checkValid(this)" maxlength="11" name="cn"/>
                                      <span id="validator1" class="validator"></span>
                                  </td>
                          </tr>
                      </div>  

                  </table>

                           <input type="submit" value="Absenden" >
                  </form>


                      <!--Für die Echtzeitausgabe des Ergebnisses-->
                      <script type="text/javascript" src="ContainerAusgeber.js"></script>


                  </body>
                  </html>

                  Kommentar


                  • #24
                    Datenbankabfragen haben in der HTML-Ausgabe nichts verloren.

                    SELECT * sollte nicht verwendet werden.

                    Variablenbenennung ist chaotisch (mal Deutsch, mal Englisch, und Nummerierung von Variablen gehört sich sowieso nicht).

                    Passwörter sollten nicht in der Datenbank gespeichert werden.

                    Die ganzen setTimeout sind Käse. JavaScript ist hier überhaupt nicht notwendig.

                    Außerdem hast du eine Sicherheitslücke (SQL-Injection).

                    Ich würde das ganze mal wegwerfen und neu schreiben.

                    Kommentar


                    • #25
                      Zitat von hellbringer Beitrag anzeigen
                      Datenbankabfragen haben in der HTML-Ausgabe nichts verloren.

                      SELECT * sollte nicht verwendet werden.

                      Variablenbenennung ist chaotisch (mal Deutsch, mal Englisch, und Nummerierung von Variablen gehört sich sowieso nicht).

                      Passwörter sollten nicht in der Datenbank gespeichert werden.

                      Die ganzen setTimeout sind Käse. JavaScript ist hier überhaupt nicht notwendig.

                      Außerdem hast du eine Sicherheitslücke (SQL-Injection).

                      Ich würde das ganze mal wegwerfen und neu schreiben.
                      Ich habe doch keine DB-Abfrage in der HTML-Ausgabe oder welches meinst du genau?
                      Vom index, wo mein Loginformular ist, wird man an das obere Datei weitergeleitet mit den Abfragen, welches dann bei übereinstimmenden Daten an das untere Datei weiterleitet.


                      Das mit Select * habe ich auch schon im WWW gestern gelesen. Dies ändere ich ab.

                      Mit der Benennung hast du recht. Dies ist mir bisher nicht aufgefallen. Wird auch abgeändert.

                      Was würdest du denn empfehlen für die Weiterleitung? header()?

                      SQL-Injection wegen des "="?

                      Wo sollte ich deiner Meinung nach lieber die Passwörter abspeichern? Das sollen nur ein paar Personen benutzen die man an der Hand abzählen kann.

                      Die ganze Kritik ist ja ok und die nehme ich gerne an, aber hat denn niemand eine Idee bzgl. des Problems mit SESSION durch Einbettung der Seite auf dem iPhone?

                      Danke und Grüße

                      Kommentar


                      • #26
                        Zitat von hisense Beitrag anzeigen
                        Ich habe doch keine DB-Abfrage in der HTML-Ausgabe
                        Als was sonst würdes Du das denn dann bezeichnen:

                        PHP-Code:
                        <!DOCTYPE html>
                            <html>
                            <body>

                            <?php

                                
                        // …
                                
                        $auslesen_der_user mysqli_query($db"SELECT * FROM login") or die(mysqli_error($db));
                        PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                        Kommentar


                        • #27
                          Zitat von hisense Beitrag anzeigen
                          Was würdest du denn empfehlen für die Weiterleitung? header()?
                          ja.
                          Zitat von hisense Beitrag anzeigen
                          SQL-Injection wegen des "="?
                          Nein, du hast keine SQL-Injektion, so wie du das machst, aber es ist sehr umständlich
                          PHP-Code:
                          $name $_POST['username'];
                          $pw $_POST['password']; 
                          Anstatt hier die Variablen bloss umzukopieren solltest du diese validieren, also auf Zeichenlänge und erlaubte Zeichen prüfen.
                          Dies lässt sich mit einem regex machen.

                          [PHP]
                          $auslesen_der_user = mysqli_query($db, "SELECT * FROM login") or die(mysqli_error($db));
                          while($row = mysqli_fetch_row($auslesen_der_user))
                          {
                          $name2 = $row['1'];

                          ...

                          $auslesen_der_user2 = mysqli_query($db,"SELECT * FROM login WHERE user = '$name2'")
                          Warum so umständlich und nicht einfach
                          PHP-Code:
                          $sql "SELECT id FROM login WHERE user='$name' AND password='$password'"
                          $result mysqli_query($db$sql);

                          $row_cnt mysqli_num_rows($result); 
                          Hier hättest du dann eine 1 als Rückgabe für num_rows wenn Name und Password gleichzeitig vorhanden sind.





                          Kommentar


                          • #28
                            Zitat von protestix Beitrag anzeigen
                            $auslesen_der_user2 = mysqli_query($db,"SELECT * FROM login WHERE user = '$name2'")
                            Hier ist die SQL-Injection-Lücke. Es wird ohne den Kontextwechsel zu beachten ein Wert in SQL-Code eingefügt.

                            Kommentar


                            • #29
                              Das dachte ich zuerst auch, aber er nimmt $name2 aus dem Ergebnis einer vorherigen SQL-Abfrage, weshalb der Wert hier nicht von aussen eingeschleust wird.
                              siehe
                              PHP-Code:
                               $auslesen_der_user mysqli_query($db"SELECT * FROM login");
                                      while(
                              $row mysqli_fetch_row($auslesen_der_user))
                                      {
                                              
                              $name2 $row['1']; 
                              Das dies so ziemlicher Unsinn ist, darauf wies ich in meinem Beitrag ja hin.

                              Kommentar


                              • #30
                                Zitat von protestix Beitrag anzeigen
                                Das dachte ich zuerst auch, aber er nimmt $name2 aus dem Ergebnis einer vorherigen SQL-Abfrage
                                Es ist egal, woher der Wert kommt.

                                Zitat von protestix Beitrag anzeigen
                                weshalb der Wert hier nicht von aussen eingeschleust wird.
                                Woraus schließt du, dass der Wert nicht ursprünglich von außen kommt? Davon abgesehen ist das irrelevant, da der Kontextwechsel immer beachtet werden muss, auch bei internen Werten.

                                Kommentar

                                Lädt...
                                X