如何在PHP中使用INNER JOIN查询auteurs表数据填充下拉选择框选项
问题分析与修复方案
现有代码存在的问题
- 查询逻辑错误:你需要获取所有作者数据,不需要关联
posts表,直接查询auteurs表即可,关联查询只会返回已经发布过文章的作者,不符合需求 - PDO用法错误:
exec()方法仅适用于执行 INSERT/UPDATE/DELETE 这类写操作,返回受影响行数,查询数据需要用query()或者预处理语句,执行后调用fetchAll()获取结果集,你直接遍历SQL字符串$sql2肯定无法拿到数据 - 下拉框渲染逻辑错误:你把查询逻辑写在了单个
<option>标签的value属性内,就算拿到数据也只会生成一个选项,应该循环遍历结果集,每一条数据对应生成一个<option>标签 - 插入逻辑缺失:表单提交时没有将选中的作者ID存入
posts表的auteur_id字段,外键关联没有生效 - 存在SQL注入风险:直接拼接用户输入到SQL语句中,没有使用预处理语句,有严重安全隐患
修改后完整代码
<html> <head> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="container"> <div id="header"> <h1>Nieuwe post</h1> <a href="index.php"><button>Alle posts</button></a> </div> <?php $host = 'localhost'; $username = 'root'; $password = ''; $dbname = 'foodblog'; try { $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); // 设置PDO错误模式为异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); } try { if (isset($_POST["submit"])) { $titel = $_POST['titel']; $img = $_POST['img_url']; $inhoud = $_POST['inhoud']; $auteur_id = $_POST['auteur_id']; // 使用预处理语句避免SQL注入 $sql = "INSERT INTO posts (titel, img_url, inhoud, auteur_id) VALUES (?, ?, ?, ?)"; $stmt = $conn->prepare($sql); $stmt->execute([$titel, $img, $inhoud, $auteur_id]); // 插入成功后跳转回列表页,避免重复提交 header('Location: index.php'); exit; } else { // 查询所有作者 $auteurs = $conn->query("SELECT id, auteur FROM auteurs")->fetchAll(PDO::FETCH_ASSOC); ?> <form action="new_post.php" method="post"> Titel:<br/> <input type="text" name="titel"><br/><br/> Auteurs:<br> <select name='auteur_id'> <?php foreach ($auteurs as $auteur): ?> <option value="<?= $auteur['id'] ?>"><?= $auteur['auteur'] ?></option> <?php endforeach; ?> </select> <br><br> URL afbeelding:<br/> <input type="text" name="img_url"><br/><br/> Inhoud:<br/> <textarea name="inhoud" rows="10" cols="100"></textarea> <br/><br/> <input type="submit" name="submit" value="Publiceer"> </form> <?php } } catch (Exception $e) { echo "Error: " . $e->getMessage(); } ?> </div> </body> </html>
关键修改说明
- 单独查询
auteurs表拿到所有作者的ID和名称 - 循环遍历作者列表生成下拉选项,选项value存作者ID,显示内容存作者名称
- 插入数据时新增
auteur_id字段的写入逻辑,使用预处理语句避免SQL注入 - 修复了错误的PDO查询调用方式
- 插入成功后新增跳转逻辑,避免用户刷新页面重复提交表单
内容的提问来源于stack exchange,提问作者Mauro
相关产品推荐
相关产品推荐

