如何使用MySQL、PHP和Ajax过滤结果集?

4
我是MySQL的新手,想要通过地区“过滤”结果集。我之前问过一个类似的问题,但我不知道是否应该创建一个新问题还是继续那个问题,如果我搞错了,请原谅。
我看了http://www.w3schools.com/ajax/tryit.asp?filename=tryajax_database,认为它非常理想,但我不确定如何让它工作,或者如何让它“更新”结果。
理想情况下,我想在地区下面放一个下拉框 - 但是,我没有任何成功的经验 - 我真的完全受限于我的理解,有人可以帮忙吗?(感谢之前帮助过第一部分的人!!)
这是我到目前为止所拥有的(为了说明我想要过滤的内容)。
非常感谢,scotia - 下面是regionbox.php文件

...

   <script type="text/javascript">
function selectRegion(str)
{
var xmlhttp;    
if (str=="")
  {
  document.getElementById("region").innerHTML="";
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("region").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","regionbox.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>

<P>
<table class="dbTable">
    <tr>
    <tr><th>Commodity</th> <th><form action="regionbox.php"> 
<select name="region" onchange="selectRegion(this.value)">
<option value="">Select Region</option>
<option value="E. Midlands">E. Midlands</option>
<option value="Gtr. London">Gtr. London</option>
<option value="North East">North East</option>
<option value="North West">North West</option>
<option value="Scotland">Scotland</option>
<option value="South East">South East</option>
<option value="South West">South West</option>
<option value="W. Midlands">W. Midlands</option>
<option value="Wales">Wales</option>
</select>
</form></th> <th>Member</th> <th>Size</th> <th>Price</th> <th>Date Posted</th>
    </tr>

<?php
$link = mysql_connect('localhost', '', '');

$db_selected = mysql_select_db('palegall_newTrader', $link);
if (!$db_selected) {
    die ('cant find newTrader' . mysql_error());
}

$region = mysql_real_escape_string($_POST['region']);
    $query = mysql_query("SELECT * FROM `sell` WHERE `commodity` = 'paper' ORDER BY `price`") 
       or die( mysql_error() ); 

    echo '<table class="dbTable">';

     while ($row = mysql_fetch_assoc($query))  
    { 

      echo '<tr><td>'.$row['commodity'].'</td> <td>'.$row['region'].'</td> <td>'.
                      $row['member'].'</td> <td>'.$row['size'].'</td> <td>'.
                      $row['price'].'</td> <td>'.$row['posted'].'</td> </tr>'; 
    }
    echo "</table>"; 
    ?> 
</body></html>

我已经剥离了一些部分。希望这样可以。


你想做什么?只显示与下拉列表值匹配的元素?还是每次选择筛选器时都从数据库中“重新获取”数据? - Antonio Laguna
1
抱歉 @Antonio - 我错过了你的帖子 - 是的,我想要“重新获取”。对不起,我的问题没有表达清楚!!! - scotia
@scotia 考虑在进行此类重新获取时的性能和用户体验。当您第一次访问表格时,应该期望看到什么样的内容?每次选择某些内容都需要从数据库中重新获取数据吗?我给出的答案只是“修改”DOM,因此不会进行额外的调用,并且比重新获取具有更好的性能。但是,如果您确实需要它,我会编辑我的答案。 - Antonio Laguna
一个选择是使用fancybox与jQuery,这是一个非常适合需要AJAX页面查询的初学者的工具,但它是一个可能不适合您网站的灯箱应用程序。它还通过AJAX调用页面而不是在此用法中刷新内容,例如,我有一个页面,其中包含许多变量,用于指定我想要返回的数据(例如task.php?taskid=task&userid=user&anotervar=something),这意味着我不需要担心整个JS / AJAX调用,我可以使用URL中的变量通过标准PHP查询mySQL,并通过AJAX请求/返回。 - Ryan
谢谢Belinda,我之前没有意识到这个问题!更新的最佳方法是什么?非常感谢。 - scotia
显示剩余6条评论
2个回答

3

修改这段代码

$query = mysql_query("SELECT * FROM `sell` WHERE `commodity`='Paper' 
                      ORDER BY `price`") 
   or die( mysql_error() ); 
$row=mysql_fetch_assoc($query);  
do 
{ 
  echo'<table class="dbTable">'; 
  echo '<tr><td>'.$row['commodity'].'</td> <td>'.$row['region'].'</td> <td>'.
                  $row['member'].'</td> <td>'.$row['size'].'</td> <td>'.
                  $row['price'].'</td> <td>'.$row['posted'].'</td> </tr>'; 
}
while($row = mysql_fetch_assoc($query)); 
  echo "</table>"; ?> 

Into:

$region = mysql_real_escape_string($_POST['region_Name']);
//For debugging: 
echo $region
$query = mysql_query("SELECT * FROM sell WHERE commodity = 'paper' 
                      AND region = '$region' ORDER BY price") 
   or die( mysql_error() ); 

echo '<table class="dbTable">';

//echo the rows in a while loop
while ($row = mysql_fetch_assoc($query))  
{ 

  echo '<tr><td>'.$row['commodity'].'</td> <td>'.$row['region'].'</td> <td>'.
                  $row['member'].'</td> <td>'.$row['size'].'</td> <td>'.
                  $row['price'].'</td> <td>'.$row['posted'].'</td> </tr>'; 
}
echo "</table>"; 
?> 

我收到了一些错误信息,但我相信只是我的操作有误!所以我正在逐个解决它们,非常感谢您的帮助...很快回来! - scotia
@scotia,把一个不该在那里的do留下了,对此很抱歉。 - Johan
@Scotia,AND region = '$region' 限制了结果只显示这些地区。我不知道你的数据库布局和字段名,所以你需要调整查询以匹配你的数据库,同时确保下拉列表中的值与你的数据库中使用的地区相同。 - Johan
谢谢 - 那很有道理,我会检查我所有的名称!我看不出其他原因导致它无法工作,再次感谢您,我肯定会回来烦你 :) - scotia
非常抱歉 - 仍然没有运气。我的数据库名为newTrader,包括sell在内的七个表,我想要用它来进行操作 - sell有七列,全部小写 - 其中一个是region。我已经回顾了函数名称和列、下拉菜单名称和选项名称,有趣的是当我包括AND region时没有数据显示,但如果我将其省略,我会得到原始结果集...这表明这是一个命名问题,但我找不到它! - scotia
显示剩余2条评论

3

好的,既然你没有回答,我会放置一个我经常使用并具有良好效果的小脚本。

它需要在你的网站中引入jQuery库。

$('select').change(function(){
var region  = $(this).val();
    $("tr").each(function () {
        if ($(this).text().search(new RegExp(region, "i")) < 0) {
            $(this).hide();
        } else {
            $(this).show();
        }
    });
});

您可以在这里查看其工作示例:http://jsfiddle.net/6psNF/1/ 您应该调整表格代码,例如,表格可以有一个ID,带有代码的行可以有一个类。以下是一个简单的示例:
<table id="trader">
<tbody>
<tr>
    <td>Random</td>
    <td class="region">E. Midlands</td>
    <td>Member</td>
    <td>Size</td>
    <td>Price</td>
    <td>Date</td>
    <td>Posted</td>
</tr>
</tbody>

因此,我编写的代码可能会以以下方式结束:
$('select').change(function(){
var region  = $(this).val();
    $("#trader tr").each(function () {
        if ($(this).text().find(".region").search(new RegExp(region, "i")) < 0) {
            $(this).hide();
        } else {
            $(this).show();
        }
    });
});

提高页面或超大表格性能!


非常抱歉 - 我错过了上面的帖子,一直在努力确保我没有混淆名字等信息 - 我真的很感激大家的帮助 - Scotia - scotia
我觉得我理解上面代码的目的,但是我不确定关于jquery的部分,而且担心如果我尝试与我现在正在使用的东西太不同的东西,我会更加困惑 - 很抱歉,各位,你们最后得到了这个笨蛋。我需要先显示所有数据,然后再用下拉列表过滤结果。 :) - scotia
这就是这个答案的作用!首先获取所有内容,然后进行过滤。在这里尝试http://jsfiddle.net/6psNF/1/,你会看到的。我最终选择了jquery解决方案,因为它只需要几行代码就可以实现出色的性能,而且因为你的问题被标记为jquery! - Antonio Laguna
如果您对此有更多问题,请留言。我会尽力帮助您。 - Antonio Laguna
大家好,再次感谢所有的支持。我仍在为此苦苦挣扎。我应该创建一个新问题还是继续在这里提问呢?非常感谢。 - scotia
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接