Я хочу выбрать лучший результат поиска. Я получаю сообщение об ошибке: здесь мне показано действие 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>
попробуйте проверить с помощью if (!empty($searchdata)) {
да, я использую PHP, например $searchdata = []; $ ключевое слово = ''; если (isset($_POST['поиск'])) { $city = $_POST['город']; $ключевое слово = $_POST['ключевое слово']; $searchdata = $model->getVisitinPlaceData($city, $keyword); } ?>
данные какого типа возвращает $model->getVisitinPlaceData($city, $keyword);
?
Если foreach
работает, класс реализует Iterable
, но не Countable
.
удалить это $searchdata = []; и var_dump($searchdata) после выполнения
Вы возвращаете mysqli_result из своего метода, который реализует только интерфейс Traversable. Просто вызовите fetch_all и вместо этого верните результат, чтобы у вас был нормальный множество в точке, где вы хотите подсчитать элементы. php.net/manual/en/mysqli-result.fetch-all.php
Просто оберните его в условное выражение, которое проверяет, является ли оно счетным, так что...
// 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
@AmitabhKr Извините, is_countable()
- это 7.3, я неправильно понял вопрос. Вы должны иметь возможность использовать is_iterable()
для того же эффекта, я обновил ответ.
PHP 7.3 выдал ошибку: // Если запрошенная страница не существует. если ($elements['page'] > количество($elements['pages'] )) {
Изменил на: если (is_countable ($ элементы ['страница'])) {
Это исправило это!
Это лучше подавать как комментарий, а не ответ.
Можете ли вы объяснить это дальше? Данный код не содержит $elements
Иногда вы не можете обернуть все предложение, в котором вы используете счетчик, или вы используете несколько счетчиков, вам нужно только создать пустые массивы неисчисляемого, просто добавьте перед вашим фактическим кодом.
if (!is_countable($your_array))$your_array = Array();
Вы делали какую-либо отладку? Что показал
var_dump($searchdata);
?