首页 > 解决方案 > 关于路由飞行框架php的问题

问题描述

嗨,我正在使用飞行框架进行路由,我对以下代码示例有疑问。你能帮帮我吗)

功能:

function getCoursesByStudents($students)    {

// 1. connection to dbms/db
$mysqli = new mysqli('localhost', 'root', '....', 'university');
if ($mysqli->connect_errno) {
    die($mysqli->connect_error);
}

// 2. query
$query = "SELECT cs.student_id, c.id, c.title FROM courses_students cs, courses c WHERE cs.course_id = c.id AND cs.student_id = " . $students;

$resulthandle = $mysqli->query($query);
if (!$resulthandle) {
    die($mysqli->error);
}

// 3. prepare and return result
$resultforclient = array();
while ($result = $resulthandle->fetch_assoc())  {
    $resultforclient[] = $result;

}

$resulthandle->close();
return $resultforclient;

}

路由:

Flight::route('/students/@id/courses', function($id){
$result = getCoursesByStudents($id);
echo json_encode($result);

});

请您逐步向我解释以下示例:

http://localhost/university/backend/flight-master/students/1/courses

我最大的问题是cs.studen_ id .. --> = " . $students; 后面的sql查询部分的理解。

查询将如何采用 mysql 格式?

我是新手,所以请用简单的方法向我解释一下..非常感谢

标签: phpsqlframeworks

解决方案


$students是一个参数getCoursesByStudents()当您调用 时getCoursesByStudents($id),您将传递$id给该函数,并将 的值$id传递给$students变量。

$id本身由 决定Flight::route('/students/@id/courses',其中@表示 Flight 中的命名参数,它是从 URL 中的任何内容中获取的。因此,@id成为$id,并最终$students

这被传递到查询中:

$query = "SELECT cs.student_id, c.id, c.title FROM
courses_students cs, courses c WHERE cs.course_id = c.id AND cs.student_id = 1"

但是,这是以不安全的方式完成的,并且会让您面临相当严重的安全漏洞,这将允许学生查看其他学生的信息。

与其将 ID 直接传递到 SQL 语句中(使用... cs.student_id = " . $students),不如使用准备好的语句来参数化此查询:

$query = "SELECT cs.student_id, c.id, c.title FROM
courses_students cs, courses c WHERE cs.course_id = c.id AND cs.student_id = ?";
$query->bind_param("s", $students); 
$query->execute();

推荐阅读