繁体   English   中英

PHP in_array()函数并非在所有情况下均有效

[英]PHP in_array() function doesn't work in all cases

因此,我有一个无法解决的怪异问题,我不知道问题是什么以及如何解决。

我有一个加载图像的简单系统,称为快照。 每一刻,都有喜欢。 这就是我加载快照和相关的(数量)个赞的方式:

/*
* Get the snaps
*/
try {
    $select_snaps_query = '
    SELECT snap.snap__id, snap.snap__user__id, snap.snap__4_3_loc, snap.snap__caption, snap.snap__time, user.user__id, user.user__username, user.user__profile_picture
    FROM snap
    JOIN user ON(user.user__id = snap.snap__user__id)
    WHERE snap__user__id IN(
        SELECT followed__user__id
        FROM follow
        WHERE follower__user__id = :follower__user__id
    ) ORDER BY snap__time DESC';
    $prep_select_snaps = $conn->prepare($select_snaps_query);
    $prep_select_snaps->bindParam(':follower__user__id', $user__id, PDO::PARAM_STR);
    $prep_select_snaps->execute();
    $snaps_result = $prep_select_snaps->fetchAll();
    $snaps_count = count($snaps_result);
}   
catch(PDOException $e) {
    $conn = null;
    header('Location: http://www.scrapll.com');
}

if($snaps_count != 0) {
    foreach($snaps_result AS $snaps_row) {
        $snap__id = $snaps_row['snap__id'];   
        $snap__4_3_loc = $snaps_row['snap__4_3_loc'];
        $snap__caption = $snaps_row['snap__caption'];
        $snap__time = $snaps_row['snap__time'];
        $snap__user__id = $snaps_row['snap__user__id'];
        $snap__username = $snaps_row['user__username'];
        $snap__profile_picture = $snaps_row['user__profile_picture'];

        if($snap__profile_picture == null) {
            $snap__profile_picture = 'default.fw.png';   
        }

        $like_row = array();

        // load the likes for each snap
        try {
            $select_like_query = '
            SELECT like__id, like__user__id
            FROM `like`
            WHERE like__snap__id = :like__snap__id';
            $prep_select_like = $conn->prepare($select_like_query);
            $prep_select_like->bindParam(':like__snap__id', $snap__id, PDO::PARAM_STR);
            $prep_select_like->execute();
            $like_result = $prep_select_like->fetchAll();
            $like_count = count($like_result);
        }   
            catch(PDOException $e) {
            $conn = null;
            header('Location: http://www.scrapll.com');
        }

        if(isset($like_result)) {
            foreach($like_result AS $like_row) {
                echo $like__user__id = $like_row['like__user__id'] . '<br/>';   
            }
        }
    }

我将赞加载到快照结果集的foreach循环中。

因此,我需要做的是检查登录用户是否喜欢快照。 如果是这样,则必须出现一个不同的按钮。 但是,使用我现在拥有的代码,它会显示给喜欢快照的一个用户,但是当另一个用户也喜欢相同的快照时,即使两个“喜欢者”之一都没有获得不同按钮,即使他/她喜欢它。

这是我的代码,用于确定当前登录的用户是否已经喜欢该快照。 如果是这样,将显示不同的标记,否则,将显示带有“喜欢”按钮的默认快照:

// if liked by currently logged in user
if(in_array($user__id, $like_row)) {
            echo '
            <div class="snap_item">
                <div class="snap_item_following_info">
                    <img class="snap_item_following_img" src="res/stat/img/user/profile/small/'.$snap__profile_picture.'" alt="@'.$snap__username.'" />
                    <a class="snap_item_following_name" href="me.html?id='.$snap__user__id.'">@'.$snap__username.'</a>
                    <!--<div class="snap_too">

                    </div>-->
                </div>
                <img class="snap_img" src="'.$snap__4_3_loc.'" alt="'.$snap__id.'" />
                <div class="like_heart"></div>
                <div class="snap_info">
                    <div class="snap_text">'.$snap__caption. 'LIKED BY ME</div>
                    <div class="snap_sub_info">
                        <span class="snap_time">'.time_ago($snap__time).'</span>
                        <div class="like unlike" style="background: red;">
                            <div class="like_icon liked"></div>
                               <div class="like_no_active" style="color: #FFF">'.$like_count.'</div>
                        </div>
                    </div>
                </div>
            </div>';     
        }
        // if NOT liked by the currently logged in user
        else {
            echo '
            <div class="snap_item">
                 <div class="snap_item_following_info">
                    <img class="snap_item_following_img" src="res/stat/img/user/profile/small/'.$snap__profile_picture.'" alt="@'.$snap__username.'" />
                    <a class="snap_item_following_name" href="me.html?id='.$snap__user__id.'">@'.$snap__username.'</a>
                    <!--<div class="snap_too">

                    </div>-->
                </div>
                <img class="snap_img" src="'.$snap__4_3_loc.'" alt="'.$snap__id.'" />
                <div class="like_heart"></div>
                <div class="snap_info">
                    <div class="snap_text">'.$snap__caption.'</div>
                    <div class="snap_sub_info">
                        <span class="snap_time">'.time_ago($snap__time).'</span>
                        <div class="like" style="background: white;">
                            <div class="like_icon"></div>
                            <div class="like_no_active">'.$like_count.'</div>
                        </div>
                    </div>
                </div>
            </div>';   
        } 

如您所见,我使用in_array()函数查看点赞查询结果集的数组中是否存在当前登录用户的用户ID($ user__id)。

有人在我的代码中看到问题了吗?

编辑

var_dump()显示以下内容:

array(2) { ["like_id"]=>string(3) "170"
["like__user__id"]=>string(1) "2" }

它为每个快照显示了类似的哑音。 对于另一个提示,它说:

array(2) { ["like_id"]=>string(3) "171"
["like__user__id"]=>string(1) "2" }

这些出现在快照上,而在应该显示的同时不显示“ likely”按钮。 此转储来自用户页面,该页面正确显示了like按钮:

array(2) { ["like_id"]=>string(3) "170"
["like__user__id"]=>string(1) "2" }

这就是var_dump()所显示的

如果您发布的第二段代码紧接在第一段代码之后,则它使用的是来自foreach循环最后一次迭代的$ like_row,并且只有当当前用户与最后一个like行的用户匹配时,该代码才有效查询返回。

相反,在第一部分中,请检查当您遍历一组喜欢时,当前用户是否喜欢该帖子。

$this_user_likes = false;
if(isset($like_result)) {
    foreach($like_result AS $like_row) {
        if ($like_row['like__user__id'] === $user__id) $this_user_likes = true;
    }
}

然后在第二部分中使用

if (in_array($user__id, $like_row)) {...

您可以改用先前检查的结果。

if ($this_user_likes) {...

顺便说一句,在第二部分中,您似乎在ifelse部分中回显了很多相同的html。 您可以只重复一次,然后仅将if...else中不同的部分放入。 只是一个建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM