Javascript Mysql或语句使用AJAX返回数组中的所有行名称值,然后在Google Maps API V3中加载多个标记
我对我的MySQL查询有疑问,因为当我搜索诸如生日、年龄、性别等内容时,它无法返回结果,但当我搜索姓名时,它只返回一个结果 JavaScript/AJAX代码: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
$(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');