You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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>

关键修改说明

  1. 单独查询auteurs表拿到所有作者的ID和名称
  2. 循环遍历作者列表生成下拉选项,选项value存作者ID,显示内容存作者名称
  3. 插入数据时新增auteur_id字段的写入逻辑,使用预处理语句避免SQL注入
  4. 修复了错误的PDO查询调用方式
  5. 插入成功后新增跳转逻辑,避免用户刷新页面重复提交表单

内容的提问来源于stack exchange,提问作者Mauro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:45:02