如何在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的记录时会导致数据丢失。 idid in coordinatesMap 一样定义了一个JavaScript 变量,键为coordinatesMap,也可以命名为the_key_in_coordinatesMap,与数据库中的id 字段无关。如果第二个参数设置为OBJECT_K$wpdb-&gt;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-&gt;het_result(...) 只给出Array,而不是它的表示。 @Domenic,你能说说你是怎么做的吗? @Ash,通过使用普通的for (var i = 0; i &lt; coordinatesArray.length; ++i) 循环。 for ... in 不是用于数组,而是用于对象。它将枚举数组的所有 enumerable 属性,包括由 Prototype.js 框架添加的任何属性或任何可能或可能不受您控制的用户代码。 除非您可以确定一个对象没有继承属性,否则您还需要进行obj.hasOwnProperty(key) 检查以查看属性是否被继承。但我认为这超出了这个问题的范围。 @Codler,感谢get_var 的回答和修复。可能为我节省了很多调试时间。

以上是关于如何在javascript中使用从数据库返回的行中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从与数据透视相关的行中获取 Builder 对象 - Laravel

如何在Google表格中使用QUERY返回最大日期的行?

如何从最后插入的行中获取值? [复制]

获取使用Javascript单击的行中HTML单元格的值

如何从具有由“|”分隔的字段的行中提取数据C++中的字符?

如何从特定小时范围内的行中选择最小值?