Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery使用PHP+MySQL构建的对象数组自动完成_Javascript_Php_Jquery_Mysql_Ajax - Fatal编程技术网

Javascript JQuery使用PHP+MySQL构建的对象数组自动完成

Javascript JQuery使用PHP+MySQL构建的对象数组自动完成,javascript,php,jquery,mysql,ajax,Javascript,Php,Jquery,Mysql,Ajax,我有一个MySQL表,如: name | id John | 1 Mike | 2 Kelly | 3 在Jquery中,我可以使用自动完成在弹出列表中显示名称,同时在输入中插入id: var names=[ {label:"John", value:1}, {label:"Mike", value:2}, {label:"Kelly", value:3} ]; $('#myDiv').autocomplete({ source: names })

我有一个MySQL表,如:

name   | id
John   | 1
Mike   | 2
Kelly  | 3
在Jquery中,我可以使用自动完成在弹出列表中显示名称,同时在输入中插入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中为每个对象添加标签和值,或者什么可以解决这个问题


提前感谢您的帮助

您需要使用PHP header方法来执行以下操作:

header('CONTENT-TYPE: application/json');
echo json_encode($output);
可能需要参考文档,以防我在那里输入错误:

但在任何情况下,一旦JSON的返回类型是正确的内容类型,JQuery将自动将该响应转换为对象数组

[编辑]问题第二部分的附录:

要使auto complete正常工作,它取决于您的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) );


非常确定,您只需要在PHP中向对象添加“label”和“value”,这将返回正确格式的值。此外,为了更轻松地处理json内容类型,请使用$.getJSON而不是$.ajax。请看@Mordred,我正在尝试,但它不起作用,请粘贴一个示例代码来替换:array_push$output,array$key{nome}=>intval$key{id};正在返回:警告:无法修改标题信息-标题已由从开始的输出发送。。。与上面相同的结果一起。然后,您在回显代码之前回显了阻止发送头的内容,正如它所说的。这可能是因为您实际上在代码中回显了一些内容,也可能是一个简单的错误,例如在某个文件中的?>后面有空格或返回,这就是为什么PHP建议永远不要使用?>关闭文件,请注意这里的第三段关于省略PHP关闭标记的内容:我看不到弹出窗口的代码,但是,如果您仍然将JSON看作一个字符串,那么返回需要发送application/JSON的标题。如果它发送application/json,jQuery应该正在解析它,并且您应该能够在success方法中执行:response[0]。label。
$results = array();
foreach($rows as $key){
    $arr          = array();
    $arr['label'] = $key['nome'];
    $arr['value'] = intval($key['id']);
    $results[]    = $arr;
};
echo( json_encode($results) );