PHP使用$ _GET [' id']显示数据库信息

时间:2017-05-31 11:27:30

标签: php mysql pdo

我目前正在尝试使用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。也没有出现任何错误。任何人都可以看到我做错了什么吗?或者让我知道我遗漏了哪些信息。感谢。

1 个答案:

答案 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'];
        }
    }
}

请注意,我绑定参数的方式(在执行中)是我的首选方式,而不是最好的方式