我有一个页面,如下面的屏幕截图所示。我们的想法是输入公交车号码和特定航线上所有站点的列表,每行一个。
停靠点已存储在名为“stops”的数据库表中我需要textarea中每个停靠点的ID。我当前的代码只获取textarea中最后一站的ID。我觉得我错过了什么。 'busnumber'是我的文本域,'busroute'是我的textarea。如果有人能指出我需要更改的内容,以便将textarea中输入的每个停止点的ID作为数组,我将不胜感激。感谢您提前的时间。
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;
}
}
答案 0 :(得分:4)
我刚刚意识到你上面显示的是工作代码。我很抱歉在上面已经有了答案(看看你想要的历史)(*哈哈)。在这里,我更新了你的代码(第一个)。我更改了显示结果的部分:
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()
。
答案 1 :(得分:3)
您的数据库结构可以帮助您获得更准确的信息。由于它缺乏,我将仅仅为了给你一个想法而推测它。
每辆公共汽车(路线)都有几站。这意味着必须在停靠表中定义一个外键,它指向路由表。
为了从给定路线上的停靠表中选择所有停靠点,您需要做的是修改您的select语句,如下所示:
语义代码
SELECT * from stops where stops.routeId = <aGivenRouteId>
或
SELECT * from stops where stops.routeId in (an Array Of Route IDs)
请记住,第二种形式较慢。
我希望你有意义。
<强> __ UPDATE __ 强>
如果是这种情况,可能存在多对多的关系。如果是这种情况,请查找另一个连接停靠点和路径的表。该表应该只包含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 |
+----------------------------+--+------------------+
在All Stops部分中,您可以显示DB中的所有停靠点(在停靠表中)。对于此路径部分中的停靠点,我建议您创建另一个表,其中关联停靠点和路径,基本上是包含stop_id和route_id的表。
这样对你有用吗?
答案 2 :(得分:2)
我修复了错误。任何人的解决方案都很简单,PHP爆炸功能用于将textarea的内容拆分为单独的行,但如果你使用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>';
}
}
}
答案 3 :(得分:1)
$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>';
}
}