如何在javascript中使用从数据库返回的行中的数据
Posted
技术标签:
【中文标题】如何在javascript中使用从数据库返回的行中的数据【英文标题】:How to use data in rows returned from a database in javascript 【发布时间】:2011-09-04 05:34:31 【问题描述】:使用 javascript 我需要从数据库表中获取一些行,然后遍历每一行并使用每一行中的不同字段。
例如,如果我得到这样的行:
var coordinatesArray = '<?php
global $wpdb;
echo $wpdb->get_var("SELECT * FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40);
?>';
我应该如何编写以下代码:
// for each row do:
// alert the id field
// alert the lat field
// alert the long field
//
【问题讨论】:
【参考方案1】:JSON 是输入输出的方式,可确保结果是有效的 JavaScript,并保护您免受 JS 中的任意代码执行。
var coordinatesArray = <?php
global $wpdb;
// replace * by id, lat and long since you don't need other fields
$sql = "SELECT id, lat, long FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40";
$rows = $wpdb->get_results($sql);
// if the function fails (?), make valid JS syntax
if (is_array($rows))
echo json_encode($rows);
else
echo '[]';
?>;
for (var i=0; i<coordinatesArray; i++)
alert(coordinatesArray[i].id);
alert(coordinatesArray[i].lat);
alert(coordinatesArray[i]["long"]);
另一种方法是创建一个以id
字段作为JS对象键的JS对象:
var coordinatesMap = <?php
global $wpdb;
// replace * by id, lat and long since you don't need other fields
$sql = "SELECT id, lat, long FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40";
// note: OBJECT_K, the result will be an associative array with the first field of a
// row as key
$rows = $wpdb->get_results($sql, OBJECT_K);
// if the function fails (?), make valid JS syntax
if (is_array($rows))
echo json_encode($rows);
else
echo '';
?>;
for (var id in coordinatesMap)
if (coordinatesMap.hasOwnProperty(id))
alert(id);
alert(coordinatesMap[id].lat);
alert(coordinatesMap[id]["long"]);
请用别的东西替换alert
,这不是真正的用户友好。请记住 PHP != JavaScript 并且您不能在 JavaScript 中使用 PHP 函数,反之亦然。如果您不确定输出的样子,请使用页面的查看源代码选项。
参考资料:
http://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results【讨论】:
@Lekensteyn,首先 - 谢谢!第二 - 一种方法比另一种更好/更快吗? @Ash:我发现第二个比前者更干净。两者都是正确的,但是如果您打算进行快速 id lat/long 查找,则第二种方法是要走的路。我刚刚注意到该字段名为long
,这是一个保留供将来使用的关键字。查看我的编辑。
@Lekensteyn,太好了。非常感谢!
@Lekensteyn,我成功地在我的代码中实现了你的第二个建议,但有一件事我仍然不明白 - 在我的 sql 查询中,我实际上使用$sql = "SELECT user_id, ...
而不是$sql = "SELECT id, ...
,就像我在这里写的那样.但是在您建议的 for 循环中,我在您编写它时使用了 var id
,它仍然有效。它是如何知道将 user_id 映射到 id 的? User_id 虽然是唯一的,但并未定义为数据库中的键。
@Ash:如果user_id
不是唯一的,不要使用第二个代码,因为当结果中出现具有相同user_id
的记录时会导致数据丢失。 id
和id in coordinatesMap
一样定义了一个JavaScript 变量,键为coordinatesMap
,也可以命名为the_key_in_coordinatesMap
,与数据库中的id
字段无关。如果第二个参数设置为OBJECT_K
,$wpdb->get_results()
方法使用第一个字段作为键。【参考方案2】:
您可能有更好的时间编写自己的自定义 PHP 脚本来获取这些值(而不是依赖于 WP),遍历它们,并构建一个返回给 javascript 的 json 对象。
【讨论】:
【参考方案3】:首先,$wpdb->get_var 只能获取一个值。 http://codex.wordpress.org/Class_Reference/wpdb#SELECT_a_Variable
改用 $wpdb->get_results http://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results
var coordinatesArray = '<?php
global $wpdb;
echo $wpdb->get_results("SELECT * FROM users_coordinates WHERE lat>20 and lat<40 and long>-10 and long<40);
?>';
for(coord in coordinatesArray)
alert(coordinatesArray[coord].id);
alert(coordinatesArray[coord].lat);
alert(coordinatesArray[coord].long);
我没有测试过,但应该是这样的。
【讨论】:
不行,数组是[]
,而不是''
。 echo $wpdb->het_result(...)
只给出Array
,而不是它的表示。
@Domenic,你能说说你是怎么做的吗?
@Ash,通过使用普通的for (var i = 0; i < coordinatesArray.length; ++i)
循环。 for ... in
不是用于数组,而是用于对象。它将枚举数组的所有 enumerable
属性,包括由 Prototype.js 框架添加的任何属性或任何可能或可能不受您控制的用户代码。
除非您可以确定一个对象没有继承属性,否则您还需要进行obj.hasOwnProperty(key)
检查以查看属性是否被继承。但我认为这超出了这个问题的范围。
@Codler,感谢get_var
的回答和修复。可能为我节省了很多调试时间。以上是关于如何在javascript中使用从数据库返回的行中的数据的主要内容,如果未能解决你的问题,请参考以下文章