Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbank Auslesen Problem.

Einklappen

Neue Werbung 2019

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

  • Datenbank Auslesen Problem.

    Sehr geehrte Damen und Herren,
    ich Programmiere gerade eine Website und dabei hab ich gerade ein Problem.

    Ich habe eine Suchfunktion das aus einem Eingabefeld besteht und soweit alles Funktioniert wie ich es will. Wenn ich den Namen Hans suche gibt er mir alle Datensätze wo der Name Hans vorkommt.

    z.b.
    Firma: xy GmbH
    Vorname: Hans
    Nachname: Mustermann

    Nun Sucht er aber in jedem Feld nach Hans wo dann sowas raus kommt:

    Firma: Hans GmbH
    Vorname: Mario
    Nachname: Mustermann

    Nun will ich für jedes einzelne Feld ein eigenes Input feld hinzufügen das in den jeweiligen Spalten der Datenbanktabelle sucht. Diese muss er aber nicht alle ausfüllen und können somit Leer bleiben. Wenn das Input Feld leer bleibt soll einfach nicht danach gesucht werden.

    Ich hoffe ich habe das verständlich formuliert und Ihr könnt mir da weiter helfen.

    Hier einmal mein Code:

    PHP-Code:

    require_once("models/config.php");
    if (!
    securePage($_SERVER['PHP_SELF'])){die();}
    require_once(
    "models/header.php");

    if(!
    isUserLoggedIn()) { header("Location: login.php"); die(); }

    $con=mysqli_connect('xxx','xxx','xxx','xxx');
        if (
    mysqli_connect_errno()) {
        echo 
    mysqli_connect_error();
        exit();
    }     else {
        echo 
    "erfolgreiche db verbindung";
    }

    $search_output "";

    if(isset(
    $_POST['searchquery']) && $_POST['searchquery'] != ""){
        
    $searchquery preg_replace('#[^a-z 0-9./?]#i'''$_POST['searchquery']);
        
        if(
    $_POST['filter1'] == "benutzer"){
            
        
    $sqlCommand "SELECT firma, vorname, nachname, homepage, telefonnummer, adresse, plz, wohnort, email 
        FROM 
        uc_users
        WHERE 
        firma LIKE '%"
    .$_POST['searchquery']."%' 
        OR
        vorname LIKE '%"
    .$_POST['searchquery']."%'
        OR
        nachname LIKE '%"
    .$_POST['searchquery']."%'
        OR
        homepage LIKE '%"
    .$_POST['searchquery']."%'
        OR
        telefonnummer LIKE '%"
    .$_POST['searchquery']."%' 
        OR
        adresse LIKE '%"
    .$_POST['searchquery']."%' 
        OR
        plz LIKE '%"
    .$_POST['searchquery']."%'
        OR
        wohnort LIKE '%"
    .$_POST['searchquery']."%'
        OR
        email LIKE '%"
    .$_POST['searchquery']."%'";
        }
        
        
    $query mysqli_query($con$sqlCommand) or die(mysql_error());
        
    $count mysqli_num_rows($query);
        
        if(
    $count 1){
            
    $search_output .= "<p>$count Ergebnisse für <strong>$searchquery</strong></p> <br />";
            while(
    $row mysqli_fetch_array($query)){
                    
    $firma $row["firma"];
                    
    $vorname $row["vorname"];
                    
    $nachname $row["nachname"];
                    
    $homepage $row["homepage"];
                    
    $telefonnummer $row["telefonnummer"];
                    
    $adresse $row["adresse"];
                    
    $plz $row["plz"];
                    
    $wohnort $row["wohnort"];
                    
    $email $row["email"];
                    
                
    $search_output .= "Firma: $firma <br /> - 
                                   Vorname: 
    $vorname <br />  
                                   Nachname: 
    $nachname <br />  
                                   Adresse: 
    $adresse <br /> 
                                   Wohnort: 
    $wohnort <br /> 
                                   PLZ: 
    $plz <br />
                                   Email: 
    $email <br />
                                   Telefonnummer: 
    $telefonnummer <br />
                                   <hr>Homepage: 
    $homepage<br /></hr> ";
                    } 
    // close while
        
    } else {
            
    $search_output "<p>0 Ergebnisse für: <strong>$searchquery</strong></p><br />";
        }

    und mein Formular

    Code:
    <div id='main'>
       <h2>suche</h2>
       <article>
       Hier können sie Benutzer suchen.
       </article> 
       <br />
       <br />
    
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>"   method="post">
         <label style="width:80px;">Suche nach:</label> 
         <input name="searchquery" type="text" size="44" maxlength="88"> 
         <br />
         <br />
         <label style="width:80px;">&nbsp;</label>  
         <select name="filter1">
         <option value="benutzer">Benutzer</option>
         </select>
         <br />
         <br />
         <input name="myBtn" type="submit">
         <br />
    </form>
    
    <article>
    <?php echo $search_output; ?>
    </article>
    
    </div>


  • #2
    Zunächst mal solltest Du keine POST-Daten ungefiltert in die DB jagen!

    Für Deine Frage gibt es zwei Möglichkeiten:
    1. Du prüfst die Eingaben bspw. mit empty() und baust die Abfrage entsprechend darauf auf.
    2. Du fragst per LIKE auf %{POST_VARIABLE}%, dann sollte er alles finden.

    Möglichkeit 1 ist allerdings die sauberere.
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Sehe ich nicht so, Variante 2 würde ich vorziehen. Warum die Abfrage umständlich zusammenbauen, wenn es einfach geht?
      Die LIKEs muß er dann aber mit AND verknüpfen. Und die Felder im Formular zufügen.
      PHP-Klassen auf github

      Kommentar


      • #4
        Deswegen gab ich zwei Möglichkeiten.
        Ich persönlich ziehe weiterhin die erste vor, denn warum die Datenbank mit lauter "leeren" LIKE's belästigen, wenn man's sauber machen kann...

        Aber jeder wie er mag...
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Sorry bin nicht so der Pro, was heißt ungefiltert und was bringt es bzw. was muss ich machen damit es gefiltert ist?

          Wenn ich das mit der 2. Variante mache, muss ich dann nur die Felder in den <form> Tag hinzufügen?

          Weil ich haben in <form> ja das hier drinnen:

          <label style="width:80px;">Suche nach:</label>
          <input name="searchquery" type="text" size="44" maxlength="88">

          und in PHP

          if(isset($_POST['searchquery']) && $_POST['searchquery'] != ""){

          Wenn ich jetzt die Felder in dem <form> Tag so ändere:

          <label style="width:80px;">Vorname:</label>
          <input name="vorname" type="text" size="44" maxlength="88">
          <label style="width:80px;">Nachname:</label>
          <input name="nachname" type="text" size="44" maxlength="88">


          Dann gibt es ja kein searchquery was in der _POST angegeben ist.
          Muss ich hier dann den Namen vom Absenden Button verwenden?
          Also so:

          if(isset($_POST['myBtn']) && $_POST['myBtn'] != ""){



          Danke schon mal für eure Hilfe .

          Kommentar


          • #6
            Ein wichtiger Punkt: mit $_SERVER['PHP_SELF'] machst du die Tür für XSS-Attacken auf, nutze besser $_SERVER['SCRIPT_NAME']
            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


            • #7
              Zitat von fmm Beitrag anzeigen
              Sorry bin nicht so der Pro, was heißt ungefiltert und was bringt es bzw. was muss ich machen damit es gefiltert ist?
              http://php.net/manual/de/mysqli.real-escape-string.php
              oder
              Prepared Statements http://php.net/manual/de/mysqli.quic...statements.php
              http://www.peterkropff.de/site/mysql...statements.htm

              LG
              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


              • #8
                Wenn du den Eingabefeldern den gleichen Namen wie den Tabellenspalten in der DB gibst, dann lässt sich dein Problem relativ leicht lösen.

                Ungetestet:
                PHP-Code:
                <?php
                   
                if (isset($_POST['vorname']))
                   {
                      
                $conditions = array();
                      
                      foreach (
                $_POST as $name => $value)
                      {
                          
                // Submit-Button ausschließen
                          
                if ($name == "submit")
                            continue;
                            
                          if (! empty(
                $value))
                             
                $conditions[] = "`$name` like '%" mysqli_real_escape_string($connection$value) . "%'";
                      }
                      
                      
                $query "Select 
                                   `firma`, 
                                   `vorname`, 
                                   `nachname`, 
                                   `homepage`, 
                                   `telefonnummer`, 
                                   `adresse`, 
                                   `plz`, 
                                   `wohnort`, 
                                   `email` 
                                 FROM
                                   `uc_users`"
                ;
                                   
                     if (
                count($conditions))
                       
                $query .= " where " implode(" or "$conditions);
                       
                     
                $result mysqli_query($connection$query)
                        or die (
                "MySQL-Fehler: " mysqli_error($connection));
                   }
                ?>
                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
                  Vielen Dank schon mal für eure Hilfe!
                  Werde das mal alles ändern.

                  aber ich komme immer noch nicht mit dem _POST Zeugs weiter..

                  EDIT:

                  den neuesten Post noch nicht gesehen.
                  Gilt das:

                  <?php
                  if (isset($_POST['vorname']))
                  {
                  $conditions = array();

                  foreach ($_POST as $name => $value)
                  {
                  // Submit-Button ausschließen
                  if ($name == "submit")
                  continue;

                  if (! empty($value))
                  $conditions[] = "`$name` like '%" . mysqli_real_escape_string($connection, $value) . "%'";
                  }

                  $query = "Select
                  `firma`,
                  `vorname`,
                  `nachname`,
                  `homepage`,
                  `telefonnummer`,
                  `adresse`,
                  `plz`,
                  `wohnort`,
                  `email`
                  FROM
                  `uc_users`";

                  if (count($conditions))
                  $query = " where " . implode(" or " . $conditions);

                  $result = mysqli_query($connection, $query)
                  or die ("MySQL-Fehler: " . mysqli_error($connection));
                  }
                  ?>

                  dann nicht nur für den Vornamen?
                  Muss ich das dann einfach kopieren und das selbe mit Nachname machen?

                  Kommentar


                  • #10
                    Siehe Posting #8
                    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


                    • #11
                      Zitat von uha Beitrag anzeigen
                      Siehe Posting #8
                      Ahh, ok.
                      Also muss ich jetzt nur das Formular ändern?
                      Wenn der Name des Input Elements gleich ist wie in der DB?

                      so z.b.?

                      <input name="vorname" type="text" size="44" maxlength="88">
                      <input name="nachname" type="text" size="44" maxlength="88">
                      usw.

                      Kommentar


                      • #12
                        Genau so. Der "Senden"-Button hat bei mir den Namen "submit", wenn der bei dir anders heißt, muss du das im Script anpassen.
                        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


                        • #13
                          Zitat von uha Beitrag anzeigen
                          Genau so. Der "Senden"-Button hat bei mir den Namen "submit", wenn der bei dir anders heißt, muss du das im Script anpassen.
                          Ah ok alles klar. Sorry falls ich dich nerve, aber ich verstehe nicht warum oben bei:

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

                          vorname drinnen steht, heißt das nicht das gilt nur für den vornamen?

                          Kommentar


                          • #14
                            fmm, kannst du bitte Quellcode in die PHP-Code Tags hier geben. Danke!
                            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
                              Ja tut mir Leid .

                              Kommentar

                              Lädt...
                              X