Php 调用未定义的方法语句::query()

Php 调用未定义的方法语句::query(),php,pdo,Php,Pdo,我正在学习PDO,我面临着一个我一无所知的问题。所以,我有一个类别表吉他,鼓等,另一个产品表有每种类型的产品。我正在学习MVC,并试图列出某一特定类别的所有产品 这是我为控制器准备的,但仍然不完整: <?php include './model/database.php'; include './model/category.php'; include './model/product.php'; // What is the default action if(isset($_POST[

我正在学习PDO,我面临着一个我一无所知的问题。所以,我有一个类别表吉他,鼓等,另一个产品表有每种类型的产品。我正在学习MVC,并试图列出某一特定类别的所有产品

这是我为控制器准备的,但仍然不完整:

<?php
include './model/database.php';
include './model/category.php';
include './model/product.php';
// What is the default action
if(isset($_POST['action'])){  
    $action=$_POST['action'];
}elseif(isset($_GET['action'])){
    $action=$_GET['action'];  
}
else {
    $action='product_list'; // Default Action 
}
if($action==='product_list'){
    if(isset($_GET['category_id'])){
            $category_id=$_GET('category_id');
} else {
    $category_id=1;
       }
}
$category_name=get_category_name($category_id);
$catagories=get_categories();
$products= get_product_by_category($category_id);
include('product_display.php');

?>
这是my categories.php文件:

<?php
    function get_categories(){
        global $db;
        $query="SELECT * FROM categories ORDER BY categoryID";
        $categories=$db->query($query); //line 5
        return $categories;
    }
    function get_category_name($category_id){
        global $db;
        $query="SELECT categoryName FROM categories
                WHERE categoryID=$category_id";
        $db=$db->query($query);
        $category=$db->fetch();
        $category_name=$category['categoryName'];
        return $category_name;
    }
?>
这是我的database.php文件:

<?php 
$dsn='mysql:host=localhost;dbname=my_guitar_shop1';
$user='mgs_user';
$password='pa55word';
try {
   $db= new PDO($dsn, $user, $password);
} catch (Exception $ex) {
    $error_message=$ex->getMessage();
    include 'database_error.php';
    exit();   
}
?>
这给了我一个错误:

在第5行的C:\xampp\htdocs\mvcfirst\model\category.php中调用未定义的方法PDOStatement::query


这就是为什么会有这样的共识。在database.php文件中,将$db变量设置为PDO对象:

然后在categories.php文件中,使用PDOStatement对象覆盖$db变量:

查询返回一个PDOStatement对象,该对象没有查询方法。这就是你所得到的错误

另一方面,您需要使用带有绑定参数的预处理语句,否则代码容易受到SQL注入攻击。您还可以使用PDOStatement::fetchColumn选择单个列:

function get_category_name($category_id){
    global $db; // Yuck!
    $query="SELECT categoryName FROM categories
            WHERE categoryID = ?";
    $stmt=$db->prepare($query);
    $stmt->execute([$category_id]);
    return $stmt->fetchColumn();
}

我不太明白你的意思,明白了。非常感谢迈克,你让我成为一个快乐的人。稍后我将研究SQL注入。我有点不知所措,有很多东西需要学习和记住。很高兴我能帮上忙!
$db=$db->query($query);
function get_category_name($category_id){
    global $db; // Yuck!
    $query="SELECT categoryName FROM categories
            WHERE categoryID = ?";
    $stmt=$db->prepare($query);
    $stmt->execute([$category_id]);
    return $stmt->fetchColumn();
}