PHP MySQL PDO TextArea具有条件检查的Where子句

时间:2016-06-01 05:54:23

标签: php mysql pdo textarea

我有一个页面,如下面的屏幕截图所示。我们的想法是输入公交车号码和特定航线上所有站点的列表,每行一个。

My Add Route Page

停靠点已存储在名为“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;

    }
        }

仍然得到相同的输出,它只给我textarea中最后一项的ID The error is still here

4 个答案:

答案 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>';                        
                  }

}