Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.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 Mysql或语句使用AJAX返回数组中的所有行名称值,然后在Google Maps API V3中加载多个标记_Javascript_Mysql_Google Maps_Google Maps Api 3_Codeigniter 3 - Fatal编程技术网

Javascript Mysql或语句使用AJAX返回数组中的所有行名称值,然后在Google Maps API V3中加载多个标记

Javascript Mysql或语句使用AJAX返回数组中的所有行名称值,然后在Google Maps API V3中加载多个标记,javascript,mysql,google-maps,google-maps-api-3,codeigniter-3,Javascript,Mysql,Google Maps,Google Maps Api 3,Codeigniter 3,我对我的MySQL查询有疑问,因为当我搜索诸如生日、年龄、性别等内容时,它无法返回结果,但当我搜索姓名时,它只返回一个结果 JavaScript/AJAX代码: $(document).ready(function () { $("#searchDataToMarker").keyup(function () { var value = $(this).val(); $.ajax({ type: "POST", url: "<?php ech

我对我的MySQL查询有疑问,因为当我搜索诸如生日、年龄、性别等内容时,它无法返回结果,但当我搜索姓名时,它只返回一个结果

JavaScript/AJAX代码:

$(document).ready(function () {
$("#searchDataToMarker").keyup(function () {
    var value = $(this).val();
    $.ajax({
        type: "POST",
        url: "<?php echo base_url('Maps/mapSearchDataInMarker') ?>",
        data: {
            'searchDataToMarker': value
        },
        dataType: "JSON",
        success: function (searchMapDataResult) {
            if (searchMapDataResult.length !== null || $('searchDataToMarker').value !== '' || searchMapDataResult['latlong'] !== '') {
                //we need to check if the value is the same
                $("#searchResult").html(searchMapDataResult['lname']);
                console.log(searchMapDataResult['lname']);
                console.log(searchMapDataResult['latlong']);
                var latlong = parseFloat(searchMapDataResult['latlong']);
                var myLatLong = new google.maps.LatLng(7.289600,125.678066);
                var iw = new google.maps.InfoWindow();
                var myOptions = {
                    zoom: 15,
                    center: myLatLong,
                    mapTypeId: google.maps.MapTypeId.HYBRID
                },
                map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

                var markerOptions = {
                    map: map,
                    position: myLatLong
                };
                marker = new google.maps.Marker(markerOptions);
                //for (var i = 0, length = searchMapDataResult.length; i < length; i++) {
                google.maps.event.addListener(marker, "click", function () {
                    iw.setContent(searchMapDataResult['lname']);
                    iw.open(map, marker);
                });
            //}
            } else {
                $("#searchResult").html('');
                alertify.alert('Search result empty.').set('modal', false);
                return;
            }
        }
    });
});
});

我的观点是:我只想搜索MySQL数据库中的任何内容,当输入匹配数据库中的一个内容(在姓名、中名、姓氏、性别、年龄、生日等列中)时,它会返回一个结果数组,然后在Google Maps API V3中精确定位所有匹配结果。

这里有三个问题:首先,
mapSearchDataInMarker()
包含SQL注入漏洞,您需要了解如何使用CI安全地注入参数

第二,您只能返回一个JSON字符串,但您要回显多个JSON字符串

最后,如果没有结果,您将回显一个空字符串,但这不是有效的JSON

$results = array();
if (isset($_POST['searchDataToMarker'])) {
    $searchData = $_POST['searchDataToMarker'];
    // @todo Fix security vulnerability
    $query = $this->db->query("
        SELECT * FROM resident
            WHERE name LIKE '%{$searchData}%'
            OR mname LIKE '%{$searchData}%'
            OR lname LIKE '%{$searchData}%'
            OR gender LIKE '%{$searchData}%'
            OR bday LIKE '%{$searchData}%'
            OR age LIKE '%{$searchData}%'
            OR citizenship LIKE '%{$searchData}%'
            OR occupation LIKE '%{$searchData}%'
            OR status LIKE '%{$searchData}%'
            OR purok LIKE '%{$searchData}%'
            OR resAddress LIKE '%{$searchData}%'
            OR perAddress LIKE '%{$searchData}%'
            OR email LIKE '%{$searchData}%'
            OR telNum LIKE '%{$searchData}%'
            OR cpNum LIKE '%{$searchData}%'
    ");
    foreach ($query->result() as $searchResult) {
        $results[] = $searchResult;
    }
}

echo json_encode($results);
我猜您现在需要修改此JavaScript:

success: function (searchMapDataResult) {
改为接受数组。由于您使用的是jQuery,因此可以使用其
每个
迭代器来处理每个项:

success: function (searchMapDataResults) {
    $.each(searchMapDataResults, function(searchMapDataResult) {
        // Original code here
    });
注意,为了可读性,我也重新格式化了查询。我建议你也改进你的缩进


编辑:我直接通过URL(Maps/mapSearchDataInMarker)尝试了实时AJAX操作,结果如下:

遇到一个PHP错误

严重性:通知

消息:未定义变量:结果

文件名:controllers/Maps.php

电话号码:482

回溯:

文件:/home/ubuntu/workspace/application/controllers/Maps.php 电话号码:482 函数:\u错误\u处理程序

文件:/home/ubuntu/workspace/index.php 电话号码:292 功能:需要一次 空的

请允许我第五次提到,如果您检查对这个AJAX端点的原始响应,您将看到这个输出。因为这不是有效的JSON,所以在JavaScript中检查它没有任何价值您是否在浏览器中使用网络监视器?

从您的代码来看,似乎这就是问题所在-您的数组变量初始化被注释掉了

//        $results = array();
编辑:我还注意到,在POST操作期间,响应没有正确的HTTP头,而且,据我所知,您只返回一条记录。要解决标题问题,在解决上述变量问题后,请在
echo
之前使用此选项:

header('Content-Type: application/json');
另外,看起来您首先需要调试传递给AJAX op的
——它在实时应用程序中始终为空


有很多要调试

是的,我已经知道我的MySQL查询有问题,我将尝试您建议的查询和jQuery代码。顺便说一句,我已经习惯了我的缩进风格,所以tnx作为反馈,我想它根本不可读。。。当这起作用时,我会回呼。我无法获取列名的值。当我执行
console.log(searchMapDataResults[searchMapDataResults])
时,结果是
对象{resident\u id:“14”,name:“asdfasdf”,mname:“adsfasd”,lname:“adsfas”,gender:“adsfasf”…}
。当我执行
console.log(searchMapDataResults)
时,结果是
[Object,Object,Object,Object,Object,Object,Object,Object]
,这让我对如何获取这些值感到困惑。请帮忙@halfer@emo_noel10:是否尝试使用
$.each()对其进行迭代?是的,如果在结果数组上执行
console.log()
,应该会得到一个对象数组-因此现在需要对它们进行迭代以读取每个对象。是的,但结果未定义。我会尽快准备一把js小提琴。@halfer是的,我使用
console.log()
将数据打印到控制台。返回值似乎很正常,但生成多个标记是一个新问题。也许我发布了新问题,因为我根据我的新想法修改了js代码。
header('Content-Type: application/json');