我制作了一个脚本,使用PDO从数据库中提取新闻帖子,但它无法正常工作。有人能检查我的文件,看看我做错了什么,并可能提出解决方案,解释为什么它不起作用,这样我就可以从错误中吸取教训。此外,如果你能让我知道我的代码是否容易被注入或其他漏洞,我将不胜感激
脚本:
<?php
require_once("config/config.php");
$dbh = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME . ';charset=utf8', DB_USER, DB_PASS);
foreach($dbh->query("SELECT * FROM news ORDER BY id DESC",PDO::FETCH_ASSOC) as $row){
$id = $row['id'];
$title = $row['title'];
$body = $row ['body'];
$date = $row['date'];
echo "<center><b>$title posted on $date</center></b><hr>";
echo nl2br($body);
echo "<hr>";
}
$dbh = null;
?>
config.php:
<?php
define("DB_HOST", "localhost");
define("DB_NAME", "ninjaz_gaming");
define("DB_USER", "root");
define("DB_PASS", "Newman13");
?>
主要问题是您没有将PDO连接句柄存储在以后使用的变量中。
在你的代码中没有$this
,我可以看到,没有类没有对象,因此这里是
$this->db_connection = new PDO(...);
^^^^ this what?
应该是
$dbh = new PDO(...);
除此之外,没有明显的错误。您还应该在生产时打开错误报告。
你也可以像这个一样简化你的代码
$dbh = new PDO(...);
foreach($dbh->query("SELECT * FROM news ORDER BY id DESC",PDO::FETCH_ASSOC) as $row){
$id = $row['id'];
$title = $row['title'];
$body = $row ['body'];
$date = $row['date'];
echo "<center><b>$title posted on $date</center></b><hr>";
echo nl2br($body);
echo "<hr>";
}
由于您在查询中不使用任何用户提供的输入,就sql注入而言,这没有任何问题,但您迟早会在查询中使用用户提供的值,因此现在可以更进一步,使用准备好的语句。既然你已经在使用PDO了,那就不是什么大问题了。
connection.php
<?php
define("DB_HOST", "localhost");
define("DB_NAME", "ninjaz_gaming");
define("DB_USER", "root");
define("DB_PASS", "Newman13");
function connectDb(){
try {
$db_connection = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME . ';charset=utf8', DB_USER, DB_PASS);
return $db_connection;
} catch (PDOException $e) {
echo "Sorry, there was a problem connecting to the database." . $e->getMessage();
}
}
?>
编写脚本
<?php
include('connection.php');
$dbh = connectDb();
$query = $dbh->prepare("SELECT * FROM news ORDER BY id DESC");
$query->execute();
while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
{
$id = $row['id'];
$title = $row['title'];
$body = $row ['body'];
$date = $row['date'];
echo "<center><b>$title posted on $date</center></b><hr>";
echo nl2br($body);
echo "<hr>";
}
?>