代码之家  ›  专栏  ›  技术社区  ›  Knownow

调用未定义的方法pdoStatement::query()。

  •  0
  • Knownow  · 技术社区  · 6 年前

    这是我为我的控制器所做的,它仍然是不完整的:

    <?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');
    
    ?>
    

    <?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;
        }
    ?>
    

    <?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();   
    }
    ?>
    

    它给了我一个错误:

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mike    6 年前

    这就是为什么大家一致认为 globals are evil database.php $db 变量转换为 PDO

    $db= new PDO($dsn, $user, $password);
    

    然后在categories.php文件中覆盖 变量 PDOStatement

    $db=$db->query($query);
    

    PDO::query() 返回 对象,它没有 query()

    另一个注意事项是,您需要使用带有绑定参数的准备好的语句,否则您的代码容易受到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();
    }