В ejs for loop указывается только первый элемент ссылки href. - PullRequest
0 голосов
/ 19 мая 2018

У меня есть цикл for в моем файле home.ejs, как показано ниже. Когда я получаю доступ к req.params.name из моего файла app.js и отправляю его в 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 });
       }
   });
});

1 Ответ

0 голосов
/ 20 мая 2018

Существует проблема с вашим SQL, обратите внимание, что вы написали: Name = name.Теперь, поскольку SQL нечувствителен к регистру, он в основном эквивалентен name = name, поэтому вы сравниваете значение имени с его собственным значением, которое всегда будет TRUE.После этого вы берете первое значение из результатов: const movie = j_res[0];, поэтому вы всегда получаете первый ряд.

Простое решение (не рекомендуется) состоит в том, чтобы изменить это:

const sql = "select * from Movies where Name=name";

К этому:

const sql = "SELECT * FROM movies WHERE name="+name;

Это должно работать, но объединять значения напрямую - имеет SQL-инъекция уязвимость, которая представляет большой риск.

Итак, я рекомендую вам использовать подготовленный оператор с параметризованными значениями.

Как это:

const name = req.params.name;
const sql = "SELECT * FROM movies WHERE name = ?";
const paramValues = [name];
db.query(sql, paramValues, (err, result) => {
   //Your code...
});
...