Сломанный PHP оператор if-elseif - PullRequest
0 голосов
/ 17 октября 2019

Я работаю над личным проектом и пытаюсь создать php-скрипт для отображения кнопки «Follow», если вошедший в систему пользователь сеанса еще не следует за отображаемым пользователем.

Вот что яполучили:

<?php
      $query = query("SELECT*FROM following, users WHERE followed_id=" .escape_string($_GET['id'])." 
      AND user_id=".escape_string($_GET['id'])." AND follower_id =".escape_string($_SESSION['user_id'])."");
      confirm($query);
      while($row = fetch_array($query)):

       if(mysqli_num_rows($query)==0){

         $followbutton=<<<DELIMITER

       <form method="post" action="">
         <input type="hidden" name="followed" value="{$row['user_id']}">
         <input type="hidden" name="follower" value="{$_SESSION['user_id']}">
         <input class="btn btn-info" type="submit" name="submit" value="follow">
       </form>

DELIMITER;
       echo $followbutton;

    }elseif($row['follower_id'] == $_SESSION['user_id']){
      $unfollowbutton=<<<DELIMITER

    <form method="post" action="unfollow.php?id={$row['user_id']}">
      <input class="btn btn-info" type="submit"  value="Unfollow">
    </form>

DELIMITER;
    echo $unfollowbutton;

  }
endwhile;    ?>

Вот что делают запрос, escape_string, fetch_array и подтвердите:

function redirect($location){
header("Location: $location");
}

function query ($sql){
global $connection;
return mysqli_query($connection,$sql);
}

function confirm($result) {
global $connection;
if(!$result){
    die("QUERY FAILED ".mysqli_error($connection));
}
}

function escape_string($string){
global $connection;
return mysqli_real_escape_string($connection,$string);
 }

 function fetch_array($result) {
return mysqli_fetch_array($result);
}

В таблице "следующим" есть только два столбца;follow_id и follower_id. Когда пользователь нажимает кнопку «Follow», он передает зарегистрированный user_id как follower_id, а user_id для человека, за которым следует «follow_id». Поскольку никаких записей не будет, если пользователь A еще не подписан на BI пользователя, кнопка должна отображаться только в том случае, если по запросу не возвращаются результаты.

1 Ответ

2 голосов
/ 17 октября 2019

Если я правильно понимаю ваш вопрос, вы либо хотите отобразить кнопку follow или кнопку unfollow . В этом случае вы можете использовать простое выражение if / else. В настоящее время ваш оператор elseif будет истинным только тогда, когда строка будет возвращена, потому что вы проверяете ее существование: if ($row['follower_id'] == $_SESSION['user_id']). Теперь я вижу, что ваш elseif проверяет, существует ли пользователь,У меня было это задом наперед. Все остальное в моем ответе остается в силе.

Для чего это стоит, вам действительно следует использовать подготовленные операторы для предотвращения атак с использованием SQL-инъекций. Кроме того, я думаю, что ваш код может быть немного упрощен, чтобы сделать его более понятным.

  • Не уверен, почему вы выбираете из способностей following и users. Вам нужно только проверить, есть ли в таблице following вы (зарегистрированный пользователь) и человек, с которым вы проверяете, нет?
  • Нет необходимости в этом цикле while. Вы можете просто посчитать строки. Если есть> 0 строк, вы знаете, что вы уже подписаны на этого человека. В теории, я думаю, должен быть только 1 ряд.

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

<?php
$stmt = $pdo->prepare("SELECT count(*) FROM following WHERE follower_id = ? AND followed_id = ?");
$stmt->execute([
    $_SESSION['user_id'], // logged-in user
    $_GET['id']           // who we are following
]);

// How to count when using PDO - https://phpdelusions.net/pdo_examples/count
$count = $stmt->fetchColumn();

if ($count > 0) {
    // show `unfollow` form
} else {
    // show `follow` form
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...