将mysql查询的结果保存到不产生预期结果的会话变量数组中

时间:2013-06-08 21:03:17

标签: php mysql

我希望做到以下几点:

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

我有以下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
?>

和我的主页中的folling代码,它使用该数组创建一个名称组合框。

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时,组合框创建时Dan重复了24次 当我搜索吉姆时,它与吉姆一起创建了两次......为什么它会产生看似随意的结果呢?

感谢,

1 个答案:

答案 0 :(得分:0)

首先,善意的是,这段代码无处可去,最终无法满足你的需求。我的建议是重新开始。

我认为你想要的是能够从组合框中选择用户。如果是这样的话,你可以稍微尝试一下。

实际上有几种方法可以实现这一目标:

  1. 使用POST将搜索词发送到脚本,然后呈现整个下一页。
  2. 使用AJAX创建新的组合框而不渲染整个页面。
  3. 使用AJAX创建Google Suggest样式下拉框。
  4. 你的方式。
  5. w3schools.com上的优秀AJAX教程涵盖了方法3,这将是实现您所需要的最佳方式。

    由于您使用了类似于方法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);看看你的桌子是否比你想象的更多...

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