有办法重构它吗?水管必须放在某个地方:
这是我的index.php页面:
define('BASE_URL', __DIR__);
echo BASE_URL;
require_once(BASE_URL . DIRECTORY_SEPARATOR . "config''config.php");
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes''PdoAdapter.class.php");
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes''Student.class.php");
$adapter = new PdoAdapter(DB_DSN, DB_USER_NAME, DB_PASSWORD);
$student = new Student($adapter);
$student->findByStudentID(4);
以下是我的课程:
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes''IStudent.interface.php");
class Student implements IStudent {
public function __construct(IRepository $adapter) {
$this->adapter = $adapter;
}
public function findByStudentID($id){
$sql = 'SELECT * FROM students WHERE student_id = :student_id';
$this->adapter->connect();
$this->adapter->prepare($sql);
$place_holders = array(':student_id' => $id);
$this->adapter->execute($place_holders);
$results = $this->adapter->fetchAll();
//print_r($results);
foreach ($results as $student){
echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";
}
$this->adapter->disconnect();
echo $sql;
}
}
如果我添加一个新方法(同一类),比如:
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes''IStudent.interface.php");
class Student implements IStudent {
public function __construct(IRepository $adapter) {
$this->adapter = $adapter;
}
public function findByLastName($last_name){
$sql = 'SELECT * FROM students WHERE LAST = :last_name';
$this->adapter->connect();
$this->adapter->prepare($sql);
$place_holders = array(':last_name' => $last_name);
$this->adapter->execute($place_holders);
$results = $this->adapter->fetchAll();
//print_r($results);
foreach ($results as $student){
echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";
}
$this->adapter->disconnect();
echo $sql;
}
}
我应该像这样在模型中一遍又一遍地进行连接、准备、执行吗?我可以是一个映射器,这将创建某种ORM。但我真的不想要ORM。我必须在某个地方做这件事。这个模型似乎给了我很大的灵活性,但这不是把我和PDO联系在一起吗(这对我来说没问题)。
这是使用PHP 5.4,PDO与MySQL。$adapter
是我拥有的一个PDO类的包装器。
编辑:我使用的是松散意义上的概念模型、数据库和表。例如,我不认为模型是一张表。这是"M"的一个方面
编辑:我更改了这个:
public function __construct(IRepository $adapter) {
$this->adapter = $adapter;
$this->adapter->connect();
}
然后在我的呼叫页面:
$adapter = new PdoAdapter(DB_DSN, DB_USER_NAME, DB_PASSWORD);
$student = new Student($adapter);
$student->findByStudentID(4);
$student->findByStudentLastName('Smith');
我认为那更好。我还删除了disconnect()
,因为我认为PDO在脚本完成后会自动断开连接。
我现在有:
<?PHP
require_once(BASE_URL . DIRECTORY_SEPARATOR . "Classes''IStudent.interface.php");
class Student implements IStudent {
public function __construct(IRepository $adapter) {
$this->adapter = $adapter;
$this->adapter->connect();
}
public function findByStudentID($id){
$sql = 'SELECT * FROM students WHERE student_id = :student_id';
$this->adapter->prepare($sql);
$place_holders = array(':student_id' => $id);
$this->adapter->execute($place_holders);
$results = $this->adapter->fetchAll();
//print_r($results);
foreach ($results as $student){
echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";
}
echo $sql;
}
public function findByStudentLastName($last_name){
$sql = 'SELECT * FROM students WHERE LAST = :last_name';
$this->adapter->prepare($sql);
$place_holders = array(':last_name' => $last_name);
$this->adapter->execute($place_holders);
$results = $this->adapter->fetchAll();
//print_r($results);
foreach ($results as $student){
echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";
}
echo $sql;
}
}
此处模型中的回声用于测试。
您可以不用实现接口,而是使用基类,在该基类中,数据库连接和随后的关闭都在构造函数中进行管理。查询将是一个发送到构造函数的参数。
我认为MVC中的MODEL对如何管理管道(就连接而言)是开放的,它只是根据框架从表到控制器的重要命名约定。
我在php中做了很多这样的工作,但目前我唯一方便的是python->相同的前提。
class db_query:
oracle_instance = ''
def __init__(self):
print '-- new db instance --'
def db_Query( self, host, port, sid, login, passwrd, queryString ):
try:
connstr = login + '/' + passwrd + '@' + host + ':' + port + '/' + sid
connection = cx_Oracle.connect( connstr )
except cx_Oracle.DatabaseError as e:
error, = e.args
print(error.code)
print(error.message)
print(error.context)
cursor = connection.cursor()
cursor.arraysize = 200
try:
cursor.execute( queryString )
except cx_Oracle.DatabaseError as e:
error, = e.args
print(error.code)
print(error.message)
print(error.context)
result = []
for rows in cursor:
result.append( rows )
cursor.close()
connection.close()
return result
希望这能给你一些想法。