2016-11-17 2 views
0

Gibt es eine Möglichkeit, eine dynamische Suche mit 2 Textfeldern zu haben, um 2 verschiedene Felder zu filtern?PHP & Javascript: Dynamische Suche mit 2 Textfeldern

zum Beispiel habe ich eine Tabelle wie:

enter image description here

und ich habe somethin wie folgt erstellt: enter image description here

es bereits in der ZUNAME Textbox funktioniert.

ich will, ist, dass, wenn ich geben Sie einen Nachnamen mit gleichen lastnames wie folgt aus: enter image description here

Ich möchte einen anderen Filter von Vorname hinzufügen, so dass, wenn ich ein Vorname am Beispiel VORNAME Textbox eingeben i PEDRO eingeben in die Textbox FIRSTNAME wird nur PEDRO A. Dela Cruz zeigen.

Dies ist mein Codes

Index.php

<script type="text/javascript"> 
$(function(){ 
$(".lname").keyup(function() 
{ 
var value = $(this).val(); 
var dataString = 'lname='+ value; 
if(searchlname!='') 
{ 
    $.ajax({ 
    type: "POST", 
    url: "search.php", 
    data: dataString, 
    cache: false, 
    success: function(html) 
    { 
    $("#result").html(html).show(); 
    } 
    }); 
}return false;  
}); 

jQuery("#result").live("click",function(e){ 
    var $clicked = $(e.target); 
    var $name = $clicked.find('.name').html(); 
    var decoded = $("<div/>").html($name).text(); 
    $('#searchlname').val(decoded); 
}); 
jQuery(document).live("click", function(e) { 
    var $clicked = $(e.target); 
    if (! $clicked.hasClass("search")){ 
    jQuery("#result").fadeOut(); 
    } 
}); 
$('#searchlname').click(function(){ 
    jQuery("#result").fadeIn(); 
}); 
}); 
</script> 

    <div class="content"> 
    Lastname: 
    <input type="text" class="lname" id="searchlname" placeholder="Search for people" /><br /> 
    Firstname: 
    <input type="text" class="search" id="" placeholder="Search for people" /><br /> 
<div id="result"> 
</div> 

search.php

<table width="80%"> 
    <th width="5%">ID</th> 
    <th width="40%">Name</th> 
    <th width="10%">Action</th> 
</table> 

<?php 
$connection = mysql_connect('localhost','root','admin') or die(mysql_error()); 
$database = mysql_select_db('dbvincent') or die(mysql_error()); 

