Php 用PDO进行抽象
当我使用Php 用PDO进行抽象,php,mysql,pdo,Php,Mysql,Pdo,当我使用mysql.*函数进行数据库操作时,我通常将连接到数据库和初始化代码放在一个单独的文件中,并将其包含在其他页面中,效果很好 我最近学习了PDO,所以我想尝试一下PDO。所以我有4个PHP文件 config.php文件存储所有与数据库相关的信息 <?php $host = "localhost"; $username = "root"; $password = "abc123"; $dbname = "blog"; ?> init.php包含和config.php文件
mysql.*
函数进行数据库操作时,我通常将连接到数据库和初始化代码放在一个单独的文件中,并将其包含在其他页面中,效果很好
我最近学习了PDO,所以我想尝试一下PDO。所以我有4个PHP文件
config.php文件存储所有与数据库相关的信息
<?php
$host = "localhost";
$username = "root";
$password = "abc123";
$dbname = "blog";
?>
init.php包含和config.php文件,并初始化数据库连接
<?php
include_once("config.php");
$db = new PDO('mysql:host=' . $host . ';dbname=' . $dbname, $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
还有一个单独的文件名为functions.php,其中包含所有函数。它包括init.php文件
<?php
include_once("init.php");
function AddCategory($_name)
{
$param = $_name;
$query = $db->prepare("INSERT INTO categories SET name = :name");
$query->bindParam(':name', $param, PDO::PARAM_STR);
$query->execute();
}
function CategoryExists($_name)
{
$param = $_name;
$query = $db->prepare("SELECT COUNT(1) FROM categories WHERE name = :name");
$query->bindParam(':name', $param, PDO::PARAM_STR);
$query->execute();
$results = $query->fetch();
return ($results == '0') ? false : true;
}
?>
以及显示小表单的index.php文件
<?php
include_once("functions.php");
if(isset($_POST['name']))
{
$name = trim($_POST['name']);
if(empty($name))
{
$error = "You must enter a category name";
}
else if (CategoryExists($name))
{
$error = "That category already exists";
}
else if (strlen($name) > 24)
{
$error = "Category name can only be upto 24 characters";
}
if(!isset($error))
{
AddCategory($name);
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Add a Category</title>
</head>
<body>
<h1>Add a Category</h1>
<form action="" method="post">
<div>
<label for="name">Name</label>
<input type="text" name="name" value=""></input>
</div>
<div>
<input type="submit" value="Add Category"></input>
</div>
</form>
</body>
</html>
添加一个类别
添加一个类别
名称
但是,当我输入并提交某个内容时,它会抛出此错误,即使我已经包含了必要的文件
有人能告诉我我做错了什么吗?我真的很感激。
还是有更简单/有效/正确的方法来实现这一点
谢谢。您的助手函数正在尝试访问全局变量
$db
,该变量不在范围内。这个错误可以用global$db修复代码>位于每个函数的顶部
这种方法在您学习时是一个自然的步骤,但从工程的角度来看,这是非常不可取的,因为您的函数依赖于全局状态。将来,您应该研究如何创建一个扩展PDO
(或聚合一个PDO实例)的类,并使这些函数成为该类的方法。如果这样做,$db
变量将成为类的“一部分”或在类中,这是一个有价值的目标。这里的问题是。您需要将$db对象作为函数参数传入
function AddCategory($_name, $db)
{
$param = $_name;
$query = $db->prepare("INSERT INTO categories SET name = :name");
$query->bindParam(':name', $param, PDO::PARAM_STR);
$query->execute();
}
function CategoryExists($_name, $db)
{
$param = $_name;
$query = $db->prepare("SELECT COUNT(1) FROM categories WHERE name = :name");
$query->bindParam(':name', $param, PDO::PARAM_STR);
$query->execute();
$results = $query->fetch();
return ($results == '0') ? false : true;
}
在函数中,$db是一个未知变量
快速和肮脏的方式:
function AddCategory($_name)
{
global $db;
$param = $_name;
$query = $db->prepare("INSERT INTO categories SET name = :name");
$query->bindParam(':name', $param, PDO::PARAM_STR);
$query->execute();
}
当然,有一个更好的解决方案:将其作为一个类,并将其放在一起:
class mymodel
{
private $db;
function __construct( $host, $dbnam, $username, $password)
{
$this->db =
new PDO('mysql:host=' . $host . ';dbname=' . $dbname, $username, $password);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
function AddCategory($_name)
{
$param = $_name;
$query = $this->db->prepare("INSERT INTO categories SET name = :name");
$query->bindParam(':name', $param, PDO::PARAM_STR);
$query->execute();
}
}