2017-11-29 1 views
0

Ich habe eine App mit der folgenden Form:Wie wird mit mehreren Spalten gesucht?

<form action="<?php echo base_url('registration/registrationSearch'); ?>" method="post"> 
    <td widtd="40">&nbsp;</td> 
    <td><input type="text" name="txt_apply_for"  class="form-control" /></td> 
    <td><input type="text" name="txt_name"    class="form-control" /></td> 
    <td><input type="text" name="txt_mobile"   class="form-control" /></td> 
    <td><input type="text" name="txt_address"   class="form-control" /></td> 
    <td><input type="text" name="txt_state"   class="form-control" /></td> 
    <td><input type="text" name="txt_city"    class="form-control" /></td> 
    <td><input type="text" name="txt_area"    class="form-control" /></td> 
    <td><input type="text" name="txt_email"   class="form-control" /></td> 
    <td><input type="text" name="txt_work_experience" class="form-control" /></td> 
    <td><input type="text" name="txt_pan"    class="form-control" /></td> 
    <td><input type="text" name="txt_refrence"   class="form-control" /></td> 
    <td><input type="text" name="txt_refrence_others" class="form-control" /></td> 
    <td><input type="text" name="txt_status"   class="form-control" /></td> 
    <td><input type="text" name="txt_payment_others" class="form-control" /></td> 
    <td><input type="text" name="txt_application_date" class="form-control" /></td> 
    <td><input type="submit" name="sbt" class="form-control" value="search" /></td> 
</form> 

enter image description here

Ich bemerkte, dass, wenn ich es nur mit dem name vorlegen, zum Beispiel, dann habe ich keine Ergebnisse erhalten.
Das gleiche passiert, wenn ich nach name und mobile suche: keine Ergebnisse zurückgegeben.
Meine Suche funktioniert nur, wenn ich nach jedem Feld suche.

Dies wird die Abfrage generiert, wenn ich für name und mobile bin auf der Suche:

SELECT * 
FROM `application` 
WHERE `apply_for` = '' 
AND `full_name` = 'Ashish' 
AND `mobile` = '1234567890' 
AND `Mumbai` = '' 
AND `Maharshtra` = '' 
AND `Mumbai` = '' 
AND `area` = '' 
AND `email_id` = '' 
AND `work_experinece` = '' 
AND `pan` = '' 
AND `refrence` = '' 
AND `refrence_for_others` = '' 
AND `approved` = '' 
AND `payment_status` = '' 

Was mache ich falsch, dass meine Suche funktioniert nur, wenn jedes Feld gefüllt ist?
Wie wird die Datenbank richtig durchsucht, wenn ein Feld auf dem Formular nicht ausgefüllt ist?

P.S .: Ich verwende PHP auf meinem Backend.

+0

Warum haben Sie zwei 'Mumbai' Bedingungen in Ihrem' WO'? Können Sie bitte auch das Schema Ihrer Tabelle angeben? – ethane

+0

Was sagt "mysqli_error"? – panther

Antwort

0

Die Verwendung des Booleschen Operators in der WHERE-Klausel bedeutet, dass alle diese Bedingungen erfüllt sein müssen, um einen Datensatz zurückzugeben. In dem Beispiel in Ihrer Frage werden nur Datensätze zurückgegeben, in denen alle Spalten leer sind, mit Ausnahme von full_name und mobile.

Option 1: dynamisch erstellen die WHERE Klausel Zeichenfolge in Ihrem PHP-Code. Fügen Sie Anweisungen nur dann zur WHERE-Klausel hinzu, wenn der Feldwert des Formulars nicht leer ist. Mit Bezug auf das Beispiel in Ihrer Frage würde Ihr SQL so aussehen. Wenn mehrere Formularfelder Werte haben, fügen Sie diese einfach an die WHERE-Klausel an.

SELECT * 
FROM `application` 
WHERE `full_name` = 'Ashish' 
AND `mobile` = '1234567890' 

Option 2: Haben Sie Ihren SQL-Check für NULL-Werte.

SELECT * 
FROM `application` 
WHERE `mobile` = ifnull([your parameter value], `mobile`) 
AND `full_name` = ifnull([your parameter value], `full_name`) 
AND `mobile` = ifnull([your parameter value], `mobile`) 
etc. 

Randbemerkung: Achten Sie darauf, parametrisierte Abfragen zu verwenden, oder Sie sind anfällig für SQL-Injection-Attacken. Eine sehr einfache Möglichkeit, Ihren Code zu härten, finden Sie unter How can I prevent SQL injection in PHP?.

+0

Für Ihre erste Option kann es für das OP besser sein, seine Tabellen zu normalisieren, indem es die Möglichkeit bietet, einen Schlüssel zu senden, mit dem er dann beitritt. Reduzieren der Notwendigkeit, ein unnötiges Array von Werten an seinen Datenspeicher zu senden. – ethane

0

Eine weitere Option, könnten Sie das Skript im Backend bearbeiten, dass Sie die Daten holen verwenden, um so etwas zu sein:

<?php 
    // Grab every data sent to you. 
    $name = $_POST['txt_name']; 
    $mobile = $_POST['txt_mobile']; 
    // .. other data here 
    $payment_status = $_POST['txt_status']; 

    // Create the arrays to store the parameters you will use 
    $types = array(); 
    $where = array(); 
    $param = array(); 

    // Let's check every parameter... 
    // Have the user sent `name` to us? 
    if($name != null) { 
     // Then let's create a WHERE to it... 
     // How to choose the type: https://php.net/manual/en/mysqli-stmt.bind-param.php 
     $types[] = 's'; 
     $where[] = '`full_name` = ?'; 
     $param[] = $name; 
    } 

    // The same for `mobile` 
    if($mobile != null) { 
     $types[] = 's'; 
     $where[] = '`mobile` = ?'; 
     $param[] = $mobile; 
    } 

    // ... other parameters here... 

    // And to `payment_status` 
    if($payment_status != null) { 
     $types[] = 's'; 
     $where[] = '`payment_status` = ?'; 
     $param[] = $payment_status; 
    } 

    $sql = "SELECT * FROM `application`"; 

    if(!empty($param)) { 
     $types = implode('', $types) 
     $sql = $sql . ' ' . implode(' AND ', $where); 
    } 

    $stmt = $mysqli->stmt_init(); 

    $stmt->prepare($sql); 
    if(!empty($param)) { 
     $stmt->bind_param($types, ...$param); 
    } 
    $stmt->execute(); 

    // Use the fetched data any way you want... 
?> 

nicht bezogen werden:

  • Es andere sind Optionen zum Erstellen einer Abfrage und Abrufen von Daten. (Dies ist nur eine dieser Optionen und eine sehr vereinfachte Lösung während des Vorgangs.)
  • Bitte beachten Sie, dass Sie die Objekte, die Sie verwenden möchten, ordnungsgemäß erstellen sollten.
  • Vermeiden Sie ein einzelnes Skript, das alles tut. Und versuchen Sie, einen guten Rahmen zu verwenden.

Ich hoffe, es hilft. Wenn nicht, dann lass es mich wissen.

Verwandte Themen