带有条件检查的 PHP MySQL PDO TextArea Where 子句
Posted
技术标签:
【中文标题】带有条件检查的 PHP MySQL PDO TextArea Where 子句【英文标题】:PHP MySQL PDO TextArea Where clause with condition checks 【发布时间】:2016-09-30 08:06:09 【问题描述】:我有一个页面,如下面的屏幕截图所示。这个想法是输入公共汽车号码和特定路线上所有站点的列表,每条线路一个。
停靠点已经存储在名为“stops”的数据库表中,我需要来自 textarea 的每个停靠点的 ID。我当前的代码仅获取 textarea 中最后一站的 ID。我觉得我错过了什么。 'busnumber' 是我的文本字段,'busroute' 是我的文本区域。如果有人能指出我需要更改哪些内容,以便将在 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;
仍然得到相同的输出,它只给了我文本区域内最后一项的 ID
【问题讨论】:
print_r($result)
在 foreach 循环中检查它返回的内容!!
它返回数组([stop_id] => 3 [stop_name] => 16TH ROAD)@Saty
表示它只返回一个结果。将您的查询直接运行到 phpmyadmin 并检查您的查询返回了多少行!
【参考方案1】:
我刚刚意识到上面显示了您的工作代码。我很抱歉之前已经给出了答案(如果你愿意,请参阅历史)(*哈哈)。在这里,我更新了你的代码(第一个)。我更改了显示结果的部分:
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()
更传统。
【讨论】:
会试一试,如果可行的话给你点赞:) 谢谢你的回答 看起来您使用了 mysqli 方法致命错误:在第 59 行的 C:\wamp64\www\reach\addroute.php 中调用未定义的方法 PDOStatement::bind_result() :) 让我找到一个替代 @PirateApp 哎呀!抱歉,查询获取了两次stop_id
。我已经更新了答案,再试一次。
在第 59 行的 C:\wamp64\www\reach\addroute.php 中调用未定义的方法 PDOStatement::bind_result() 就 PDO 而言,似乎没有 bind_result 方法。 .
@PirateApp 哎呀!再次抱歉,因为我将 PDO 与 Mysqli lol 混合在一起,所以我很偏执。我已经再次更新了答案,让我知道它现在是否有效。【参考方案2】:
您的数据库结构可以帮助您获得更准确的信息。由于缺乏,我将对其进行一些推测,只是为了给您一个想法。
每条巴士(路线)都有几个站点。这意味着必须在停止表中定义一个外键,并且它指向路由表。
为了从给定路线上的停靠点表中选择所有停靠点,您需要做的是修改您的选择语句,如下所示:
语义代码
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 |
+----------------------------+--+------------------+
在所有停靠点部分,您可以显示 DB 中的所有停靠点(在停靠点表中)。对于此路线部分中的停靠点,我建议您创建另一个将停靠点和路线关联起来的表,基本上是一个包含 stop_id 和 route_id 的表。
这样对你有用吗?
【讨论】:
感谢您的建议,但整个页面的存在是为了添加路线,停靠点表只有一个 stop_id 和 stop_name,目前存储了 2400 个停靠点,每个停靠点都有一个唯一的 id。我希望能够通过让一个人在文本区域内的新行上键入每个站点名称来快速添加路线,获取每个站点的 id 并将它们添加到路线表中,其中巴士号码将充当路线 id ,后跟止损名称和止损订单。 我还没有route_id,只有当我点击添加路线按钮时,才会生成一个新的路线id,其中包含文本区域中所有站点的公交车号和站点id 嗨@Alp 感谢您的更新,这是我正在尝试做的,我有每个站点的 stop_id 和 stop_name 站点列表。我想将路由添加到数据库。路线表有一个 route_id、stop_id 和 stop_order,其中 route_id 不是唯一的,如果 8 号巴士从 A 到 B,则路线表将具有 8、A、0 和 8、B、1 作为 route_id、stop_id 和 stop_order .我想从文本区域添加路线以简化工作。我在文本区域中添加了 40 个站点名称,它会自动获取每个站点的 id 并将它们添加到路由表中。我被困在为每一行获取 id 的部分 老实说,我对您的术语感到困惑。您是否使用文本区域作为路线名称或站点名称?您似乎可以互换使用这些名称作为“我想从文本区域添加路线以简化工作。我在文本区域中添加了 40 个停靠点名称”。另外,我认为您正在尝试一次做 3 件事:1)在停靠表中添加停靠点 2)为每条路线分配停靠点 3)在路线上订购停靠点。想的简单,做的简单,一步一步地实施。因此你的困惑。 对不起,我的数据库中有站点名称,我正在尝试使用这些站点名称添加路线,我有一个文本区域可以让人们输入 40 个站点名称,页面将在这些站点之间创建一条路线【参考方案3】:我修复了错误。任何人的解决方案都很简单,PHP 的explode 函数用于将文本区域的内容拆分为单独的行,但如果您将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>';
【讨论】:
哦,原来是 PHP 的问题。很高兴你现在解决了这个问题:)【参考方案4】:$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>';
【讨论】:
以上是关于带有条件检查的 PHP MySQL PDO TextArea Where 子句的主要内容,如果未能解决你的问题,请参考以下文章
在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]
如何在 PHP 中使用带有 PDO 的 MySQL 用户函数?
带有 PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 的 PHP 中的致命错误