Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Leere Variablen bei Abfrage ignorieren

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Leere Variablen bei Abfrage ignorieren

    Hallo zusammen,

    folgendes Problem:

    Ich möchte über eine Suchmaske verschiedene Artikel in einer Stückliste suchen.

    Das Ganze funktioniert prima mit mehreren Artikeln über folgende Abfrage:
    Code:
    $ergebnis = mysqli_query($db, "SELECT baugruppe FROM artikeldaten WHERE einzelteil IN (\"Artikel1\", \"Artikel2\") GROUP BY baugruppe HAVING COUNT(baugruppe)=$i");
    Nun soll die Abfrage aber mit Daten aus einem Formular mit 5 Inputfeldern ausgeführt werden, wovon bis zu 4 Felder leer sein können.

    Mein bisheriger Code sieht wie folgt aus:

    PHP-Code:

    <form action="<? $PHP_SELF; ?>" method="post">
      <p>Suchbegriff 1:<br><input name="sb1" type="text" size="30" maxlength="30"></p>
      <p>Suchbegriff 2:<br><input name="sb2" type="text" size="30" maxlength="40"></p>
      <p>Suchbegriff 3:<br><input name="sb3" type="text" size="30" maxlength="40"></p>
      <p>Suchbegriff 4:<br><input name="sb4" type="text" size="30" maxlength="40"></p>
      <p>Suchbegriff 5:<br><input name="sb5" type="text" size="30" maxlength="40"></p>
      
      <input type="submit" value=" Absenden ">

    </form>

    <?
    if (isset($_POST["sb1"]))
    {
    $i=0;
    if (!empty($_POST['sb1'])){$i++;}
    if (!empty($_POST['sb2'])){$i++;}
    if (!empty($_POST['sb3'])){$i++;}
    if (!empty($_POST['sb4'])){$i++;}
    if (!empty($_POST['sb5'])){$i++;}

    $ergebnis = mysqli_query($db, "SELECT baugruppe FROM artikeldaten WHERE einzelteil IN ('".$_POST['sb1']."') GROUP BY baugruppe HAVING COUNT(baugruppe)=$i");

    while($row = mysqli_fetch_object($ergebnis))
    {
      echo $row->baugruppe;
      echo "<br />";
    }
    }
    ?>
    Wie bekomme ich es nun hin, dass die Abfrage variabel bleibt (sprich, bei 2 ausgefüllten Textfeldern sollen auch nur diese 2 Werte gesucht werden, während die leeren ignoriert werden...)?

    Hoffe, mir kann jemand folgen und helfen!

    Danke!

  • #2
    Hi,

    Wie bekomme ich es nun hin, dass die Abfrage variabel bleibt (sprich, bei 2 ausgefüllten Textfeldern sollen auch nur diese 2 Werte gesucht werden, während die leeren ignoriert werden...)?
    Kannst du doch mit ner empty() Abfrage in ner If-Bedingung selbst den Suchstring zusammenschustern und mit implode() zusammenbauen, den du dann in deine SQL Statement einfügst.

    mfg Wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      PHP-Code:
      <form action="" method="post">
        <
      p>Suchbegriff 1:<br><input name="sb[]" type="text" size="30" maxlength="30"></p>
        <
      p>Suchbegriff 2:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
        <
      p>Suchbegriff 3:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
        <
      p>Suchbegriff 4:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
        <
      p>Suchbegriff 5:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
        
        <
      input type="submit" value=" Absenden ">

      </
      form
      Damit bekommst du ein Array übergeben, das kannst du zum Suchstring imploden
      PHP-Code:
      $in implode(', 'array_filter($_POST['sb'])); 
      http://php.net/manual/en/function.array-filter.php
      http://de2.php.net/manual/en/function.implode.php
      http://blog.oncode.info/2008/05/07/p...scripting-xss/
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Die empty() Abfrage nutz ich ja schon zum zählen, könnte ich also prima nutzen.

        Leider habe ich so meine Probleme mit dem richtigen Syntax bei SQL Anweisungen.... Aber das geht vermutlich vielen so...

        Ich werde mal ein wenig rumtüfteln.

        Danke schonmal für den Ansatz.

        Kommentar


        • #5
          @VPh: Das sieht ja noch einfacher aus. Werde das gleich mal testen.

          Danke!

          Kommentar


          • #6
            Hej zusammen,

            hab es nun hinbekommen und das Ganze sieht nun so aus:

            PHP-Code:
            <form action="" method="post">
              <p>Suchbegriff 1:<br><input name="sb[]" type="text" size="30" maxlength="30"></p>
              <p>Suchbegriff 2:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
              <p>Suchbegriff 3:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
              <p>Suchbegriff 4:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
              <p>Suchbegriff 5:<br><input name="sb[]" type="text" size="30" maxlength="40"></p>
              <input type="submit" value=" Absenden ">
            </form>

            <?
            if (isset($_POST['sb'][0]))
            {
            $in = implode(', ', array_filter($_POST['sb']));
            $i = substr_count($in, ',') + 1;
            $ergebnis = mysqli_query($db, "SELECT baugruppe FROM artikeldaten WHERE einzelteil IN ('".$in."') GROUP BY baugruppe HAVING COUNT(baugruppe)=$i");


            while($row = mysqli_fetch_object($ergebnis))
            {
              echo $row->baugruppe;
              echo "<br />";
            }
            }
            ?>
            Funktioniert und tut genau das was es soll.

            Das einzige, was ich vielleicht noch verbessern könnte ist dies hier:
            PHP-Code:
            $i substr_count($in',') + 1
            Jemand einen Vorschlag, wie ich an die Anzahl der ausgefüllten Textfelder etwas eleganter ermitteln kann?

            Mit count klappte es nicht, da alle Textfelder gezählt werden.

            Kommentar


            • #7
              So spontan würde ichs bei count auch mit array_filter probieren
              [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
              [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

              Kommentar


              • #8
                Dein Query wird wahrscheinlich nicht so funktionieren wie du dir das gedacht hast.

                PHP-Code:
                $str "";
                $array array_filter($_POST["sb"]);

                foreach (
                $array as $sb)
                   {
                $str.= ",'".$db->real_escape_string($sb)."'";} //<== Jedes Wort einzeln, sonst
                //brauchst du bei deinem Query kein IN sondern SUBSTR

                $ergebnis mysqli_query($db"SELECT baugruppe FROM artikeldaten WHERE einzelteil IN ("
                   
                .substr($str1).") GROUP BY baugruppe HAVING COUNT(baugruppe)=".count($array)); 

                Kommentar


                • #9
                  Versuch mal PDO mit Prepared-Statements

                  PHP-Code:
                  $statement $pdo->prepare("
                      SELECT
                          baugruppe
                      FROM
                          artikeldaten
                      WHERE
                          FIND_IN_SET(einzelteil, :einzelzeile)
                      GROUP BY
                          baugruppe
                      HAVING
                          COUNT(1) = :count
                  "
                  );

                  $einzelteile array_filter($_POST["sb"]);

                  $statement->execute(array(
                      
                  'einzelzeile' => implode(','$einzelteile),
                      
                  'count' => count($einzelteile)
                  )); 

                  Kommentar


                  • #10
                    Hallo zusammen,

                    Durin hat die finale Hilfe gebracht...

                    Danke an alle!

                    Bei Interesse:
                    PHP-Code:
                    <?php
                      
                    if (isset($_POST['sb'][0]))
                      {
                        
                    $str "";
                        
                    $i=1;
                        
                    $array array_filter($_POST["sb"]);
                        foreach (
                    $array as $sb)
                        {
                          
                    $str.= ",'".$db->real_escape_string($sb)."'";
                        }
                        
                    $ergebnis mysqli_query($db"SELECT baugruppe FROM artikeldaten WHERE einzelteil IN (".substr($str1).") GROUP BY baugruppe HAVING COUNT(baugruppe)=".count($array)); 
                        echo 
                    "<table style=\"border:1px solid black;\"><tr><td>Nr.</td><td>Artikel</td></tr>";
                        while(
                    $row mysqli_fetch_object($ergebnis))
                        {
                          
                    $color = ($i 2) ? "#dddddd" "#FFFFFF";
                          echo 
                    "<tr bgcolor='$color'><td>$i</td><td>$row->baugruppe</td></tr>";
                          
                    $i++;
                        }
                        echo 
                    "</table>";
                      }
                    ?>

                    Kommentar

                    Lädt...
                    X