gpt4 book ai didi

php - mysqli_stmt 从 3 个表获取有限数据

转载 作者:行者123 更新时间:2023-11-29 23:47:57 27 4
gpt4 key购买 nike

我正在构建一个简单的留言板,需要从 3 个不同的表中获取信息来显示主要摘要页面。我正在使用 mysqli_stmt 协议(protocol),无法弄清楚如何获取每个讨论的第一条消息和作者姓名,因为所有 sql 查询都需要在准备另一个 sql 查询之前关闭。

这是我运行来创建数据库的代码的简化版本:

CREATE TABLE `users` (
`id` INT(25) UNSIGNED AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR(65) NOT NULL
);
CREATE TABLE `discussions` (
`id` INT(25) UNSIGNED AUTO_INCREMENT PRIMARY KEY ,
`subject` VARCHAR(120) NOT NULL ,
`last_author` INT(25) NOT NULL
);
CREATE TABLE `messages` (
`id` INT(25) UNSIGNED AUTO_INCREMENT PRIMARY KEY ,
`discussion` INT(25) NOT NULL ,
`author` INT(25) NOT NULL ,
`message` TEXT
);

是否可以形成一个查询来选择所有讨论,并为每个讨论选择主题、最后作者的姓名和最新的消息文本?

我可以使用此代码来显示每个讨论的所有主题:

<?php
$sqlcmd = "SELECT * FROM _discussions";
$get = mysqli_prepare($sqlConnection,$sqlcmd);
mysqli_stmt_execute($get);
mysqli_stmt_bind_result($get, $id, $subject, $last_author);

while(mysqli_stmt_fetch($get)) : ?>

<li><?=$subject?></li>

<?php endwhile;
mysqli_stmt_close($get);
?>

但是如果我无法在循环内启动另一个 sql 查询,如何获取作者姓名和消息?

最佳答案

也许这是不可能的..不过我想出了另一种方法来实现它。

我可以使用 MAX 查询获取最新的讨论 ID,然后使用标准 for 循环根据该 id 获取我需要的所有信息。通过此实现,我什至可以从讨论表中删除last_author 字段。

此代码未经过简化,并且包含错​​误检查。我确信它可以稍微重构一下。

<?php 

//get LAST discussion
$sqlcmd = "SELECT MAX(_id) FROM _discussions";
$get = mysqli_prepare($app->sql,$sqlcmd);
if(!$get) $app->log_sqlError();
if(!mysqli_stmt_execute($get)) $app->log_sqlError();
if(!mysqli_stmt_bind_result($get,$last_id)) $app->log_sqlError();
if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError();
if(!mysqli_stmt_close($get)) $app->log_sqlError();

$app->log('last discussion id: '.$last_id);
?>
<ul>
<?php for($i=$last_id;$i>0;$i--) :

//get DISCUSSION
$sqlcmd = "SELECT * FROM _discussions WHERE _id=".$i;
$get = mysqli_prepare($app->sql,$sqlcmd);
if(!$get) $app->log_sqlError();
if(!mysqli_stmt_execute($get)) $app->log_sqlError();
if(!mysqli_stmt_bind_result($get,$id,$subject,$original_author,$created,$updated))
$app->log_sqlError();

//IMPORTANT - move on if the discussion was not found
if(mysqli_stmt_fetch($get)==FALSE) $id=0;
if(!mysqli_stmt_close($get)) $app->log_sqlError();
if($id!=0) :

//get last MESSAGE id
$get = mysqli_prepare($app->sql,"SELECT MAX(_id) FROM _messages WHERE _discussion=".$i);
if(!$get) $app->log_sqlError();
if(!mysqli_stmt_execute($get)) $app->log_sqlError();
if(!mysqli_stmt_bind_result($get,$message_id))
$app->log_sqlError();
if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError();
if(!mysqli_stmt_close($get)) $app->log_sqlError();

//get last MESSAGE
$get = mysqli_prepare($app->sql,"SELECT * FROM _messages WHERE _id=".$message_id);
if(!$get) $app->log_sqlError();
if(!mysqli_stmt_execute($get)) $app->log_sqlError();
if(!mysqli_stmt_bind_result($get,$m_id,$discussion_id,$author,$text,$created_time))
$app->log_sqlError();
if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError();
if(!mysqli_stmt_close($get)) $app->log_sqlError();

//get AUTHOR
$get = mysqli_prepare($app->sql,"SELECT _name FROM _users WHERE _id=".$author);
if(!$get) $app->log_sqlError();
if(!mysqli_stmt_execute($get)) $app->log_sqlError();
if(!mysqli_stmt_bind_result($get,$name))
$app->log_sqlError();
if(mysqli_stmt_fetch($get)==FALSE) $app->log_sqlError();
if(!mysqli_stmt_close($get)) $app->log_sqlError();
?>

<li><p><?=$subject?> | <?=$name?> | <?=$text?> | <?=$created_time?></p></li>

<?php endif; endfor; ?>
</ul>

那个log_sqlError函数看起来像这样:

function log_sqlError(){
print_r('errno: '.$this->sql->errno.', error: '.$this->sql->error);
}

关于php - mysqli_stmt 从 3 个表获取有限数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25819092/

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