我的home.ejs文件中有一个for循环,如下所示。当我从app.js文件中访问req.params.name并将其发送到watch_movie.ejs时,只发送第一个索引元素。为什么我无法访问其他索引。
home.ejs文件:
<%data.forEach((item)=>{%>
<li>
<a href="watch_movie/:<%=item.Name%>"><img src="<%=item.Image_path%>" height=200px width=150px alt="<%=item.Name%>"></a>
<p><%=item.Name%></p>
</li>
<%});%>
watch_movie.ejs文件:
<video width="780px" height="450px" controls>
<source src="<%=path.Video_path%>"><!-getting video_path of only first elemnt ->
your website doesn't support video
</video>
app.js文件:
app.get('/', (req, res) => {
const sql = 'select * from Movies';
db.query(sql, (err, result) => {
if (err)
throw err;
else {
const s_res = JSON.stringify(result);
const j_res = JSON.parse(s_res);
// const image_data = j_res[0].name;
res.render('home.ejs', { data: j_res });
}
});
});
app.get('/watch_movie/:name', (req, res) => {
const name = req.params.name;
const sql = "select * from Movies where Name=name";
db.query(sql, (err, result) => {
if (err)
throw err;
else {
const s_res = JSON.stringify(result);
const j_res = JSON.parse(s_res);
const movie = j_res[0];
console.log(movie);//it consoles proper element
res.render('watch_movie', { path: movie });
}
});
});
答案 0 :(得分:0)
您的SQL存在问题,请注意您写道:Name = name
。
既然SQL不区分大小写,它基本上等同于name = name
,所以你要将name的值与它的self进行比较,它总是TRUE
。
之后,您从结果中获取第一个值:const movie = j_res[0];
,这就是您始终获得第一行的原因。
简单的解决方案(不推荐)是改变 这样:
const sql = "select * from Movies where Name=name";
对此:
const sql = "SELECT * FROM movies WHERE name="+name;
这应该有用,但直接连接值 - 有SQL injection漏洞,这是一个很大的风险。
所以我建议你做的是将prepared statement与参数化值一起使用。
像这样:
const name = req.params.name;
const sql = "SELECT * FROM movies WHERE name = ?";
const paramValues = [name];
db.query(sql, paramValues, (err, result) => {
//Your code...
});