使用PHP + MySQL构建的使用Array对象的JQuery自动完成

时间:2014-02-05 16:06:36

标签: javascript php jquery mysql ajax

我有一个像MySQL这样的表:

name   | id
John   | 1
Mike   | 2
Kelly  | 3

在Jquery中,我可以在弹出列表中使用自动完成显示“name”,同时在输入中插入“id”:

var names=[
    {label:"John", value:1},
    {label:"Mike", value:2},
    {label:"Kelly", value:3}
];
$('#myDiv').autocomplete({
    source: names
})

这工作正常,但现在我需要使用PHP重现对象“名称”的数组。我在PHP中尝试以下内容:

$sql ="SELECT id, nome FROM table";
    $result = $pdo->query($sql);
    $rows = $result->fetchAll(PDO::FETCH_ASSOC);

    $output=array();;

    foreach($rows as $key){
        array_push($output, array($key{"nome"}=>intval($key{"id"})));
    };

    echo json_encode($output);

这是回归:

[{"John":1},{"Mike":2},{"Kelly":3}]

在Jquery中,我现在使用Ajax来调用myscript.php:

var names= [];
    $.ajax({
        url: "../myscript.php",
        success: function (response) {
            names = response.split(",");
        }
    });

但这只是在单元格中显示相同的结果:

[{"John":1},{"Mike":2},{"Kelly":3}]

所以,我想这个问题是为PHP中的每个对象添加标签和值,或者什么可以解决问题?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要使用PHP header()方法:

header('CONTENT-TYPE: application/json');
echo json_encode($output);
如果我在那里输入拼写错误,

可能想参考文档。)

但无论如何,一旦JSON的返回类型是正确的内容类型,JQuery就会自动将该响应转换为对象数组。

[edit]附录......问题的第二部分:

要使自动完成工作,它取决于您的IDE ...并且您的IDE依赖于您使用的同一语言中的对象定义。我用phpStorm。因此,如果我想在phpStorm中为JavaScript AJAX返回进行自动完成工作,我将不得不创建一个虚拟JavaScript对象(这可能在您的代码中的任何位置,甚至是一个未使用的JS文件,仅用于定义虚拟对象......只需要IDE可以解析一个唯一的名称:

//dummy object used for auto-completion to work
function NameObject(param, param2) {
    this.label = param;
    this.value = param2;
}

然后,在我的AJAX回归中,我必须把:

success: function(response) {
    /** @var NameObject[] response */
}

我不知道有任何其他方法可以做到这一点,以及它的效果取决于IDE。我从来没有为JavaScript做过这件事,因为它似乎比它的价值还要多。

[edit2]关于格式化PHP以输出具有命名键的对象的附录 好吧,也许我误解了......一开始并没有注意到你的标签不在你输出的JSON中......所以在你的PHP中,如果你想让.label和.value工作,你的PHP需要像这样生成它:

$results = array();
foreach($rows as $key){
    $obj        = new stdClass();
    $obj->label = $key['nome'];
    $obj->value = intval($key['id']);
    $results[]  = $obj;
};
echo( json_encode($results) );

OR

$results = array();
foreach($rows as $key){
    $arr          = array();
    $arr['label'] = $key['nome'];
    $arr['value'] = intval($key['id']);
    $results[]    = $arr;
};
echo( json_encode($results) );