Intereting Posts
TCPDF: когда-нибудь добавьте новую страницу, а затем переполнение содержимого следующей страницы Как проверить, включен ли mod_rewrite на сервере? Использование mcrypt для передачи данных через веб-службу не выполняется Laravel – Использование (: any?) Шаблона для ВСЕХ маршрутов? Обновление Laravel 5.2 – класс AuthServiceProvider не найден Как исправить ошибку веб-сайта iframe? Что нужно хранить в файлах cookie для реализации «Запомнить меня» во время входа в систему GTM не распознает мой dataLayer, но консоль делает? JqGrid Reload не работает Результаты поиска функции в таблице Для очищенных или неустановленных массивов php, собраны ли элементы мусора? Как реализовать cron в коде (php)? Оптимизация одновременных запросов ImageMagick с использованием redis / php-resque MySQLi обновляет запись через форму, загруженную с PHP и SQL. База данных не обновляется Управление разрешениями пользователей с помощью иерархии

PHP MySQL PDO TextArea Где условие с проверкой состояния

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

Моя страница добавления маршрута

Стопы уже хранятся в таблице базы данных, называемой «останавливается». Мне нужен идентификатор каждой остановки из текстового поля. Мой текущий код получает идентификатор последней остановки в текстовом поле. Я чувствую, что у меня что-то не хватает. «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>'; } }