if($_POST) 
{ 
$search_name=$_POST['lname']; 
$sql_res=mysql_query("SELECT * FROM `tblpatients` WHERE `lname` LIKE '%$search_name%' order by `patient_id` LIMIT 15"); 

while($row=mysql_fetch_array($sql_res)) 
{ 
$id = $row['patient_id']; 
$fname = $row['fname']; 
$mname = $row['mname']; 
$lname = $row['lname']; 
?> 
<table width="80%"> 
    <td width="5%"><?php echo $id ; ?></td> 
    <td width="40%"><?php echo $fname.' '.$mname.' '.$lname; ?></td> 
    <td width="10%"><button formaction="echoid.php?id=<?php echo $id ?>">Add</button></td> 
</table> 

<?php 

danken Sie.

+3

1. ** Verwenden Sie ** die ** veralteten und unsicheren ** 'mysql_ *' - Funktionen nicht. Sie sind seit PHP 5.5 veraltet und in PHP 7 vollständig entfernt. Verwenden Sie stattdessen MySQLi oder PDO. 2. ** Sie sind offen für [SQL Injections] (http://php.net/manual/en/security.database.sql-injection.php) ** und sollten wirklich [vorbereitete Anweisungen] verwenden (http://php.net/manual/de/mysqli.quickstart.prepared-statements.php) anstelle der Verkettung Ihrer Abfragen, die verwendet werden können, wenn Sie die oben genannten MySQLi oder PDO verwenden.Besonders, da Sie die Benutzereingaben überhaupt nicht umgehen. –

+0

danke für das Anliegen. aber ich bin nicht besorgt über die Sicherheit noch und das System wird nur in einem kleinen Büro verwendet werden .. aber ich werde versuchen, es in mysqli zu konvertieren. und danke für die Beratung. –

+0

_Suggestion, _ zumindest die Benutzereingabe zu entkommen. Wenn nicht, und jemand zum Beispiel nach "O'connor" sucht, unterbricht es Ihre Abfrage (das '' 'beendet die Wertangabe und' connor' wird als ungültiges SQL-Schlüsselwort betrachtet). –

Antwort

1

Es gibt sauberere Wege, dies zu tun geben, Wenn Sie jedoch Ihren gesamten Code ändern, habe ich ihn entsprechend Ihren Anforderungen aktualisiert. Ich habe mich bereits über den Sicherheitsaspekt geärgert und nicht die alten, veralteten mysql_*-Funktionen, sondern eher vorbereitete Anweisungen mit MySQLi oder PDO verwendet.

Es muss nur darauf hingewiesen werden, falls später jemand anderes kommt.

Zuerst würde ich beiden Eingänge gibt Feld für ein neues zusätzliche CSS-Klasse, Beispiel: people-search-filter, ich auch das Feld für Nachnamen gebe eine ID:

<input type="text" class="lname people-search-filter" id="searchlname" ... 

<input type="text" class="search people-search-filter" id="searchfname" ... 

Diese wir allowes die schaffen das gleiche Ereignis auf beiden Eingabefelder:

$(function(){ 
    // We add the event on the class, which both inputs have 
    $(".people-search-filter").keyup(function() { 
     // Now we get the values from both inputs, using their ID's 
     var lname = $("#searchlname").val(); 
     var fname = $("#searchfname").val(); 

     // Add both to the dataString (and URI encode the strings) 
     var dataString = {lname: lname, fname: fname} 
     // Check that at least one has any content 
     if(lname != '' || fname != '') 

      // Your ajax query 

In Ihrem PHP-Code, die Sie gerade den neuen Parameter in Ihrer Abfrage hinzufügen:

$lname = $_POST['lname']; 
$fname = $_POST['fname']; 

// Now we will build the search string 
$search_str = ''; 
if ($lname) { 
    $search_str = "WHERE lname LIKE '%" . mysql_real_escape_string($lname) . "%'"; 
} 

if ($fname) { 
    // Check if we have something in the search string, 
    // if we do, add an AND to the statement. 
    // If we don't have one, we'll add the WHERE instead. 
    $search_str .= $search_str ? ' AND ' : 'WHERE '; 
    $search_str .= "fname LIKE '%" . mysql_real_escape_string($fname) . "%'"; 
} 

// If neither $lname or $fname contains any data, the query will return all patiens 
$sql_res = mysql_query("SELECT * FROM `tblpatients` {$search_str} order by `patient_id` LIMIT 15"); 

// ... the rest of your code. 
+0

es nicht die Daten –

+0

ich ein 'Hinweis bekam Abrufen \ Programme \ Xammp \ htdocs \ _system-Teile \ my_search \ search.php on line 12', die die' $ fname = $ ist _POST ['fname']; 'Und auch bei' Warning: mysql_fetch_array() erwartet 1 Parameter Ressource, boolean in D gegeben zu sein: \ Programme \ Xammp \ htdocs \ _system-Teile \ my_search \ search.php on line 31' ' –

+0

Dann bist du Der DataString wird nicht korrekt gesendet. Der andere Fehler besteht darin, dass die Abfrage fehlschlägt. –

0

Man könnte so etwas wie dies versuchen vielleicht, wo Sie die Abfrage bauen auf die Existenz von ersten/lastnames basiert - nicht getestet, aber vielleicht eine Idee

$search_name = !empty($_POST['lname']) ? $_POST['lname'] : false; 
$firstname = !empty($_POST['fname']) ? $_POST['fname'] : false; 

if($search_name){ 

    $clauses=array(); 

    $clauses[]="`lname` like '%$search_name%'"; 

    if($firstname) $clauses[]="`fname` like '%$firstname%'"; 

    $search = implode(' AND ', $clauses); 

    $sql_res=mysql_query("SELECT * FROM `tblpatients` WHERE {$search} order by `patient_id` LIMIT 15"); 


    /* rest of the commands...*/ 

} 
+0

Sollte ich etwas in der JAVASCRIPT hinzufügen ?. Wie etwas in den Datenstreuern? Undefined index: fname in D: –