gpt4 book ai didi

php - 查询返回先前函数的内容

转载 作者:行者123 更新时间:2023-11-29 18:33:22 24 4
gpt4 key购买 nike

我有一个 Chat.php 文件,其中包含与查询相关的所有内容。然后是一个 Core.php,其中包含与数据库的连接以及 Chat.php 中使用的基本功能,例如“查询”和“行”,它们将“查询”处理为数组。

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

它是这样的:核心.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;
}
}

聊天.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 包含前一个函数中的元素。我不知道为什么会这样。

编辑。这是输出:

Array ( [0] => Array ( [for1] => 2,4,6 ) [1] => Array ( [content] => Message 2 [timeposted] => 2017-08-04 16:12:34 ) [2] => Array ( [content] => Message 4 [timeposted] => 2017-08-04 16:12:48 ) [3] => Array ( [content] => Message 6 [timeposted] => 2017-08-04 16:13:03 ) )

数组的元素 [0](带有“for1”的元素)是上一个函数中剩余的。

最佳答案

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

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

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

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

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

  • 您正在尝试编写自己的 DAL(数据抽象层)。这是一项非常复杂的任务,并且已经有很多实现。当您尝试将核心类适应十几个其他类时,它会变得庞大、复杂且笨重。
  • PHP 只支持单一继承,因此您会搬起石头砸自己的脚,因为任何需要数据库交互的类都必须扩展 Core,而您将无法扩展任何其他内容。

暂时考虑保持简单,让每个方法处理自己的查询和数据库交互。专注于 DRY、封装等主要概念,并让你的类专注于他们的职责。

例如。 checkForLatestMessage() 这是做什么的?听起来应该检查消息,然后返回一个 bool 值(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
}
}

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

关于php - 查询返回先前函数的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45511828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com