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

时间:2018-06-17 03:36:11

标签: 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['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');

?>

这是我的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()

1 个答案:

答案 0 :(得分:1)

这正是共识globals are evil的原因。在database.php文件中,您要将$db变量设置为PDO对象:

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

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

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

PDO::query()返回PDOStatement个对象,该对象没有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();
}