我目前正在尝试使用PHP和PDO构建一个论坛,我有一个链接,可以将您带到URL中具有类别ID的类别的页面(例如,WEBSITE / category.php? ID = 1)。当我到达那里时,我想使用这个$ _GET信息显示你正在查看的类别的名称,但它似乎不会为我做这件事。 这就是我所拥有的:
<?php
include 'dbconfig.php';
include 'header.php';
$sql = "SELECT cat_id, cat_name, cat_description FROM categories WHERE cat_id = " . $_GET['id'];
$query = $DB_con->prepare($sql);
$query->execute();
$numRows = $query->fetchColumn();
if (!$query) {
echo 'Something went wrong whilst getting the category from the database.';
} else {
if ($numRows == 0) {
echo 'Sorry, this category does not exist';
} else {
while($catRow = $query->fetch(PDO::FETCH_ASSOC)){
echo $catRow['cat_name'];
}
}
}
include 'footer.php';
?>
正如你所看到的,我试图创建一个使用PDO :: FETCH_ASSOC创建数组的while循环,允许我打印类别详细信息,但是当我转到页面时除了header.php和footer.php。也没有出现任何错误。任何人都可以看到我做错了什么吗?或者让我知道我遗漏了哪些信息。感谢。
答案 0 :(得分:2)
问题在于$numRows
PDOStatement :: fetchColumn不计算结果集中的行。有PDOStatement :: rowCount。
对于sql注入,使用它来保存的类或函数不是那么多,而是使用函数的方式。要了解更多信息,请访问here(链接位于与我相关的顶部链接中)
将我们刚刚学到的知识应用到您的代码中会给我们这样的东西:
$sql = "SELECT cat_id, cat_name, cat_description FROM categories WHERE cat_id = :id"; // Parameterize query to prevent sql injection
$query = $DB_con->prepare($sql);
$query->execute([":id" => $_GET['id']]); // Binding parameter(s), could also be done using bindParam
$results = $query->fetchAll(PDO::FETCH_ASSOC); // For later use
$numRows = $query->rowCount();
if ($query->errorCode() == "00000") { // I don't think that PDOStatement ever fails to be created, so $query would never not be set
echo 'Something went wrong whilst getting the category from the database.';
} else {
if ($numRows == 0) {
echo 'Sorry, this category does not exist';
} else {
foreach ($results as $category){
echo $category['cat_name'];
}
}
}
请注意,我绑定参数的方式(在执行中)是我的首选方式,而不是最好的方式