查询返回先前函数的内容

时间:2017-08-04 16:44:08

标签: php mysql

我有一个Chat.php文件,其中包含与查询相关的所有内容。然后有一个Core.php包含与数据库的连接和Chat.php中使用的基本函数,如" query"和"行"它处理"查询"进入阵列。

在Chat.php中有两个功能,第二个是在使用print_r时打印第一个内容($ this-> rows());. checkForLastMessage()应检查一个表,以查看是否有新消息要从具有函数getNewMessages()的另一个表中提取。

这是它的样子: core.php中

<?php
class Core
{
...
    public function query($sql)
    {
        $this->result = $this->db->query($sql);
    }

    public function rows()
    {
        for($x = 1; $x <= $this->db->affected_rows; $x++)
        {
            $this->rows[] = $this->result->fetch_assoc();
        }
        return $this->rows;
    }
}

Chat.php

<?php
class Chat extends Core
{
public function checkForLatestMessage($chatid, $iam)
    {
        $userinchat='for'.$iam;
        $this->query("SELECT anonchat.$userinchat FROM anonchat WHERE anonchat.chatid=$chatid");

        $printarray = Array();
        $printaray = '';

        foreach( $this->rows() as $id )
        {
            $printarray[] = $id[$userinchat];
        }

        if($printarray[0] != '')
        {
            $this->getNewMessages($chatid, $printarray[0]);
        }
    }
    public function getNewMessages($chatid, $requiredMessages)
    {
        $this->query("SELECT anonmessage.content, anonmessage.timeposted FROM anonmessage WHERE anonmessage.messageid IN ($requiredMessages) ORDER BY anonmessage.timeposted ASC");

        print_r($this->rows());
    }

最后一个print_r包含上一个函数的元素。我不知道为什么会这样。

编辑。这是输出:

  

数组([0] =&gt;数组([for1] =&gt; 2,4,6)[1] =&gt;数组([content] =&gt;   消息2 [timeposted] =&gt; 2017-08-04 16:12:34)[2] =&gt;阵列(   [content] =&gt;消息4 [timeposted] =&gt; 2017-08-04 16:12:48)[3] =&gt;   数组([content] =&gt;消息6 [timeposted] =&gt; 2017-08-04 16:13:03))

数组的元素[0](&#34; for1&#34;的元素)保留在上一个函数中。

1 个答案:

答案 0 :(得分:0)

要回答您的问题,您要在第一个方法中初始化类属性$ this-&gt;行,然后将第二个方法附加到它。在添加之前,您需要重置$ this-&gt;行。

public function getNewMessages($chatid, $requiredMessages)
{
    $this->rows = null;
    $this->query("SELECT anonmessage...");

    print_r($this->rows());
}

或者更好的是,重置 query()方法中的变量。这样你每次都不必这样做。

当我说这是一个糟糕的设计时,请不要冒犯。

  • 您正在尝试编写自己的DAL(数据抽象层)。这是一项非常复杂的任务,并且已经有很多实现。当你尝试将它改编为十几个其他类时,Core类将变得庞大,复杂和笨拙。
  • PHP只支持单个继承,因此您可以立即开始自己的脚,因为任何需要数据库交互的类都必须扩展Core,而您将无法扩展其他任何内容。

考虑现在保持简单,让每个方法处理自己的查询和数据库交互。专注于DRY,封装等主要概念,让您的课程专注于自己的责任。

实施例。 checkForLatestMessage()这应该做什么?听起来应该检查消息然后返回一个布尔值(true | false),而是调用getNewMessages()来输出一些数据。

我对你的应用程序的了解不足以真正提出一些有用的东西,但这比你要走的道路要好一些。请注意,我们不会继承Core,因此您可以自由地继承其他内容。这些方法简明扼要,尽他们所能。您可能也会以这种方式保存几行代码,并且更容易阅读。

<?php
class Chat
{
    public function hasNewMessages($chatid, $iam)
    {
        // Query using PDO properly 

        return (bool)$hasNewMessages;
    }

    public function getNewMessages($chatid, $requiredMessages)
    {
        // Query using PDO properly 

        // An array of data or objects
        return $messages;
    }
 }


 /******** Client Code ***********/
 $chat = new Chat();

 if ($chat->hasNewMessages()) {
    foreach ($chat->getNewMessages($id, $required) as $message) {
        // $message
    }
 }

我的一些想法......祝你好运。