我对OOP有点新意,但我已经玩了大约一个月了。通常,我创建一个名为Mysql的类,它具有__construct函数,可直接连接到数据库。之后我有很多不同的函数可以将数据导入或插入到不同的表中。
今天在公共汽车之家,我开始思考,我提出了一个很棒的想法,可以减少它的混乱。我的想法是使用一个选择数据的单个函数(和一个用于插入的函数),并且根据传入的查询的外观,它将从不同的表中选择不同的数据。很好,对吧?
但我有点被困在这里。我根本不确定如何实现这一目标。我有一个小小的线索它是如何工作的,但我不知道我将如何绑定结果,或将它们提取到数组中。查询将在另一个方法中创建,然后传递给Mysql类中的select / insert函数。
我画了一个关于我认为它可能如何工作的“草图”。这是:
当然,下面的函数将放在Mysql类中,并且已经连接到数据库。
// This is an example query that could be passed in.
$query = "SELECT * FROM table WHERE id=150";
function select_data($query) {
if ( $smtp = $this->conn->prepare($query) ) {
$smtp->execute();
$smtp->bind_results(What happens here?);
if ( $smtp->fetch() ) {
foreach ( fetched_row? as $key => $value ) {
$return[] = $key => $value;
}
return $return;
}
else return NULL;
}
else return $this->conn->error;
}
非常感谢能够告诉我如何实现这一目标的任何人。
答案 0 :(得分:1)
您可以在PHP中使用更多选项,它们有自己的细节。 我可以推荐一些ORM 像Doctrine一样,因为易于使用,稳定,社区,最重要的是效率。
您可以像使用它一样简单:
$q = Doctrine_Query::create()
->select('u.username, p.phone')
->from('User u')
->leftJoin('u.Phonenumbers p');
$users = $q->fetchArray();
或:
// Delete phonenumbers for user id = 5
$deleted = Doctrine_Query::create()
->delete()
->from('Phonenumber')
->andWhere('user_id = 5')
->execute();
// Make all usernames lowercase
Doctrine_Query::create()
->update('User u')
->set('u.username', 'LOWER(u.username)')
->execute();
// 'like' condition
$q = Doctrine_Query::create()
->from('User u')
->where('u.username LIKE ?', '%jwage%');
$users = $q->fetchArray();
答案 1 :(得分:0)
我认为当您需要相关数据时遇到问题。换句话说,当您的对象具有属性时,该属性是另一个对象,也应该收集并动态填充数据。我曾经走得很远但是当像INNER,LEFT和RIGHT这样的东西加入时,你会想到更进一步;)
关于bind_results:http://php.net/manual/en/mysqli-stmt.bind-result.php
(也许稍微偏离主题; SMTP?这是一个邮件协议,你确定你不是指MySQLi的STMT吗?)
答案 2 :(得分:0)
作为参考,PDO已经做了很多你想要做的事情。它甚至有一个fetchAll
方法,它返回一个行数组,就像你的函数一样。除非在查询字符串中有参数(当然还有绑定到这些参数的值),否则不需要绑定任何东西以便使用它。
查看the PDO documentation,看看是否符合您的需求。特别是PDOStatement->fetchAll()
。