【问题标题】:PHP/Mysql - Dynamically selecting data?PHP/Mysql - 动态选择数据?
【发布时间】:2011-04-18 18:39:06
【问题描述】:

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

非常感谢任何可以向我展示如何实现这一目标的人。

【问题讨论】:

    标签: php mysql select dynamic


    【解决方案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();
    

    【讨论】:

    • 我得再研究一下,谢谢你的回复! :)
    【解决方案2】:

    我认为您在需要相关数据时遇到了问题。换句话说,当您的对象具有另一个对象的属性时,也应该收集和动态填充数据。我曾经走得很远,但是当遇到 INNER、LEFT 和 RIGHT 之类的连接时,你会三思而后行;)

    关于bind_results:http://php.net/manual/en/mysqli-stmt.bind-result.php

    (可能有点跑题了;SMTP?那是一个邮件协议,你确定你不是指 MySQLi 的 STMT?)

    【讨论】:

    • 我认为我不会为此使用连接。但即使我这样做,那怎么会使它不起作用?该查询将始终与我在第一篇文章中提到的查询相似,如果可行,可能会加入...是的,我的意思是STMT,而不是SMTP,呵呵。谢谢!
    【解决方案3】:

    作为参考,PDO 已经做了很多您似乎想做的事情。它甚至有一个 fetchAll 方法,它返回一个行数组,就像你的函数一样。你不需要绑定任何东西来使用它,除非你的查询字符串中有参数(当然还有绑定到这些参数的值)。

    查看the PDO documentation,看看它是否不符合您的需求。特别是PDOStatement->fetchAll()

    【讨论】:

      猜你喜欢
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2016-05-27
      • 2012-01-20
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多