PHP: Предупреждение: count(): Параметр должен быть массивом или объектом, который реализует Countable

Я хочу выбрать лучший результат поиска. Я получаю сообщение об ошибке: здесь мне показано действие HTML-формы и соединение с БД в файле ниже здесь, пожалуйста, проверьте это. и сообщение об ошибке также упоминают этот раздел. я использую php 7.2, чем возникает проблема

Warning: count(): Parameter must be an array or an object that implements
Countable in D:\xammp\htdocs\search\index.php on line 64

Предупреждение: использование неопределенной константы city_id — предполагаемый «city_id» (это вызовет ошибку в будущей версии PHP) в D:\xammp\htdocs\search\index.php в строке 37.

помогите мне... сообщение об ошибке.

PHP:

<?php
$i = 1;
if (count($searchdata) > 0) {
    foreach ($searchdata as $places) {
        echo '<tr>';
        echo '<th>' . $i . '</th>';
        echo '<td>' . $places['city'] . '</td>';
        echo '<td>' . $places['visiting_place'] . '</td>';
        echo '<td>' . $places['history'] . '</td>';
        echo '</tr>';
        $i++;
    }
} else {
    echo '<td colspan = "4">No Search Result Found.</td>';
}
?>

Я использую PHP, например:

<?php
$searchdata = [];
$keyword = '';
if (isset($_POST['search'])) {
    $city = $_POST['city'];
    $keyword = $_POST['keyword'];
    $searchdata = $model->getVisitinPlaceData($city, $keyword);
}
?>

соединение с базой данных и выборка данных таблицы

<?php 
class Db {
    private $hostname = 'localhost';
    private $username = 'root';
    private $password = '';
    private $database = 'test';
    private $conn;
    public function __construct() { 
        $this->conn = mysqli_connect($this->hostname, $this->username, $this->password, $this->database); 
        if (!$this->conn) {
            echo 'Database not connected';
        }
    }
    public function getTouristCity(){
        $query = "SELECT * FROM tourist_city WHERE is_enabled = '1'";
        $result = mysqli_query($this->conn, $query);
        return $result;
    }
    public function getVisitingPlaces(){
        $query = "SELECT * FROM visiting_places WHERE is_enabled = '1'";
        $result = mysqli_query($this->conn, $query);
        return $result;
    }
    public function getVisitinPlaceData($cityid, $keyword){
        $sWhere = '';
        $where = array();
        if ($cityid > 0) {
            $where[] = 'V.city_id = '.$cityid.' AND V.is_enabled = "1"';
        }

        if ($keyword != '') {
            $keyword = trim($keyword);
            $where[] = "( V.visiting_place LIKE '%$keyword%' OR  V.history LIKE '%$keyword%'  OR  C.city LIKE '%$keyword%' )";
        }
        $sWhere     = implode(' AND ', $where);
        if ($sWhere) {
            $sWhere = 'WHERE '.$sWhere;
        } 
        if (($cityid > 0) || ($keyword != '')) {
            $query = "SELECT * FROM visiting_places AS V JOIN tourist_city AS C ON C.city_id = V.city_id $sWhere ";
            $result = mysqli_query($this->conn, $query);
            return $result;
        }
    }
}
?>

действие html-формы

<form action = "" method = "post" > 

            <div class = "col-sm-3"> 

                <select name = "city" class = "form-control">

                <option value = "0">Select City</option>
                <?php foreach($turistCity as $city) {
                    $checked = ($_POST['city'] == $city[city_id])? 'selected' : '';
                    echo '<option value = "'.$city[city_id].'" '.$checked.'>'.$city[city].'</option>';
                }
                ?>
                </select>
            </div>
            <div class = "col-sm-3"> 
             <input type = "text" name = "keyword" placeholder = "Keword" value = "<?php echo $keyword;?>" class = "form-control"> 
            </div>

            <button name = "search" type = "submit" class = "btn btn-primary">Search</button>
        </form>

Вы делали какую-либо отладку? Что показал var_dump($searchdata);?

lovelace 10.04.2019 10:37

попробуйте проверить с помощью if (!empty($searchdata)) {

M.Hemant 10.04.2019 10:39

да, я использую PHP, например $searchdata = []; $ ключевое слово = ''; если (isset($_POST['поиск'])) { $city = $_POST['город']; $ключевое слово = $_POST['ключевое слово']; $searchdata = $model->getVisitinPlaceData($city, $keyword); } ?>

Amitabh Kr 10.04.2019 10:40

данные какого типа возвращает $model->getVisitinPlaceData($city, $keyword);?

lovelace 10.04.2019 10:44

Если foreach работает, класс реализует Iterable, но не Countable.

Barmar 10.04.2019 10:49

удалить это $searchdata = []; и var_dump($searchdata) после выполнения

Anandhukrishna VR 10.04.2019 11:25

Вы возвращаете mysqli_result из своего метода, который реализует только интерфейс Traversable. Просто вызовите fetch_all и вместо этого верните результат, чтобы у вас был нормальный множество в точке, где вы хотите подсчитать элементы. php.net/manual/en/mysqli-result.fetch-all.php

04FS 10.04.2019 11:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
7
23 930
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Просто оберните его в условное выражение, которое проверяет, является ли оно счетным, так что...

// PHP >= 7.3
if (is_countable($searchdata)) {
    // Do something
}

// PHP >= 7.1
if (is_iterable($searchdata)) {
    // Do something
}

Примечание. Вы никогда не должны предполагать, что что-либо является истинным, если вы явно не определили это как таковое. count($something) подразумевает ожидание того, что это действительно массив или что-то, что вы можете посчитать. Если это не всегда так, и поэтому вы многое проверьте, прежде чем продолжить.

РЕДАКТИРОВАТЬ: используйте is_iterable() для PHP >= 7.1 или is_countable() для >= 7.3 в этом сценарии. Фрагмент выше обновлен

чем получение errorr. Неустранимая ошибка: Uncaught Error: вызов неопределенной функции is_countable() в D:\xammp\htdocs\search\index.php:64 Трассировка стека: #0 {main} брошено в D:\xammp\htdocs\search \index.php в строке 64

Amitabh Kr 10.04.2019 11:54

@AmitabhKr Извините, is_countable() - это 7.3, я неправильно понял вопрос. Вы должны иметь возможность использовать is_iterable() для того же эффекта, я обновил ответ.

ggdx 10.04.2019 12:05

PHP 7.3 выдал ошибку: // Если запрошенная страница не существует. если ($elements['page'] > количество($elements['pages'] )) {

Изменил на: если (is_countable ($ элементы ['страница'])) {

Это исправило это!

Это лучше подавать как комментарий, а не ответ.

noam 23.07.2020 17:43

Можете ли вы объяснить это дальше? Данный код не содержит $elements

Nico Haase 23.07.2020 17:44

Иногда вы не можете обернуть все предложение, в котором вы используете счетчик, или вы используете несколько счетчиков, вам нужно только создать пустые массивы неисчисляемого, просто добавьте перед вашим фактическим кодом.

if (!is_countable($your_array))$your_array = Array();

Другие вопросы по теме