2 回答
TA贡献1818条经验 获得超3个赞
与 Miken32 的建议相呼应,使用 aJOIN同时从两个表中获取数据,还使用ORDER BY school_number. 然后,当您遍历组合表时,请记住(在局部变量中)school_number您看到的最新内容,这样您就可以注意到值何时发生变化……当您从一所学校搬到另一所学校时。(如果你在“学校之间”做事,别忘了在循环结束后做最后一次......)
现在的查询将需要更长的时间来执行(当然,无论如何您都应该teachers通过...索引表school_number),但它只会执行一次,并且会一次性为您提供所需的所有答案。
而且,是的,在编写新查询时使用“准备好的语句”:level在这种情况下,只有一个参数。
不用说,如果您真的打算对“所有级别”执行此操作,只需忽略该测试,ORDER BY LEVEL, SCHOOL_NUMBER并注意两列值的变化。数据库会很乐意一次性为您提供所需的所有信息。
TA贡献1877条经验 获得超1个赞
准备好的语句有两个优点。首先,用户输入被转义以解决 SQL 注入的任何问题。其次,该语句可以准备一次但多次执行以减少开销。您正在避免这两个好处。
尝试这样的事情:
<?php
$level = $_GET['level'];
// we use a placeholder and pass the value to execute()
$sql = "SELECT school_number FROM schools WHERE level = ? ORDER BY school_number";
$stmt = $PDO->prepare($sql);
if($stmt->execute([$level])) {
$schools = $stmt->fetchAll(\PDO::FETCH_ASSOC);
$sql = "SELECT * FROM teachers WHERE school_number = ?";
// note statement is prepared outside the loop
$stmt2 = $PDO->prepare($sql);
foreach($schools as $school) {
if($stmt2->execute([$school["school_number"]])) {
while ($teachers = $stmt2->fetch()) {
//GENERATE XLSX FILE WITH DATA
}
}
}
}
虽然你可能会用 aJOIN来代替:
<?php
$level = $_GET['level'];
$sql = "SELECT teachers.* FROM teachers LEFT JOIN schools USING (school_number) WHERE schools.level = ?";
$stmt = $PDO->prepare($sql);
if($stmt->execute([$level])) {
while ($teachers = $stmt->fetch()) {
//GENERATE XLSX FILE WITH DATA
}
}
- 2 回答
- 0 关注
- 221 浏览
添加回答
举报
