1

我正在寻找执行以下操作:

  • 在我的主页上有一个搜索表单,它允许我在客户数据库中搜索他们的名字。然后创建一个包含结果的组合框。

我有以下 php 文件。search.php 包含用于查询数据库并将其保存到会话数组中的代码。

<?php
include 'newCustomer.php';
connect('final');


    $query = $_POST['searchDB']; 
    $query = htmlspecialchars($query); // stop HTML characters
    $query = mysql_real_escape_string($query); //stop SQL injection
    $data = mysql_query("SELECT * FROM customer WHERE First_Name LIKE '$query'") ;//query the DB with search field in colleumn selected//



    if($data === FALSE) {
    $error = 'Query error:'.mysql_error();
    echo $error;
    }
    else
    {
    $test = array();
    $colNames = array();
    while($results = mysql_fetch_assoc($data)){// puts data from database into array, loops until no more

    $test[] = $results;

        }
         $anymatches = mysql_num_rows($data); //checks if the querys returned any results
        if ($anymatches != 0) {
        $_SESSION['names']=$test;

    $colNames = array_keys(reset($test));


    }

            if ($anymatches == 0) 
                    { 
                        echo "Sorry, but we can not find an entry to match your query<br><br>"; 
                    } 

    } 

//header("location: newCustomer.php");
//die
?>

以及我主页中的以下代码,它使用数组创建名称组合框。

if (isset($_SESSION['names'])){
echo "Customers";
$array1 = $_SESSION['names'];
echo'<select name="customers>';
foreach($array1 as $name){
echo'<option value="'.$name["First_Name"].'">'.$name["First_Name"].'</option>';
}
echo'</select>';


}

?>

一旦提交了包含搜索参数的表单,就会执行 search.php 操作。

我的数据库具有以下名称。

丹·史密斯丹·汤姆·丹·丹·吉姆·史密斯吉姆·汤姆·吉姆·吉姆。

但是,当我搜索 dan 时,当我搜索 Jim 时,组合框是由 Dan 重复 24 次创建的,它是由 Jim 列出两次创建的……为什么它会产生如此看似随机的结果?

谢谢,

4

1 回答 1

0

首先,好心的意思是,这段代码无处可去,最终不会让你得到你想要的。我的建议是重新开始。

我认为您想要的是能够从组合框中选择用户。如果是这样,您最好尝试稍有不同。

实际上有几种方法可以做到这一点:

  1. 使用 POST 将搜索词发送到脚本,然后呈现整个下一页。
  2. 使用 AJAX 创建一个新的组合框而不渲染整个页面。
  3. 使用 AJAX 创建 Google Suggest 样式下拉框。
  4. 你的方式。

方法 3 包含在 w3schools.com 上的优秀 AJAX 教程中,这将是实现您所需要的最佳方法。

由于您使用了类似于方法 1 的内容,因此以下代码将生成合适的下拉菜单。请注意使用 mysqli_* 作为已弃用的 mysql_* 的更好替代方案:

$searchtext=mysqli_real_escape_string($mysqlidb,$_POST['searchDB'];
$sql="SELECT userid,forename,surname FROM users WHERE forename LIKE '%$searchtext%'";
$result=$mysqlidb->query($sql);
$combo="<SELECT name='customers'>";//note you had an error in your quotes on yours
while($row=$result->fetch_asssoc())
    {
    $combo.=sprintf("<OPTION value='%s'>%s %s</OPTION>",$row['userid'],$row['forename'],$row['surname']);
    }
echo $combo;

这应该会返回一个 $_POST['customers'] ,其中包含客户的用户 ID。您的方法将返回名字,这可能意味着您选择了错误的客户。

在安全的环境中,您还希望混淆用户 ID,因为将密钥公开给这样的表是一种不好的做法,但只要您将来认识到这一事实,我就会开始使用代码作为写 - 更容易调试,直到你有信心。

您还可以使用此代码为方法 2 生成所需的下拉列表,但实际上,这可能最好保留在第二个组合框需要根据用户选择的第一个组合框需要更改的地方。

如果您仍然得到重复的名称,您可能会发现值得尝试 var_dump($test); 看看你的桌子是否比你想象的多一点......

如果这个答案很好,请不要忘记选择它,因为它可以帮助其他人查看哪些有效,哪些无效。如果它不起作用,请出于同样的原因添加评论。

于 2013-06-08T22:09:43.433 回答