我能够在输入字段上使用 jQuery AJAX 实时搜索,它返回我想要的结果。现在我想对两个字段进行复合搜索。
这是我所拥有的,但它不工作或返回任何错误:
表格:
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">Name</span>
<input class="form-control" type="text" name="searchName" id="searchName" placeholder="Search by name">
<span class="input-group-addon">Class</span>
<select name="current_class" id="current_class" class="form-control">
## I populate my list from the database using php
<?php
$sql = "SELECT * from classes";
if ($result = mysqli_query($connection, $sql)){
if(mysqli_num_rows($result) > 0){
while ($row = mysqli_fetch_array($result)){
echo "<option value=\"{$row['class_id']}\"
{$row['class_name']} </option>";
}
}
}
?>
</select>
</div>
##results are displayed
<div id="result"></div>
<div>
脚本:
<script>
$(document).ready(function(){
$('#searchName').keyup(function(){
var name = $('#searchName').val();
var current_class = $('#current_class').val();
if (name != '' || current_class != '') {
$.ajax({
url:"fetch2.php",
method:"post",
data:{searchName:name, current_class:current_class},
dataType:"text",
success:function(data){
$("#result").html(data);
}
});
} else {
$("#result").html('');
}
});
$('#current_class').keyup(function(){
var name = $('#searchName').val();
var current_class = $('#current_class').val();
if (name != '' || current_class != '') {
$.ajax({
url:"fetch2.php",
method:"post",
data:{searchName:name, current_class:current_class},
dataType:"text",
success:function(data){
$("#result").html(data);
}
});
} else {
$("#result").html('');
}
});
});
</script>
在fetch2.php中查询:
$search_name = $_POST['searchName'];
$search_class = $_POST['current_class'];
$select__args = array();
$from__args = array();
$where__args = array("1=1");
$select__args[] = "student_id";
$from__args[] = "students";
$where__args[] = "(CONCAT(first_name,' ',surname) LIKE '%{$search_name}%')";
if($search_class != ''){
$where__args[] = "current_class_id like '%{$search_class}%'";
}
$select_clause = implode(", ", $select__args);
$from_clause = implode(",", $from__args);
$where_clause = "(" . implode(") AND (", $where__args) . ")";
$query = "SELECT {$select_clause} FROM {$from_clause} WHERE {$where_clause}";
我在这里错过了什么?我想要的是按名称或类别对两个字段进行实时搜索。如果有两 (2) 名学生的名字为:'Nathan Siafa' 但在两 (2) 个不同的类(class)(1 年级和 2 年级),我将不得不同时按姓名和类(class)进行搜索。这不是我得到的结果。
更新
我已经更改了我的代码以匹配@maksbd19 的回答。它对我有点用,但我没有得到我想要的结果(两个领域的实时搜索体验)。我刚刚意识到可能还有其他问题。前任。如果有两名学生 - John Amos Doe 和 John James Doe 上课(9 年级和 10 年级)。我意识到,如果搜索 John Amos Doe 的类(class)是 9 年级,它可以正常工作并返回正确的记录,但是如果我现在想要 John James Doe 的类(class)是 10 年级的记录,我会得到 John Amos Doe 的记录(注意:我的查询按姓氏和名字搜索)。
我添加了一个单独的字段来区分记录。现在使用@maksbd19,如果我想要 John James Doe 记录并且搜索是“John Doe”,我仍然会得到“John Amos Doe”记录,即使我在类字段中添加“John James Doe”的类它保持不变。
我获得精确记录的方法是为“John James Doe”放置正确的类并假装删除我当前的搜索值“John Doe”并且它有效。对我来说,这就像 ajax 只是在名称字段上进行实时搜索。
注意:我的应用程序不需要中间名,这就是我不尝试对其执行查询的原因,但是有没有一种方法可以利用通过学生全名(名字、中间名、姓氏),即使不是所有学生都有中间名?
更新 2
我已根据此处的代码设法让实时搜索在两 (2) 个字段中运行。我现在的问题是我的表中有两 (2) 名学生 - “John Amos Doe(10 年级)”和“John Lewis Doe(9 年级)”。如果我按名字搜索他们的特定类(class),它会返回所需的结果。
如果我搜索“John Doe”,它会带来“John Amos Doe”的记录,如果我现在想要“John Lewis Doe”的记录,我必须在返回的类字段中输入精确的类(9 年级)什么都没有。
我还尝试在我的搜索查询中包含中间名,但无济于事。 这是我的尝试:
$where__args[] = "(CONCAT(first_name,' ',middle_name,' ',surname) LIKE '%{$search_name}%') OR (CONCAT(first_name,' ',surname) LIKE '%{$search_name}%')";
最佳答案
如果我没记错的话,你会得到预期的结果。让我解释一下。
在您的表单中,ajax 函数没问题,它只是在服务器中传输值并取回查询结果。我认为您需要优化您的 mysql 查询。
在您的查询中有三个 OR 条件,其结果将返回任何匹配的任何内容。
student_id current_class_id first_name last_name
---------------+---------------------+------------------+-----------------
1 | 1 | Emma | Stone
---------------+---------------------+------------------+-----------------
2 | 1 | Emma | Roberts
---------------+---------------------+------------------+-----------------
3 | 2 | Emma | Watson
---------------+---------------------+------------------+-----------------
4 | 3 | Julia | Roberts
---------------+---------------------+------------------+-----------------
5 | 3 | Jane | Smith
---------------+---------------------+------------------+-----------------
6 | 1 | John | Roberts
---------------+---------------------+------------------+-----------------
让我们检查这个示例数据。
假设您在名称字段中键入了 Jane,但没有选择类 ID。您的 mysql 查询将查找与您输入的姓名匹配的学生 ID,该姓名为 concatenated first_name and last_name, last_name。由于您已经连接了两个名称,因此您可以省略最后一个或将两者分开。
$query = "SELECT student_id FROM students WHERE CONCAT(first_name,' ',surname) LIKE '%{$search_name}%'";
或
$query = "SELECT student_id FROM students WHERE first_name LIKE '%{$search_name}%' OR surname LIKE '{%$search_name}%'"
使用其中一个,两者都会产生相同的结果。
注意:如果您想搜索 Emma Roberts,则查询可能如下所示 -
$query = "SELECT student_id FROM students WHERE CONCAT(first_name,' ',surname) LIKE '%{$search_name}%' OR first_name LIKE '%{$search_name}%' OR surname LIKE '{%$search_name}%'"
通过这种方式,您可以告诉 mysql 将名字、姓氏或全名与数据库匹配。
让我们搜索 Emma(区分大小写)
student_id current_class_id first_name last_name
---------------+---------------------+------------------+-----------------
1 | 1 | Emma | Stone
---------------+---------------------+------------------+-----------------
2 | 1 | Emma | Roberts
---------------+---------------------+------------------+-----------------
3 | 2 | Emma | Watson
---------------+---------------------+------------------+-----------------
还有罗伯茨
student_id current_class_id first_name last_name
---------------+---------------------+------------------+-----------------
2 | 1 | Emma | Roberts
---------------+---------------------+------------------+-----------------
4 | 3 | Julia | Roberts
---------------+---------------------+------------------+-----------------
6 | 1 | John | Roberts
---------------+---------------------+------------------+-----------------
还有艾玛·罗伯茨
student_id current_class_id first_name last_name
---------------+---------------------+------------------+-----------------
2 | 1 | Emma | Roberts
---------------+---------------------+------------------+-----------------
现在让我们来看第二个子句,current_class_id 部分。我相信您会希望在此处执行 AND 操作。因为 从 class_id 1 搜索 Emma 或学生 没有任何意义。此搜索应该是从 class_id 1 的学生中搜索 Emma
$query = "SELECT student_id FROM students WHERE current_class_id like '%{$search_class}%'";
现在让我们结合它来实现您的预期。
$query = "SELECT student_id FROM students WHERE (CONCAT(first_name,' ',surname) LIKE '%{$search_name}%' OR first_name LIKE '%{$search_name}%' OR surname LIKE '{%$search_name}%') AND current_class_id like '%{$search_class}%'";
这基本上是告诉 mysql 在 first_name 和 surname 列中查找 Emma 并且还与特定的 current_class_id 相关联。
注意
上面的查询示例有一点小问题。如果您不在参数中包含 current_class_id,查询也应该忽略它。在我的例子中,这些类型的过滤器通常接受很多参数。我喜欢分成不同的部分。
$select_clause = implode(", ", $select__args);
$from_clause = implode(",", $from__args);
$where_clause = "(" . implode(") AND (", $where__args) . ")";
$query = "SELECT {$select_clause} FROM {$from_clause} WHERE {$where_clause}";
然后根据我提供给过滤器脚本的参数,相应地填充这些子句。在您的情况下,您可以拥有以下内容-
$select__args = array();
$from__args = array();
$where__args = array("1=1"); // this is necessary because when this array is going to be imploded then if the array is empty there will be empty string, so mysql would return no result.
$search_name = $_POST['searchName']; // please escape, by all means...
$search_class = $_POST['current_class']; // please escape, by all means...
$select__args[] = "student_id";
$from__args[] = "students";
$where__args[] = "(CONCAT(first_name,' ',surname) LIKE '%{$search_name}%' OR
first_name LIKE '%{$search_name}%' OR surname LIKE '{%$search_name}%')";
if( $search_class != '' ){
$where__args[] = "current_class_id like '%{$search_class}%'";
}
通过这种方式,我可以根据参数控制连接表、选择列和更改条件。
关于javascript - 在两个字段上进行 JQuery Ajax 实时搜索 - 输入和选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42900356/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
我几天前在我的rubyonrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag