我正在使用 HTML、PHP、MySQL 和 CSS 创建一个即时消息平台。我的函数 fetch_conversation_messages (在 private_message.inc.php 上)。这是 private_message.inc.php:
<?php
// Fetches a summary of the conversations.
function fetch_conversation_summary(){
$sql = "SELECT
`conversations`.`conversation_id`,
`conversations`.`conversation_subject`,
MAX(`conversations_messages`.`message_date`) AS `conversation_last_reply`,
MAX(`conversations_messages`.`message_date`) > `conversations_members`.`conversation_last_view` AS `conversation_unread`
FROM `conversations`
LEFT JOIN `conversations_messages` ON `conversations`.`conversation_id` = `conversations_messages`.`conversation_id`
INNER JOIN `conversations_members` ON `conversations`.`conversation_id` = `conversations_messages`.`conversation_id`
WHERE `conversations_members`.`user_id` = {$_SESSION['user_id']}
AND `conversations_members`.`conversation_deleted` = 0
GROUP BY `conversations`.`conversation_id`
ORDER BY `conversation_last_reply` DESC";
$result = mysql_query($sql);
$conversations = array();
while (($row = mysql_fetch_assoc($result)) !== false){
$conversations[] = array(
'id' => $row['conversation_id'],
'subject' => $row['conversation_subject'],
'last_reply' => $row['conversation_last_reply'],
'unread_messages' => ($row['conversation_unread'] == 1),
);
}
return $conversations;
}
// Fetches all of the messages in the given converstion.
function fetch_conversation_messages($conversation_id){
$conversation_id = (int)$conversation_id;
$sql = "SELECT
`conversations_messages`.`message_date`,
`conversations_messages`.`message_date` > `conversations_members`.`conversation_last_view` AS `message_unread`,
`conversations_message`.`message_text`,
`users`.`user_name`
FROM `conversations_messages`
INNER JOIN `users` ON `conversations_messages`.`user_id` = `users`.`user_id`
INNER JOIN `conversations_members` ON `conversations_messages`.`conversation_id` = `conversations_members`.`conversation_id`
WHERE `conversations_messages`.`conversation_id` = {$conversation_id}
AND `conversations_members`.`user_id` = {$_SESSION['user_id']}
ORDER BY `conversations_messages`.`message_date` DESC";
$result = mysql_query($sql);
$messages = array();
while ($row = mysql_fetch_assoc($result)){
$messages[] = array(
'date' => $row['message_date'],
'unread' => $row['message_unread'],
'text' => $row['message_text'],
'user_name' => $row['user_name'],
);
echo mysql_num_rows($result);
var_dump($row);
}
return print_r($messages);}
// Sets the last view time to the current time for the given conversation.
function update_conversation_last_view($conversation_id){
$conversation_id = (int)$conversation_id;
$time = time() + 18000;
$sql ="UPDATE `conversations_members`
SET `conversation_last_view` = {$time}
WHERE `conversation_id` = {$conversation_id}
AND `user_id` = {$_SESSION['user_id']}";
mysql_query($sql);
}
// Creates a new conversation, making the given users a member.
function create_conversation($user_ids, $subject, $body){
$subject = mysql_real_escape_string(htmlentities($subject));
$body = mysql_real_escape_string(htmlentities($body));
mysql_query("INSERT INTO `conversations` (`conversation_subject`) VALUES ('{$subject}')");
$conversation_id = mysql_insert_id();
$sql = "INSERT INTO `conversations_messages` (`conversation_id`, `user_id`, `message_date`, `message_text`)
VALUES ({$conversation_id}, {$_SESSION['user_id']}, UNIX_TIMESTAMP(), '{$body}')";
mysql_query($sql);
$values = array("({$conversation_id}, {$_SESSION['user_id']}, UNIX_TIMESTAMP(), 0)");
foreach ($user_ids as $user_id){
$user_id = (int)$user_id;
$values = array("({$conversation_id}, {$_SESSION['user_id']}, UNIX_TIMESTAMP(), 0)"); }
$sql = "INSERT INTO `conversations_members` (`conversation_id`, `user_id`, `conversation_last_view`, `conversation_deleted`)
VALUES " . implode(", ", $values);
mysql_query($sql);
}
// Checks to see if the given user is a member of the given conversation.
function validate_conversation_id($conversation_id){
$conversation_id = (int)$conversation_id;
$sql = "SELECT COUNT(1)
FROM `conversations_members`
WHERE `conversation_id` = {$conversation_id}
AND `user_id` = {$_SESSION['user_id']}
AND `conversation_deleted` = 0";
$result = mysql_query($sql);
return(mysql_result($result, 0) == 1);
}
// Adds a message to the given conversation.
function add_conversation_message($conversation_id, $text){
$conversation_id = (int)$conversation_id;
$text = mysql_real_escape_string(htmlentities($text));
$sql = "INSERT INTO `conversations_messages` (`conversation_id`, `user_id`, `message_date`, `message_text`)
VALUES ({$conversation_id}, {$_SESSION['user_id']}, UNIX_TIMESTAMP(), '{$text}')";
mysql_query($sql);
mysql_query("UPDATE `conversations_members` SET `conversation_deleted` = 0 where `conversation_id = {$conversation_id}");
}
// Deletes (or marks as deleted) a given conversation.
function delete_conversation($conversation_id){
$conversation_id = (int)$conversation_id;
$sql = "SELECT DISTINCT `conversation_deleted`
FROM `conversations_members`
WHERE `user_id` != {$_SESSION['user_id']}
AND `conversation_id` = {$conversation_id}";
$result = mysql_query($sql);
//if (mysql_num_rows($result) == 1 && mysql_result($result, 0) == 1){
if (mysql_num_rows($result) == 0){
mysql_query("DELETE FROM `conversations` WHERE `conversation_id` = {$conversation_id}");
mysql_query("DELETE FROM `conversations_members` WHERE `conversation_id` = {$conversation_id}");
mysql_query("DELETE FROM `conversations_messages` WHERE `conversation_id` = {$conversation_id}");
}else{
$sql = "UPDATE `conversations_members`
SET `conversation_deleted` = 1
WHERE `conversation_id` = {$conversation_id}
AND `user_id` = {$_SESSION['user_id']}";
mysql_query($sql);
}
}
?>
view_conversation.page.inc.php包含了private_message.inc.php的功能,如下:
<?php
$errors = array();
$valid_conversation = (isset($_GET['conversation_id']) && validate_conversation_id($_GET['conversation_id']));
if ($valid_conversation === false){
$errors[] = 'Invalid Conversation ID.';
}
if (isset($_POST['message'])){
if (empty($_POST['message'])){
$errors[] = 'You must enter a message.';
}
if (empty($errors)){
add_conversation_message($_GET['conversation_id'], $_POST['message']);
}
}
if (empty($errors) === false){
foreach ($errors as $error){
echo $error;
}
}
if ($valid_conversation){
/*if (isset($_POST['message'])){
update_conversation_last_view($_GET['conversation_id']);*/
$messages = fetch_conversation_messages($_GET['conversation_id']);
print_r($messages);
}else{
$messages = array();
update_conversation_last_view($_GET['conversation_id']);
}
?>
<p class="name">Username: <?php echo $message['user_name']; ?></p>
<p class="text">Date: <?php echo date('d/m/Y H:i:s', $message['date']); ?></p>
<p>Message: <?php echo $message['text']; ?></p>
<a href="index.php?page=inbox">Inbox</a>
<a href="index.php?page=logout">Logout</a>
<form action="" method="post">
<p><textarea name="message" rows="10" cols="110"></textarea></p>
<p><input type="submit" value="Add Message" /></p>
</form>
<?php
var_dump( $messages );
if($messages){
foreach ($messages as $message){
?>
<?php if ($message['unread']) echo 'unread'; ?>
<?php
}}
?>
我得到以下输出:
数组 ( ) 1 bool(true) 警告:第 52 行/home/u406538221/public_html/public_html/gamma/core/pages/view_conversation.page.inc.php 中为 foreach() 提供的参数无效
我对这个论坛、数据库、PHP 和 MySQL 都是全新的。
问题:无效参数 返回 boolean 值 - 为什么?我该如何修复它?
请帮助我。
提前谢谢您。
最佳答案
首先,您的 fetch_conversation_messages
函数返回 print_r($messages)
。它的作用是打印 $messages
变量(这是 Array() 的来源),然后返回 true
。然后在调用 fetch_conversation_messages
之后,您正在执行 print_r($messages)
并且由于 $messages
是一个 boolean
,print_r
正在打印 1
。然后,在第 52 行的 foreach
之前的 var_dump($messages)
中,$messages
变量是一个 boolean
等于 true
,这就是 bool(true)
输出的来源。因此,您尝试像数组一样循环遍历 boolean 值,这会给出有关为 foreach()
提供的参数无效的错误。因此,您需要做的就是在 fetch_conversation_messages
函数中返回 $messages
而不是 print_r($messages)
。
编辑:
这就是您的 fetch_conversation_messages
的样子:
function fetch_conversation_messages($conversation_id){
$conversation_id = (int)$conversation_id;
$sql = "SELECT
`conversations_messages`.`message_date`,
`conversations_messages`.`message_date` > `conversations_members`.`conversation_last_view` AS `message_unread`,
`conversations_message`.`message_text`,
`users`.`user_name`
FROM `conversations_messages`
INNER JOIN `users` ON `conversations_messages`.`user_id` = `users`.`user_id`
INNER JOIN `conversations_members` ON `conversations_messages`.`conversation_id` = `conversations_members`.`conversation_id`
WHERE `conversations_messages`.`conversation_id` = {$conversation_id}
AND `conversations_members`.`user_id` = {$_SESSION['user_id']}
ORDER BY `conversations_messages`.`message_date` DESC";
$result = mysql_query($sql);
$messages= array();
while ($row = mysql_fetch_assoc($result)){
$messages[] = array(
'date' => $row['message_date'],
'unread' => $row['message_unread'],
'text' => $row['message_text'],
'user_name' => $row['user_name'],
);
echo mysql_num_rows($result);
var_dump($row);
}
return $messages;
}
关于php - 函数返回 boolean 值而不是适当的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21787486/