2014-12-09 3 views
0

Итак, у меня есть эта странная проблема, которую я не могу решить, я не знаю, в чем проблема, и как я должен ее решить.Функция PHP in_array() не работает во всех случаях

У меня есть простая система, которая загружает изображения, называемые привязками. Каждой привязке нравится. Это, как я загрузить защелки и соответствующие (количество) любит:

/* 
* 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/>'; 
      } 
     } 
    } 

загружает любит внутри цикла Еогеаспа из результирующего набора защелок.

Итак, мне нужно проверить, не понравился ли зарегистрированный пользователь. Если это так, должна появиться другая непохожий кнопка. Тем не менее, с кодом, который у меня есть сейчас, он появляется для одного пользователя, которому понравилась привязка, но когда другому пользователю нравится одна и та же привязка, один из двух «симплееров» не получает непохожий на кнопку, хотя он/ей понравилось.

Это мой код, чтобы узнать, понравился ли пользователь в данный момент, как привязка. Если да, то другая разметка будет отображаться, в противном случае, по умолчанию оснастки с как кнопкой показывает:

// 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(), чтобы увидеть, если идентификатор пользователя вошедших в user ($ 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" } 

Они появляется на защелках, которые не показывают кнопку в отличии от в то время как он должен. Эта свалка со страницы пользователя, который не правильно показать кнопку в отличие:

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

Это то, что var_dump() показывает

+2

где '$ like_row = array();' фактически заполнено - потому что здесь его всегда пусто? – birdspider

+1

Вместо того, чтобы заставлять нас пробираться через весь ваш код, разрабатывая то, что он делает, почему бы не показать нам var_dump(), показывая только несколько записей из $ like_row –

+1

Если ваши значения находятся в вашем массиве, но не распознаются, попробуйте использовать значение 'strict' для этой функции. ** Если третий параметр strict установлен в TRUE, функция in_array() также проверит типы иглы в стоге сена. ** Трудно диагностировать прошлое, что вы поставили, без правильного угадывания ... – Rasclatt

ответ

1

Если вторая часть кода вы вывесили приходит сразу после первой части, то он использует $ like_row из последней итерации цикла foreach, и он будет работать только тогда, если текущий пользователь совпадает с пользователем последней строки, возвращаемой запросом.

Вместо этого в первой части проверьте, нравится ли текущему пользователю сообщение, когда вы перебираете множество понравившихся.

$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) {... 

Кстати, это выглядит, как во второй части вы вторя много одного и того же HTML в if и else частей. Вы могли бы просто повторить часть один раз, а затем поместить только те части, которые отличаются в if...else. Просто предложение.

+0

Это именно то, что мне нужно! Огромное спасибо :) –

Смежные вопросы