PHP / Mysql - 动态选择数据?

时间:2010-09-29 11:18:32

标签: php mysql select dynamic

我对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;
}

非常感谢能够告诉我如何实现这一目标的任何人。

3 个答案:

答案 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()