Ankündigung

Einklappen
Keine Ankündigung bisher.

3 Suchfelder zusätzlich miteinander verknüpfen

Einklappen

Neue Werbung 2019

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

  • 3 Suchfelder zusätzlich miteinander verknüpfen

    Hallo Leute, mein Projekt ist jetzt fast fertig.

    Ich hab die Zeit in den letzten Tagen damit verbracht, den Code von HTML via Template zu trennen und auch nur funktionen verwendet, die auch als Funktionen dienen sollten.

    Alles funktioniert prima. Nur auf eines komm ich einfach nicht dahinter.

    Ich hab ein Suchformular mit 3 Textfeldern, wo ich suchen kann.
    Mit diesem Code wird das Ergebnis angezeigt, aber nur jeweils eines. Ich möchte die 3 aber verknüpfen. So in der Art: Wenn 1. Feld ein Wert hat, dann dannach suchen. Wenn 1. und 3. Feld einen Wert haben, dann Suche in der Spalte 1 und 3. usw.
    Hier mein Code:
    PHP-Code:
        if ($data['suche_anwendung'] != "") {
                
    $where 'WHERE a.Anwendung like ';
                
    $value '%'.$data['suche_anwendung'].'%';
        }

        if (
    $data['suche_wirkung'] != "") {
                
    $where 'WHERE a.Wirkung like ';
                
    $value '%'.$data['suche_wirkung'].'%';
        }

        if (
    $data['suche_organe'] != "") {
                
    $where 'WHERE a.Organe like ';
                
    $value '%'.$data['suche_organe'].'%';
        }

        
    $order 'a.Kategorie_ID';
        
    $db->query('SELECT a.Element_ID, a.Kategorie_ID, b.Bezeichnung, a.Name, a.Organe, a.Wirkung, a.Anwendung '
            
    'FROM tbl_element a '
            
    'INNER JOIN tbl_kategorie b ON b.Kategorie_ID = a.Kategorie_ID '
            
    $where.' ? ORDER BY '.$order);

        
    $db->bind(1$value);
        
    $row $db->resultset(); 
    Ich hoffe, ihr versteht mich.

  • #2
    Die Query muss dynamisch ergänzt werden .. AND FeldX LIKE %..% AND FeldZ LIKE %..%

    Du escapest derzeit ja gar nicht.. SQL Lücke!
    Entweder Prep. Statements vollständig verwenden (binden tust du ja schon) oder zumindest mit real_escape_string die Quey zusammenbauen.

    Schau mal hier mit Prep. Statments: http://www.pontikis.net/blog/dynamic...lighter_610074
    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


    • #3
      Hmm, ich binde die Database Classe hier ja ein:
      PHP-Code:
      <?php
      $template 
      __DIR__.'/../template/search.html5';

      $tpl = new Template($template);
      $db = new Database();

      if (isset(
      $data['action_a']) && ($data['action_a'] == 'OK')) {

          if (
      $data['suche_anwendung'] != "") {
                  
      $where 'WHERE a.Anwendung like ';
                  
      $value '%'.$data['suche_anwendung'].'%';
                  echo 
      $where.$value;
          }

          if (
      $data['suche_wirkung'] != "") {
                  
      $where 'WHERE a.Wirkung like ';
                  
      $value '%'.$data['suche_wirkung'].'%';
                  echo 
      $where.$value;
          }

          if (
      $data['suche_organe'] != "") {
                  
      $where ' OR a.Organe like ';
                  
      $value '%'.$data['suche_organe'].'%';
                  echo 
      $where.$value;
          }

          
      $order 'a.Kategorie_ID';
          
      $db->query('SELECT a.Element_ID, a.Kategorie_ID, b.Bezeichnung, a.Name, a.Organe, a.Wirkung, a.Anwendung '
              
      'FROM tbl_element a '
              
      'INNER JOIN tbl_kategorie b ON b.Kategorie_ID = a.Kategorie_ID '
              
      $where.' ? ORDER BY '.$order);

          
      $db->bind(1$value);
          
      $row $db->resultset();

          
      $tpl->setvar('ergebnis'$row);
      }
      echo 
      $tpl->output();
      und das ist die Classe:
      PHP-Code:
      <?php
      include_once dirname(__DIR__).'/includes/config.php';

      class 
      Database {

          private 
      $host HOST;
          private 
      $user USER;
          private 
      $pass PASSWORD;
          private 
      $dbname DATABASE;
          private 
      $dbh;
          private 
      $error;
          private 
      $stmt;

          public function 
      __construct() {
              
      // Set DSN
              
      $dsn 'mysql:host=' $this->host ';dbname=' $this->dbname;
              
      // Set options
              
      $options = array(
                  
      PDO::ATTR_PERSISTENT => true,
                  
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                  
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
              
      );
              
      //Create a new PDO instance
              
      try {
                  
      $this->dbh = new PDO($dsn$this->user$this->pass$options);
              }
              
      // Catch any errors
              
      catch (PDOException $e) {
                  
      $this->error $e->getMessage();
              }
          }

          public function 
      query($query) {
              
      $this->stmt $this->dbh->prepare($query);
          }

          public function 
      bind($param$value$type null) {
              if (
      is_null($type)) {
                  switch (
      true) {
                      case 
      is_int($value):
                          
      $type PDO::PARAM_INT;
                          break;
                      case 
      is_bool($value):
                          
      $type PDO::PARAM_BOOL;
                          break;
                      case 
      is_null($value):
                          
      $type PDO::PARAM_NULL;
                          break;
                      default:
                          
      $type PDO::PARAM_STR;
                  }
              }
              
      $this->stmt->bindValue($param$value$type);
          }

          public function 
      execute() {
              return 
      $this->stmt->execute();
          }

          public function 
      resultset() {
              
      $this->execute();
              return 
      $this->stmt->fetchAll(PDO::FETCH_ASSOC);
          }

          public function 
      single() {
              
      $this->execute();
              return 
      $this->stmt->fetch(PDO::FETCH_ASSOC);
          }

          public function 
      rowCount() {
              return 
      $this->stmt->rowCount();
          }

          public function 
      lastInsertId() {
              return 
      $this->dbh->lastInsertId();
          }

          
      /**
           * Transactions allow multiple changes to a database all in one batch.
           */
          
      public function beginTransaction() {
              return 
      $this->dbh->beginTransaction();
          }

          public function 
      endTransaction() {
              return 
      $this->dbh->commit();
          }

          public function 
      cancelTransaction() {
              return 
      $this->dbh->rollBack();
          }

          public function 
      debugDumpParams() {
              return 
      $this->stmt->debugDumpParams();
          }
      }
      Wie meinst du das, ich escape nicht?

      Kommentar


      • #4
        - Warum nutzt du die Klasse, die brauchst du doch gar nicht, oder welchen Vorteil siehst du dir da? PDO ist doch schon eine Klasse. Aber gut, deine Sache.

        Wie meinst du das, ich escape nicht?
        Du nimmst Code von aussen direkt in die SQL-Query. Das ist eine SQL-Injection Lücke und kann böse enden.

        Du kannst das in etwa so lösen.. hier getippt und sich nicht fehlerfrei.. Aber als Ansatz:
        PHP-Code:
        // kommt bei dir vom Form oder halt entsprechend deines Forms als Basis
        $aFilter = [
            
        'marke' => 'BMW',
            
        'modell' => '420'
        ];

        $afilterKey = [];
        $afilterParameter = [];

        foreach (
        $aFilter as $key => $val) {
            
        $afilterKey[]  = $key ' LIKE ?';
            
        $afilterParameter[] = '%'.$val.'%';
        }

        $sql "SELECT .. FROM .. WHERE " implode(' AND '$afilterKey);
        echo 
        $sql;
        // zum test mal ausgeben lassen
        // SELECT .. FROM .. WHERE marke LIKE ? AND modell LIKE ?

        $stmt $pdo->prepare($sql);
        $stmt->execute($afilterParameter); 
        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


        • #5
          Ok, ich hab jetzt meine Klasse weg gelasen und meine Suche umgebaut.
          PHP-Code:
              $filterKey = [];
              
          $filterParameter = [];

              foreach (
          $data['text'] as $key => $value) {
                  
          $filterKey[] = $key' LIKE ?';
                  
          $filterParameter[] = '%'.$value.'%';
              }

              
          $sql "SELECT a.Element_ID, a.Kategorie_ID, b.Bezeichnung, a.Name, a.Organe, a.Wirkung, a.Anwendung "
                  
          " FROM tbl_element a "
                  
          " INNER JOIN tbl_kategorie b ON b.Kategorie_ID = a.Kategorie_ID "
                  
          " WHERE " implode(' AND '$filterKey);
              echo 
          $sql;

              
          $stmt $db->prepare($sql);
              
          $row $stmt->execute($filterParameter);

              echo 
          $row
          Das SQL sieht richtig aus, nur wenn ich mir $row aufrufe, erscheint eine 1 und nicht der $value-wert bzw. ein Array mit dem inhalt

          Kommentar


          • #6
            Ach kommt.. du musst zuerst doch erst fetchen -> Doku
            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
              So, hatte natürlich vergessen, fetchAll einzubauen. Somit funktioniert die Suche fast perfekt. Was lediglich jetzt noch nicht ganz Funktioniert ist folgendes:

              Jetzt wird zwar genau der Datensatz gesucht, wo die Werte von Feld 1 und Feld 2 übereinstimmen.

              ABER: Ich möchte alle Datensätze sehen, wo Wert 1 vorkommt und auch wo Wert 2 vorkommt.

              Anstelle von "AND" habe ich "OR" eingesetzt, aber das funktioniert nicht

              Kommentar


              • #8
                So, nun hab ich auch die Suchfunktion so umgebaut, dass diese jetzt auch so funktioniert, wie ich wollte.

                DANKE für die Hilfestellungen. Jetzt hab ich mein Projekt fertig.

                Kommentar

                Lädt...
                X