mysql - 如何从mysql获取数据并使用ajax以表格形式显示
问题描述
我创建了一个表单,我希望在输入 user_id 时使用来自 mysql 的数据自动填充(要自动填充的 first_name 和 last_name 字段)。我已经使用 ajax 来执行此操作,并且这些数据(我的意思是指 user_id 输入的 first_name 和 last_name )完全是从数据库中获取的,但我并没有因为 XMLHttpRequest.response 正在发回而以那种形式恢复它们整个“form.ejs”代码而不是发送这些数据。我只是nodejs的初学者,你能帮我解决它吗?看看我的代码的这些部分:
表单.ejs
<label for = "user_id">User Id:</label>
<input type='text' name="user_id" id="user_id" class="form-control" placeholder="Enter user id" onkeyup="GetDetail(this.value)" value="">
<label for = "first_name">First Name:</label>
<input type="text" name="first_name" id="first_name" class="form-control" placeholder='First Name' value="">
<label>Last Name:</label>
<input type="text" name="last_name" id="last_name" class="form-control" placeholder='Last Name' value="">
form.ejs 链接到下面的脚本 ajax.js
ajax.js
function GetDetail(str) {
if (str.length == 0) {
document.getElementById("first_name").value = "";
document.getElementById("last_name").value = "";
return;
} else {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function (results) {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
var myObj = JSON.parse(this.responseText);
document.getElementById("first_name").value = myObj[0];
document.getElementById("last_name").value =myObj[1];
}
}
xmlhttp.open("GET", "/?user_id=" + str, true);
xmlhttp.send();
}
}
“this.responseText”发回整个“form.ejs”脚本,但我希望它发回数据库中获取的数据(名字和姓氏)。
这是服务器端 Server.js
app.get('/', function (req, res) {
var userid = req.query.user_id;
var data = [];
if (userid !== ""){
connection.query("SELECT * FROM userdata WHERE user_id = ?",[userid], function (err, results, fields) {
if(err) {
console.log(err);
} else {
for (var i = 0; i < results.length; i++) {
var a = results[i].first_name;
var b = results[i].last_name;
}
}
data.push(a, b);
var obj = JSON.stringify(data);
res.render("form", {obj:obj});
});
解决方案
您错误地使用了 EJS。EJS 是一个模板引擎,因此您正在做的是返回“表单”ejs 而不是 JSON 本身。
这使您有两个选择。
1)创建一个 API 路由以仅返回 JSON 2)将您的查询返回到 EJS 并让它呈现它
就个人而言,除非有理由通过 ajax 执行此操作,否则我只会将其呈现为 EJS 的一部分
要在 ejs 中呈现它,您想要做的是
节点
app.get('/', function (req, res) {
var userid = req.query.user_id;
var data = [];
if (userid !== ""){
connection.query("SELECT * FROM userdata WHERE user_id = ?",[userid], function (err, results, fields) {
if(err) {
console.log(err);
} else {
//replace ejstemplate with ejs to render
res.render('ejstemplate', {
//results will be accessable in the template
results: results
})
}
});
所以基本上我们所做的就是从查询中获取响应并将其传递给 EJS 可以使用的变量。注意:我不使用 mysql,因此它返回响应的方式可能会有所不同,在 postgres 中将响应放在“行”对象中,以便控制台输出您需要的内容,但对于 PG,响应将是 results.rows (这是一个 JSON 对象)
然后在您的 EJS 模板上,您可以访问响应,例如
<%-results[0].first_name%>
如果需要,您还可以循环遍历项目。如前所述,EJS 是一种模板语言,因此它允许您将变量等传递给页面,并且 EJS 将在服务器而不是客户端上呈现它。同样,这通常是更好的选择,除非您需要通过 XHR...
另一方面,如果您确实需要使用 XHR,那么响应会有所不同,如前所述,类似于
res.json(results);
这将以 JSON 格式返回结果,然后您可以在客户端执行所需的操作。
推荐阅读
- machine-learning - ML,AI,深度学习之间的区别
- arrays - 计算目录中包含我的数组中不同变量的文件数 - bash 脚本
- javascript - Javascript异步获取循环内的请求
- python-3.x - cgi:error pid 1217 client {IP}:55101 malformed header from script 'master3.py': Bad header: Database aangemaakt en succesv
- sql - 如何从数据库中的字符串字段中提取数字(整数)并找到最大值
- docker - Docker Go lang SDK 从 ContainerExecCreate 不返回任何内容
- excel - 无法将数据从另一张表复制到主表。调用子副本时执行vba下标超出范围错误9
- linux - 用于读取远程 VM 上 docker 容器化应用程序日志文件的 shellscript 不起作用
- html - 表单选择大小不适用于数据库填充选项
- python-3.x - 为什么在使用 pandas、matplotlib 和 seaborn 绘制图形时会有不必要的空格?