我正在学习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()
答案 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();
}