我正在使用这个“bootstrap-tags”jquery插件(https://github.com/maxwells/bootstrap-tags)为我正在处理的网络应用添加一个简单的标记界面。在快乐的路径中,我可以让插件正常工作,但实际上我需要从MySQL DB中拉出页面加载时显示的标签。我现在的代码是:
$.get("getCurrentTags.php",
{"id": id] },
function(data) {
$('#my-tag-list').tags({
tagData: data,
bootstrapVersion: "2"
});
}
);
这样做实际上会在Chrome控制台中出现以下错误:
Uncaught TypeError: Cannot use 'in' operator to search for '12' in ["Civil War"]
我认为这更像是一个普遍的问题,并且与'数据'如何格式化进入我的回调函数有关,特别是因为如果我手动输入类似的东西它会起作用
tagData: ["Civil War"]
但我无法弄清楚究竟是什么。
为了彻底,我的'getCurrentTags.php'看起来像这样:
include('db.php');
$oid = $_GET['id'];
$currentTags = array();
$currentTagsQuery = mysql_query("SELECT tag_name
FROM t_tag t
JOIN t_object_tag ot ON ot.tag_id = t.tag_id
WHERE ot.id = {$oid};")
or die(mysql_error());
while($tag = mysql_fetch_assoc($currentTagsQuery))
{
$currentTags[] = $tag['tag_name'];
}
echo json_encode($currentTags);
我今天大部分时间都被困在这上面而且完全被困住了;任何帮助都将不胜感激!谢谢!
答案 0 :(得分:0)
我在本地重新创建了您的示例,并使用以下方式执行:
$.getJSON("getCurrentTags.php", {"id": id}, function(data) {
$('#my-tag-list').tags({
tagData: data,
bootstrapVersion: "2"
});
});
另外需要注意的是,当您将未经过类型化的值直接插入SQL语句时,您的服务器端代码很容易受到SQL注入攻击。如果您可以使用,我建议您使用PDO。在您的示例中,我的服务器端代码如下所示:
$db = new PDO("mysql:host=localhost;dbname=test", 'root', '');
$stmt = $db->prepare(
"SELECT tag_name
FROM t_tag t
JOIN t_object_tag ot ON ot.tag_id = t.tag_id
WHERE ot.id = :id"
);
$stmt->bindParam(":id", $_GET['id']);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$currentTags = array();
foreach($result as $row) {
$currentTags[] = $row['tag_name'];
}
echo json_encode($currentTags);
可以找到对PDO的一个很好的介绍here。