У меня есть страница, как показано на скриншоте ниже. Идея состоит в том, чтобы ввести номер шины и список всех остановок по определенному маршруту, по одному на линию.
Стопы уже хранятся в таблице базы данных, называемой «останавливается». Мне нужен идентификатор каждой остановки из текстового поля. Мой текущий код получает идентификатор последней остановки в текстовом поле. Я чувствую, что у меня что-то не хватает. «busnumber» – мое текстовое поле, а «busroute» – это мое текстовое поле. Я был бы признателен, если кто-нибудь сможет указать мне на то, что мне нужно изменить, чтобы получить идентификатор каждой остановки, введенной в текстовое поле как массив. Спасибо за ваше время заранее.
try { $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); if(isset($_POST["busnumber"]) && isset($_POST["busroute"])){ $stops = explode(PHP_EOL, $_POST["busroute"]); $stopsArray = '"' . implode('","', $stops) . '"'; $sql = "SELECT * FROM stops WHERE stop_name IN ($stopsArray)"; echo $sql."</br>"; $query = $conn->prepare($sql); $query->execute(); $query->setFetchMode(PDO::FETCH_ASSOC); $results = $query->fetchAll(); foreach($results as $result){ echo $result['stop_id'].' '.$result['stop_name'].'</br>'; } } } catch (PDOException $pe) { die("Could not connect to the database $dbname :" . $pe->getMessage());
}
ОБНОВЛЕНИЕ 1 Я изменил код следующим образом
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); if(isset($_POST["busnumber"], $_POST["busroute"])){ $stops = explode(PHP_EOL, $_POST["busroute"]); foreach($stops as $stop){ $sql = "SELECT * FROM stops WHERE stop_name = '".$stop."'"; $statement = $conn->query($sql); echo $sql.'</br>'; $statement->setFetchMode(PDO::FETCH_ASSOC); $results = $statement->fetchAll(); foreach($results as $result){ echo $result['stop_id'].' '.$result['stop_name']; } $statement = null; } }
и все равно получить тот же результат, он дает мне только идентификатор последнего элемента внутри текстового поля
Я просто понял, что у вас есть рабочий код, показанный выше. Прошу прощения за ответы раньше (см. Историю, если я хочу), которые уже там выше (* ха-ха). Здесь я обновил ваш код (первый). Я изменил часть, в которой вы показываете результат:
try { $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); if(isset($_POST["busnumber"]) && isset($_POST["busroute"])){ $stops = explode(PHP_EOL, $_POST["busroute"]); $stopsArray = '"' . implode('","', $stops) . '"'; $sql = "SELECT * FROM stops WHERE stop_name IN ($stopsArray)"; $query = $conn->prepare($sql); $query->execute(); if ($query->rowCount() > 0){ while ($row = $query->fetch(PDO::FETCH_ASSOC)){ echo '<br/>'.$row['stop_id'].' '.$row['stop_name']; } }else{ echo "No records found..."; } } } catch (PDOException $pe) { die("Could not connect to the database $dbname :" . $pe->getMessage()); }
Примечание. Поскольку я прочитал несколько руководств, использование цикла while является обычным, чем fetchAll()
.
Ваша структура db может помочь вам получить более точную информацию. Поскольку этого не хватает, я собираюсь рассказать о нем немного, чтобы дать вам представление.
Каждая шина (маршрут) имеет несколько остановок. Это означает, что в таблице стопов должен быть внешний ключ, который указывает на таблицу маршрутов.
Чтобы выбрать все остановки из таблицы остановок на заданном маршруте, вам нужно изменить инструкцию выбора следующим образом:
Семантический код
SELECT * from stops where stops.routeId = <aGivenRouteId>
или
SELECT * from stops where stops.routeId in (an Array Of Route IDs)
Имейте в виду, что вторая форма медленнее.
Надеюсь, это имеет смысл для вас.
__ОБНОВИТЬ__
Если это так, то может быть много-много отношений. Если это так, найдите другую таблицу, которая соединяет остановки и маршруты. Эта таблица должна содержать только route_id и stop_id, чтобы связывать их друг с другом. Из этой таблицы вы можете выбрать stop_ids на заданном маршруте, а затем из таблицы стопов вы можете получить имена остановок.
Надеюсь, поможет.
__UPDATE2__
О, я вижу. Возможно, вам придется немного изменить свой экран. Что-то вроде этого:
+Add Route-----------------------------------------+ |Bus Number | |__________ | | | |Stops In This Route All Stops | +--------------------------+-+--+------------------+ |Stop 2 |x| |Stop 1 | |Stop 5 |x| |Stop 2 | |Stop 9 |x|<<|Stop 3 | | | |Stop 4 V| +--------------------------+-+--+------------------+ |Add Route | +----------------------------+--+------------------+
В разделе «Остальные стопы» вы можете показать все остановки в БД (в таблице стопов). Для остановок в этой части маршрута я предлагаю вам создать другую таблицу, в которой вы связываете остановки и маршруты, в основном таблицу, содержащую stop_id и route_id.
Будет ли это работать для вас таким образом?
Я ОСНОВАЛ ОШИБКУ. Решение для всех там простое, функция разрыва PHP использовалась для разделения содержимого текстовой области на отдельные строки, но она не работает, если вы используете explode () с PHP_EOL. PHP EOL говорит вам символ новой строки сервера из того, что я понимаю. Вместо этого я использовал preg_split для выполнения разделения, и он работает как на моем локальном хосте, который работает в Windows, так и на моем сервере, который работает в Linux. Спасибо всем за вашу помощь !!!
$conn = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(isset($_POST["busnumber"], $_POST["busroute"])){ $stops = preg_split("/\\r\\n|\\r|\\n/", $_POST['busroute']); $sql = 'SELECT * FROM stops WHERE stop_name LIKE :stop'; $statement = $conn->prepare($sql); foreach($stops as $stop){ $statement->bindValue(':stop', $stop); $statement->execute(); while($result = $statement->fetch()){ echo $result['stop_id'].' '.$result['stop_name'].'</br>'; } } }
$conn = new PDO("mysql:host=$host;dbname=$db;charset=$charset",$user,$pass); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(isset($_POST["busnumber"], $_POST["busroute"])) { $stops = preg_split("/\\r\\n|\\r|\\n/$_POST['busroute']); $sql = 'SELECT * FROM stops WHERE stop_name LIKE :stop'; $statement = $conn->prepare($sql); foreach($stops as $stop){ $statement->bindValue(':stop', $stop); $statement->execute(); while($result = $statement->fetch()) { echo $result['stop_id'].' '.$result['stop_name'].'</br>'; } }