Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP MYSQL Filter/Suche

Einklappen

Neue Werbung 2019

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

  • PHP MYSQL Filter/Suche

    Hallo zusammen,

    Ich kann den Fehler in folgendem Code nicht finden. Kann da mal jmd drüber schauen?

    PHP-Code:
    <?php
     $link 
    mysql_connect("localhost","..","..") or die ("Keine Verbindung möglich");
     
    mysql_select_db("..") or die ("Datenbank nicht gefunden");

     
    $function $_POST['function'];

     
    $log = array();
     switch (
    $function) {

    case (
    'search'):
                
    $sql "SELECT workstation.id, workstation.pcname, workstation.benutzer, workstation.inventarnummer, status.statusname as status FROM workstation, status WHERE ((status.id = workstation.status) ('workstation.pcname' LIKE '%".$_POST["suchstring"]."%'))  ORDER BY workstation.pcname ASC";    
                
    $result mysql_query($sql);
                
    $rows = array();
                while (
    $r mysql_fetch_assoc($result)) {
                    
    $rows[] = $r;
                }
                
    $log['workstation'] = $rows;        
                break;


        
    mysql_close($link);
        echo 
    json_encode($log);
    ?>
    Das ganze ohne
    PHP-Code:
    ('workstation.pcname' LIKE '%".$_POST["suchstring"]."%'
    funktioniert einwandfrei. Auch der mysql-befehl an sich spuckt mir in Phpmyadmin das richtige Ergebnis aus.

    Vielen Dank!

  • #2
    Die Post-variabel kommen übrigens von hier:
    PHP-Code:
    function suche(suchstring){
                $.
    ajax({
                    
    url"worker.php",
                    
    type"POST",
                    
    data:{
                        
    'suchstring'suchstring,
                        
    'function''search',
                        
    'tabelle''workstation'
                        
    },
                    
    success: function(data){
                        
    alert(suchstring);
                        
    workstation data.workstation;
                        
    workstationInListe();
                    },
                        
    error: function(abc,data) {
                            
    alert(data);
                        }
                    });
            } 

    Kommentar


    • #3
      mysql_ ist veraltet und schon aus PHP 7 entfernt. Nutze PDO ( zB https://php-de.github.io/jumpto/pdo/ ) oder msqli_ mit Prepared Statments. Damit stopfst du auch gleich deinen offene SQL-Injection Lücke die du da hast.
      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


      • #4
        ungetestet:

        PHP-Code:
        <?php
        $link 
        mysqli_connect("localhost","..","..""DB_Name") or die ("Keine Verbindung möglich");

        $function $_POST['function']; // Warum das umkopieren?

        switch ($function) {

            case (
        'search'):
                
        $sql "SELECT w.id, w.pcname, w.benutzer, w.inventarnummer, s.statusname AS `status`
                        FROM `workstation` w JOIN `status` s  
                        ON s.id = w.status
                        WHERE w.pcname LIKE '%" 
        mysqli_real_escape_string($link$_POST["suchstring"]) . "%'))  
                        ORDER BY w.pcname ASC"
        ;    
                
        $result mysqli_query($link$sql);
                if (!
        $result) {
                    
        printf("Error: %s\n"mysqli_error($link));
                }else{
                    
        $log mysqli_fetch_all($link$result));
                }
                break;
            default:
            
        // hier muss rein was als Vorgabe passieren soll
        }

            
        print_r($log);
        ?>

        Kommentar


        • #5
          Danke erstmal. Aber ich glaube ich kann deinen Code nicht ohne weiteres benutzen. Habe schhon etwas rumprobiert. Komme jetzt aber nicht weiter. Ich habe in der Datei mehrere Cases, die verschiede Dinge können und zurückgeben. Z.B. fragt das eine case alle Workstations ab.. das adnere die notebooks. Deshalb habe ich das log-Array erstellt, dass am ende mit json in die index.php (ajax function) zurück gegeben wird.
          PHP-Code:
          $result mysql_query($sql);
           
          $rows = array();
           while (
          $row mysqli_fetch_assoc($result)) {
           
          $rows[] = $row;
           }
          $log['workstation'] = $rows
          PHP-Code:
          echo json_encode($log); 
          PHP-Code:
          dataType"json",
                   
          success: function(data) {
                    
          workstation data.workstation;
                   
          workstationInListe();
                              }, 
          Könntest du mir helfen, wie ich das ganze auch mit mysqli realisieren kann?
          Am ende möchte ich in der ajaxfunction halt sagen, dass ich data.workstation oder data.notebooks benutzen/speichern möchte.

          Danke

          Kommentar


          • #6
            Ich habe dir den Code gegeben damit du siehst wie es mit mysqli aussieht, dabei habe ich extra die prozedurale Variante gelassen damit du es leichter hast.. Schau auch mal ins Handbuch dort steht sogar ein Beispiel.


            Kommentar


            • #7
              Ich habe jetzt das ganze mit mysqli gebaut. Die Datenbank abfrage an sich läuft auch. Leider funtioniert der "search" case noch immer nicht. Vielleicht habe ich auch einen anderen Denkfehler. Ich versuche mal meine Gedanken zu schildern. Wenn ich die Seite lade sehe ich meine Tabelle mit allen Daten, die mit folgendem case geladen wird:

              PHP-Code:
              case ('holeWorkstation'):
                          
              $sql "SELECT workstation.id, workstation.pcname, workstation.benutzer, workstation.inventarnummer, status.statusname as status
                                  FROM workstation, status
                                  WHERE status.id = workstation.status
                                  ORDER BY workstation.pcname ASC"
              ;    

                          
              $abfrage mysqli_query($verbindung,$sql);
                          
              $rows = array();
                          while(
              $row mysqli_fetch_object($abfrage))
                              {
              $rows[] = $row;}
                          
              $log['workstation'] = $rows;
                          break; 
              Die danzugehörige ajax:
              PHP-Code:
                          function workstationAbfragen() {
                              $.
              ajax({
                                  
              type"POST",
                                  
              url"worker.php",
                                  
              data: {
                                      
              'function''holeWorkstation'
                                  
              },
                                  
              dataType"json",
                                  
              success: function(data) {
                                      
              workstation data.workstation;
                                      
              workstationInListe();
                                  },
                                  
              error: function(abc,data) {
                                      
              alert(data);
                                  }
                              });                
                          } 
              Und die Function, die die Tabelle baut:
              PHP-Code:
                      function workstationInListe() {
                          $(
              "#listworkstationUebersicht").empty();
                          
              arrayPos 0;
                          $(
              "#listworkstationUebersicht").append($("<tr>").html("<th>pcname</th><th>benutzer</th><th>inventarnummer</th><th>status</th><th class="+"functions"+" onClick="+"addrow()"+">"+"<img src="+"images/add.png"+" alt="+"remove"+" width="+"15px"+"/>"+"</th>"));

                          $.
              each(workstation, function() {    
                              $(
              "#listworkstationUebersicht").append($("<tr>").html("<td contenteditable="+"true"+" onBlur="+"saveToDatabase(this,'pcname','"+this.id+"')"+" onClick="+"showEdit(this);"+">"+this.pcname+"</td>"+
                                                                                  
              "<td contenteditable="+"true"+" onBlur="+"saveToDatabase(this,'benutzer','"+this.id+"')"+" onClick="+"showEdit(this);"+">"+this.benutzer+"</td>"+
                                                                                  
              "<td contenteditable="+"true"+" onBlur="+"saveToDatabase(this,'inventarnummer','"+this.id+"')"+" onClick="+"showEdit(this);"+">"+this.inventarnummer+"</td>"+
                                                                                  
              "<td>"+"<select id="+"'"+"status_selectbox"+this.id+"'"+"onchange="+"changeSelectbox(this,'status','"+this.id+"')"+"></select></td>"+
                                                                                  
              "<td class="+"functions"+" onClick="+"deleterow("+this.id+");"+">"+"<img src="+"images/remove.png"+" alt="+"remove"+" width="+"15px"+"/>"+"</td>"+
                                                                                  
              "<td class="+"functions"+" onClick="+"copyrow("+this.id+");"+">"+"<img src="+"images/copy.png"+" alt="+"remove"+" width="+"15px"+"/>"+"</td>").data("pid"arrayPos)

                              );                
                              
              arrayPos++;
                              });
                              
              fill_select();
                      } 
              Soweit so gut.
              Nun möchte ich, wenn ich etwas in das suchfeld schreibe folgende Funktion ausführen. Diese soll eingentlich nur die workstation objekte laden und dann wieder mit der function "workstationINListe" die tabelle neu laden.

              PHP-Code:
                      function suche(suchstring){
                          $.
              ajax({
                              
              url"worker.php",
                              
              type"POST",
                              
              data:{
                                  
              'suchstring'suchstring,
                                  
              'function''search',
                                  
              'tabelle''workstation'
                                  
              },
                              
              success: function(data){
                                  
              alert(suchstring);
                                  
              workstation data.workstation;
                                  
              workstationInListe();
                              },
                                  
              error: function(abc,data) {
                                      
              alert(data);
                                  }
                              });
                      } 
              Der suchstring kommt richtig an, wie ich per alert geprüft habe.

              der case in der worker.php sieht jetzt wie folgt aus:

              PHP-Code:
                      case ('search'):
                          
              $suchstring mysql_real_escape_string($_POST["suchstring"]);    
                          
              $sql "SELECT w.id, w.pcname, w.benutzer, w.inventarnummer, s.statusname AS `status`
                                  FROM `workstation` w JOIN `status` s  
                                  ON s.id = w.status
                                  WHERE w.pcname LIKE '%" 
              $suchstring "%'))  
                                  ORDER BY w.pcname ASC"
              ;

                          
              $abfrage mysqli_query($verbindung,$sql);
                          
              $rows = array();
                          while(
              $row mysqli_fetch_object($abfrage))
                              {
              $rows[] = $row;}
                          
              $log['workstation'] = $rows;
                          break; 
              Vielleicht findet ja jmd den Fehler.

              Danke!

              Kommentar


              • #8
                Ich tippe auf diese Zeile:
                PHP-Code:
                $suchstring mysql_real_escape_string($_POST["suchstring"]); 
                Siehe auch: https://php-de.github.io/jumpto/leitfaden/
                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


                • #9
                  Augen auf

                  PHP-Code:
                  mysql_...

                  mysqli_... 
                  Fällt dir was 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


                  • #10
                    An der Stelle kann der Fehler aber nicht liegen. Wenn ich das mysql_real_escape... weglasse und somit injection-lücke offen lasse, habe ich noch immer den Fehler, dass die Tabelle leer bleibt, nachdem ich einen Suchstring in as suchfeld eingegeben habe.

                    PHP-Code:
                            case ('search'):
                                
                    //$suchstring = mysqli_real_escape_string($verbindung, $_POST["suchstring"]);
                                
                    $sql "SELECT w.id, w.pcname, w.benutzer, w.inventarnummer, s.statusname AS `status`
                                        FROM `workstation` w JOIN `status` s  
                                        ON s.id = w.status
                                        WHERE w.pcname LIKE '%" 
                    $_POST["suchstring"] . "%'
                                        ORDER BY w.pcname ASC"
                    ;

                                
                    $abfrage mysqli_query($verbindung,$sql);
                                
                    $rows = array();
                                while(
                    $row mysqli_fetch_object($abfrage))
                                    {
                    $rows[] = $row;}
                                
                    $log['workstation'] = $rows;
                                break; 

                    Kommentar


                    • #11
                      Es ist trotzdem falsch, du musst die mysqli_real_escape... nutzen

                      Warum fragst du die DB nicht einfach mal nach Fehler, wie man das halt so üblicherweise macht? https://php-de.github.io/jumpto/sql/...ehler-ausgeben Debugging halt.. ist eh immer das selbe.
                      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


                      • #12
                        ich habe doch mysqli_real_escape genutzt!
                        PHP-Code:
                        //$suchstring = mysqli_real_escape_string($verbindung, $_POST["suchstring"]); 
                        Die Datenbanksyntax an sich funktioniert, wenn ich das Ganze in PHPmyadmin eingebe.

                        Kommentar


                        • #13
                          PHP-Code:
                          <?php
                                      $db_server 
                          "localhost"// Hostname
                                      
                          $db_user ".."// Benutzername
                                      
                          $db_pass ".."// Kennwort
                                      
                          $db_name ".."// Name der Datenbank

                                      
                          $verbindung = new mysqli($db_server$db_user$db_pass)
                                      or die (
                          "Keine Verbindung zum Datenbankserver");

                                      
                          mysqli_select_db($verbindung$db_name)
                                      or die (
                          "Diese Datenbank "$db_name" existiert nicht.");

                              
                          $function $_POST['function'];

                              
                          $log = array();
                              switch (
                          $function) {

                                  case (
                          'search'):
                                      
                          //$suchstring = mysqli_real_escape_string($verbindung, $_POST["suchstring"]);
                                      
                          $sql "SELECT w.id, w.pcname, w.benutzer, w.inventarnummer, s.statusname AS `status`
                                              FROM `workstation` w JOIN `status` s  
                                              ON s.id = w.status
                                              WHERE w.pcname LIKE '%" 
                          mysqli_real_escape_string($link$_POST["suchstring"]) . "%'  
                                              ORDER BY w.pcname ASC"


                                      
                          $abfrage mysqli_query($verbindung,$sql);
                                      
                          $rows = array();
                                      while(
                          $row mysqli_fetch_object($abfrage))
                                          {
                          $rows[] = $row;}
                                      
                          $log['workstation'] = $rows;
                                      break;
                              } 

                              
                          mysqli_close($verbindung);
                              echo 
                          json_encode($log);
                          ?>

                          Kommentar


                          • #14
                            Bitte debugge!

                            - Kommst du in das case überhaupt rein?

                            - Gibt die Query einen Fehler? Siehe mein Link oben

                            - etc.. hantel dich durch, hilft nicht. https://php-de.github.io/jumpto/faq/#debugging


                            Übrigens, warum holst du nicht gleich ein Array, statt alles einzheln als Objekt um es dann wieder in ein Array zu geben? Ist doch umständlich doppelt gemoppelt.

                            while($row = mysqli_fetch_object($abfrage))
                            {
                            $rows[] = $row;}
                            Mach gleich ein fetch all http://php.net/manual/de/mysqli-result.fetch-all.php
                            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


                            • #15
                              sieh mein Beitrag #4

                              Kommentar

                              Lädt...
                              X