如何补全博客article.php模板的PHP代码以显示单篇文章内容(无循环)
解决单篇文章内容显示的PHP代码补全方案
嘿,我来帮你搞定这个问题!首先你现有代码里有几个关键问题需要修正,然后再补全文章内容的显示逻辑:
原代码的问题点
- SQL注入风险+语法错误:你直接把
$numeroArticle拼进了SQL语句里,还手动加了单引号,这既容易导致语法错误,又会让你的代码暴露在SQL注入攻击下。PDO的prepare语句就是用来解决这个问题的,应该用参数占位符来替代直接拼接变量。 - 缺少查询执行步骤:你只准备了SQL语句,但没有调用
execute()来执行查询,直接fetch()是拿不到数据的。
修正并补全后的完整代码
<?php try { $bdd = new PDO('mysql:host=localhost;dbname=devoir-nabila;charset=utf8', 'root', ''); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } // 先做参数校验,避免空值或非法值 $numeroArticle = isset($_GET['numero-article']) ? (int)$_GET['numero-article'] : 0; // 使用PDO参数绑定,避免SQL注入 $req = $bdd->prepare("SELECT * FROM articles WHERE id = :id"); // 绑定参数并执行查询 $req->execute([':id' => $numeroArticle]); // 获取单条数据(因为是单篇文章,无需循环) $donnees = $req->fetch(PDO::FETCH_ASSOC); // 检查是否获取到文章数据 if ($donnees) { // 这里根据你的articles表字段来调整,比如假设字段有title、content、created_at ?> <article> <h1><?php echo htmlspecialchars($donnees['title']); ?></h1> <p class="date">发布于:<?php echo date('Y-m-d H:i', strtotime($donnees['created_at'])); ?></p> <div class="content"> <?php echo nl2br(htmlspecialchars($donnees['content'])); ?> </div> </article> <?php } else { // 如果没有找到对应文章,显示提示 echo "<p>抱歉,未找到该文章!</p>"; } // 关闭游标,释放资源 $req->closeCursor(); ?>
关键细节说明
- 参数校验:把
$_GET['numero-article']转成整数,避免传入非数字的非法值,同时处理参数不存在的情况。 - 参数绑定:用
:id作为占位符,然后通过execute()传参,PDO会自动处理转义,彻底避免SQL注入。 - 安全输出:用
htmlspecialchars()转义输出内容,防止XSS攻击;用nl2br()把内容里的换行转成HTML的<br>标签,保证排版正常。 - 空数据处理:判断
$donnees是否存在,避免当文章ID不存在时显示空白或报错。
内容的提问来源于stack exchange,提问作者xdxp
相关产品推荐
相关产品推荐

