【问题标题】:Autocomplete outputting two fields from DB自动完成从数据库输出两个字段
【发布时间】:2018-12-12 16:02:20
【问题描述】:

我有以下代码用于自动完成输入,用户可以输入员工的nome 而不是ID

if (isset($_GET['term'])){
    $return_arr = array();

    try {
        $conn = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME, DB_USER, DB_PASSWORD);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $conn->prepare('SELECT * FROM colaboradores WHERE nome LIKE :term');
        $stmt->execute(array('term' => '%'.$_GET['term'].'%'));

        while($row = $stmt->fetch()) {
            $return_arr[] =  $row['nome'];
        }



    } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }


/* Toss back results as json encoded array. */
echo json_encode($return_arr);

现在的输出是这样的:

我需要输出带有 ID 的名称,但只将nome 信息发送到数据库

更新 这是脚本:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.1/jquery-ui.min.js"></script>  
<link rel="stylesheet" href="css/autocomplete.css" />       
<script type="text/javascript">
    $(function() {  
        //autocomplete
        $(".auto").autocomplete({
            source: "search.php",
            minLength: 1,
            messages: {
                noResults: '',
                results: function() {}
        }
    });                
});
</script>

【问题讨论】:

  • 您是在使用 javascript 库从 PHP 中获取这些结果并将它们放在下拉列表中,还是您自己编写 js 代码。无论哪种方式,要么向我们展示 JS 代码,要么告诉我们您正在使用哪个库
  • 哦,当然对不起!我已经更新了问题!
  • 如果您只需要两列,建议不要使用select *,请改用`select columna columnb'。
  • @Abhishek 谢谢!
  • 现在什么类型的元素有类.auto

标签: javascript php jquery jquery-ui-autocomplete


【解决方案1】:

我相信你可以给自动完成返回一个标签和一个值:

在你的 PHP 中:

while($row = $stmt->fetch()) {
    // add the ID inside () chars
    $return_arr[] =  [
        'label' => $row['nome'],
        'value' => $row['id']
    ]; 
}

在你的 JS 中:

$(function() {
    $(".auto").autocomplete({
        source: "search.php",
        focus: function(event, ui) {
            event.preventDefault();
            // manually update the textbox
            $(this).val(ui.item.label);
        },
        select: function(event, ui) {
            event.preventDefault();
            // manually update the textbox and readonly field
            $(this).val(ui.item.label);
            $("#other-input").val(ui.item.value);
        }
    });
});

或:您可以尝试将 ID 放在一些分隔符中,然后在发送到数据库之前删除 ID。像这样的:

if (isset($_GET['term'])){

    // strip out the (ID) before searching in DB
    $nomeOnly = preg_replace('/ \(.*\)/', '', $_GET['term']);

    $return_arr = array();

    try {
        $conn = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME, DB_USER, DB_PASSWORD);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $conn->prepare('SELECT * FROM colaboradores WHERE nome LIKE :term');
        $stmt->execute(array('term' => '%'.$nomeOnly.'%'));

        while($row = $stmt->fetch()) {
            // add the ID inside () chars
            $return_arr[] =  $row['nome'] . ' (' . $row['id'] . ')'; 
        }

    } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }

    /* Toss back results as json encoded array. */
    echo json_encode($return_arr);
}

【讨论】:

  • 我之前尝试过类似的方法,但问题是它在输入 Name(ID) 上写入并将其发送到数据库,因此它输入名称和 ID 它只应该是name :/
  • 这就是为什么您包含 $nomeOnly = preg_replace('/ \(.*\)/', '', $_GET['term']); 以在它到达数据库之前将其剥离。
  • 但它一直给我错误,就像员工不存在一样
  • 当我尝试使用该下拉菜单submit 员工时
  • 你能用上面的preg_replace()在表单提交的脚本中去掉字符吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2012-04-07
相关资源
最近更新 更多