@LolaHuligang

Как исправить ошибку вывода (написать условие для последнего адреса в цикле/таблице)?

Добрый день,
php знаю на базовом уровне , прошу помощи.
Есть код, который получает от пользователя Адрес (строка $line['address']) обращается к БД, вынимает из таблицы address_id и address_name (полный адрес), находит соответствие с полным адресом и должен выдавать на выходе правильный address_id. Делает это объект $stmt, и я не совсем понимаю, как он работает. Address_id = 8 означает, что адреса не существует.

if(!$stop) {
                    $stmt=app()->mysqli->prepare("SELECT `address_id`,`address_name` FROM `address`");
                    $stmt->execute();
                    $stmt->store_result();
                    $stmt->bind_result($address_id,$address_name);
                    $res= $stmt->fetch();
                    $address=mb_strtolower($line['address'],mb_detect_encoding($line['address']));

                    while($res->next()) {
                        $n = strpos($address, $address_name);
                        if($n !==false) {

                            break;

                        }
//это попытка написать условие для последнего адреса в цикле/таблице
                        if($res->next() !==false){
                            $address_id = 8;
                        }
                    }

                }

Проблема в том, что если пользователь ввел что-то, чему не найдено соответствие в таблице , то этот объект берет address_id последнего адреса, даже если не было соответствия и адрес не существует. Видимо, это происходит, когда цикл останавливается (на последнем адресе и берет его id). Попытки написать условие, чтобы поймать последний адрес в цикле/таблице и перезадать id ни к чему пока не привели.

Ещё вариант:
if(!$stop) {
                	$address=mb_strtolower($line['address'],mb_detect_encoding($line['address']));
                    $stmt=app()->mysqli->prepare("SELECT `address_id`,`address_name` FROM `address` WHERE `address_name` LIKE '%{$address}%' LIMIT 1");
                    $stmt->execute();
                    $stmt->store_result();
                    
                    if($stmt->num_rows>0) {
                        $stmt->bind_result($address_id,$address_name);
                        while($stmt->fetch());
                        $stmt->close();
                    } else {
                        $stmt->free_result();
                        $stmt->close();
                        $stmt=app()->mysqli->prepare("SELECT `address_id`,`address_name` FROM `address` WHERE `address_id` = 8");
                    	$stmt->execute();                        
                    	$stmt->store_result();                        
                        $stmt->bind_result($address_id,$address_name);
                        while($stmt->fetch());
                        $stmt->close();
                    }
                    $stop=false;
                }


Подскажите , что ещё можно сделать?
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 1
ematveev
@ematveev
PHP разработчик / руководитель / писатель
последний вариант похож на то, что нужно. а чем он не устраивает?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы