我有一个php函数,它有两个来自同一个表的查询。第一个查询选择一些行,第二个查询必须在一列中选择后更新所选行。但不幸的是,只有第一个查询被执行,我无法更新表。
这是我的函数代码:
public function displayNewMessage(){
include "connection.php";
// first query
$displayMsg = $connection->prepare("select date, senderUserName, message from messages where showed = 0 and
((senderUserName = ? and receiverUserName = ?) or (senderUserName = ? and receiverUserName = ?))
order by date desc");
// second query
$checkMsg = $connection->prepare("UPDATE messages SET showed = 1 where showed = 0 and
((senderUserName = ? and receiverUserName = ?) or (senderUserName = ? and receiverUserName = ?))");
// preparation for both query is same
$displayMsg->bind_param("ssss", $senderUserName, $receiverUserName, $receiverUserName, $senderUserName);
$senderUserName=$this->getSenderUserName();
$receiverUserName=$this->getReceiverUserName();
$displayMsg->execute(); // execute first query
$checkMsg->execute(); // execute second query
$displayMsg->store_result();
$displayMsg->bind_result($messageDate, $senderUserName, $message);
while($displayMsg->fetch()){
$this->setSenderUserName($senderUserName);
$this->setMessage($message);
$this->setMessageDate($messageDate);
?>
<span style="color:#00F"> <?php echo $this->getSenderUserName(); ?></span> says: <br />
<?php echo $this->getMessage(); ?>
<div class="date"><?php echo $this->getMessageDate(); ?></div><br />
<?php
}
$displayMsg->free_result();
}
如果我在函数结束时执行第二个查询,它将首先运行并导致第一个查询的条件计算为 false,因此它不会选择任何行。
根据您的问题,但不幸的是,只执行了第一个查询,我无法更新表。
根据 mysqli 文档,您必须:
注意:使用 mysqli_stmt_execute() 时,mysqli_stmt_fetch() 在执行任何 其他查询。
你在 fetch 循环之前调用第二个执行;这是不允许的。
至于:如果我在函数结束时执行第二个查询,它将首先运行并导致第一个查询的条件计算为 false,因此它不会选择任何行。
我不确定你说的"它会先运行"是什么意思。