Добрый день,
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;
}
Подскажите , что ещё можно сделать?