PHP: получить 1 вместо 0, используя count () - PullRequest
0 голосов
/ 25 августа 2018

Я добавляю счетчик просмотров на мой сайт.В коде я проверяю, есть ли IP с идентификатором поста.

, например, когда идентификатор поста равен 26, и в моей таблице IP нет IP с идентификатором 26, он должен вернуть 0, но возвращает1 вместо.

  $userIp = $_SERVER['REMOTE_ADDR'];
  $checkIp = $db->prepare("SELECT user_ip FROM user_ip WHERE word_id = '$idToShow'");
  $checkIp->execute();
//This happens
  if (count($checkIp) > 0) {
    echo count($checkIp);
    echo " ". $idToShow;
  }
//instead of this
  else {
    $insertIP = $db->prepare("INSERT INTO user_ip (user_ip, word_id) values('$userIp', '$idToShow')");
    $insertIP->execute();
    $updateView = $db->prepare("UPDATE words set views = views + 1 WHERE id = '$idToShow'");
    $updateView->execute();
  }

Ответы [ 6 ]

0 голосов
/ 25 августа 2018

Метод execute() запускает запрос, возвращает логическое значение, если запрос выполнен успешно или нет.Вы можете использовать rowsCount() для подсчета строк или fetchAll(), а затем подсчитать результаты.

Вы должны использовать что-то вроде этого

$checkIp->execute();
if ($checkIp && $checkIp->rowsCount() > 0) {
    // ...
}

ИЛИ

$checkIp->execute();
$ips = $checkIp->fetchAll();
if (count($ips) > 0) {
    // ...
}

http://php.net/manual/en/pdostatement.execute.php
http://php.net/manual/en/pdo.prepare.php

0 голосов
/ 25 августа 2018

Если вы используете PDO

Здесь вы используете подготовленные операторы для запроса базы данных, но вы не получаете результат, возвращенный базой данных

использование

$result = $checkIp->setFetchMode(PDO::FETCH_ASSOC);
if(count($result) > 0){
  .............
}
else{
  ..........
}

Еще проще использовать

$checkIp->rowCount()

возвращает количество строк, обработанных вашим запросом

0 голосов
/ 25 августа 2018

$checkIp->execute(); всегда возвращает логическое значение, поэтому ваше условие здесь неверно. проверьте документы здесь http://php.net/manual/en/pdostatement.execute.php используйте вот так

$userIp = $_SERVER['REMOTE_ADDR'];
$checkIp = $db->prepare("SELECT user_ip FROM user_ip WHERE word_id = '$idToShow'");
$result=$checkIp->execute();
if (!$result) {
    echo count($checkIp);
    echo " ". $idToShow;
}else {
    $insertIP = $db->prepare("INSERT INTO user_ip (user_ip, word_id) values('$userIp', '$idToShow')");
    $insertIP->execute();
    $updateView = $db->prepare("UPDATE words set views = views + 1 WHERE id = '$idToShow'");
    $updateView->execute();
}
0 голосов
/ 25 августа 2018

$checkIp является объектом и всегда (при условии, что ваша подготовка прошла успешно) возвращает ненулевой счет.То, что вы хотите (при условии, что вы используете mysqli), это $checkIp->num_rows.Если вы используете PDO, вы хотите $checkIp->rowCount().

0 голосов
/ 25 августа 2018

Как и в PHP doc, команда execute retunr TRUE или False

$checkIp->execute(); 

, поэтому ваши

(count($checkIp)   

просто считают содержимое var, которое в данном случае содержит только значение

0 голосов
/ 25 августа 2018

Вместо этого

if (count($checkIp) > 0)

Использовать

if(isset($checkIp->user_ip) && !empty($checkIp->user_ip))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...