我尝试抓取并计算每个帖子的所有回复,例如,特定帖子的所有回复都在2
列下标记为level
,但我的foreach循环只抓取了最后一次迭代的值。例如,假设我想要post_id
91
的所有评论回复,其评论为92
95
,而post_id
又有回复93
他们的94
{1}} 96
post_id
。我的foreach循环只返回最后一个回复post_id
96
,但我希望我的foreach循环保存所有帖子评论回复帖子ids,例如,它应该返回所有帖子ID 93
{{ 1}} 94
。我想知道在代码中需要更改什么来实现这一点请帮助。感谢。
MySQL表格结构
96
MySQL表数据
CREATE TABLE posts(
post_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INT UNSIGNED NOT NULL DEFAULT 0,
member_id INT UNSIGNED NOT NULL,
profile_id INT UNSIGNED NOT NULL,
level INT UNSIGNED NOT NULL DEFAULT 0,
post LONGTEXT DEFAULT NULL,
date_created DATETIME NOT NULL,
date_updated DATETIME DEFAULT NULL,
update_count INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (post_id)
);
PHP
post_id parent_id member_id profile_id level post date_created date_updated update_count
96 95 1 1 2 reply 1 for comment 2 2017-08-06 02:26:09 NULL 0
95 91 1 1 1 comment 2 2017-08-06 02:25:43 NULL 0
94 92 1 1 2 reply 2 2017-08-06 02:25:09 NULL 0
93 92 1 1 2 reply 1 2017-08-06 02:25:00 NULL 0
92 91 1 1 1 comment 1 2017-08-06 02:24:47 NULL 0
91 0 1 1 0 post 1 2017-08-06 02:24:31 NULL 0
答案 0 :(得分:1)
在foreach
循环中,您在$parent_id
grab_all_post_comment_replies_parent_ids($post_id)
时循环播放。但是,您忘记的是,在每个循环结束时,再次检查foreach
循环中的条件。
因此,每次foreeach
循环结束时,您再次调用该函数,它将当前数组替换为新数组,因此我们从头开始搜索新数组,从而你只得到了第一个结果。
我在这里做的是在开始时运行一次函数,然后将其存储到变量中。现在它将遍历数组中的每个值而没有问题。
其次,不需要检查总和及其总和的位。 foreach
循环将始终结束,您可以返回值。目前,你只是检查0 == total
,它不会是,然后返回而不给你的循环一个继续运行的机会。
只需将其移除,然后在最后返回。
function all_post_comment_replies($post_id){
$parent_ids = grab_all_post_comment_replies_parent_ids($post_id);
$total = count($parent_ids);
$all_ids = array();
if(is_array($parent_ids)){
foreach($parent_ids as $parent_id){
//filter string to contain only numbers just in case
$parent_id = filter_numbers($parent_id);
//escape special characters in the string for use in the MySQL statement
$parent_id = mysqli_real_escape_string(database(), $parent_id);
$query = "SELECT *
FROM `posts`
WHERE `parent_id` = '$parent_id'
AND `level` = '2'";
//short hand if statement ? if-true : if-false to determine the number of results returned by the query
$count = ($query = mysqli_query(database(), $query)) ? mysqli_num_rows($query) : 0;
if($count === 0){
//query returned 0 meaning no results so return false as the value for the function
return false;
} else {
while($row = mysqli_fetch_array($query)){
$ids[] = $row['post_id'];
}
$all_ids = $ids;
}
}
return $all_ids;
} else {
return false;
}
}
答案 1 :(得分:0)
在函数all_post_comment_replies()中存在以下错误:
if($sum = $total){ // assigment, not comparison
return $all_ids;
} else {
return false;
}
在if句子中,$ total变量被赋值为$ sum
没有比较表达式并且总是为真($ sum总是> 0),当表达式等于零时,它只是假的。
我认为它只迭代一次。
修复:
if($sum == $total){ // see ==
return $all_ids;
} else {
return false;
}