【问题标题】:How to PDO query to retrieve rows that match a value in an array如何 PDO 查询以检索与数组中的值匹配的行
【发布时间】:2021-06-04 13:40:46
【问题描述】:

我有一个表,其中包含以逗号分隔的值的列附近的景点。例如 A001,A002

我正在查询该列,然后将内容转换为一个名为 $NearbyAttractionsArray 的数组。

print_r($NearbyAttractionsArray);

数组([0] => A001 [1] => A003)

我想运行一个 PDO SQL 查询来查找与数组的每个值匹配的记录,然后在循环中输出它们。

$arrayQuery = $this->con->prepare("SELECT attid, attTitle, attThumbnail, AttTagline 从景点 WHERE attid=$NearbyAttractionsArray AND attStatus=1");

$arrayQuery->execute();

当我尝试这个时,它会将 $NearbyAttractionsArray 转换为一个名为数组的字符串...

对于 attId 与数组中的某个值匹配的每一行,输出值 attid、attTitle、attThumbnail、AttTagline 的正确语法是什么?

我怀疑需要某种 foreach 循环,但找不到将其写为 PDO 语句的正确方法。

非常感谢

从角度来看,我的完整课程代码是:

<?php 

class NearbyAttractionsProvider {

private $con, $attId;

    public function __construct($con, $attId) {
        $this->con = $con;
        $this->attId = $attId;
    } // end of constructor


    public function createNearbyAttractionsList($con, $attId) {
        $query = $this->con->prepare("SELECT nearbyAttractions FROM attractions WHERE attId=:attId");
            $query->bindParam(":attId", $attId);
            $query->execute();

            $this->sqlData = $query->fetch(PDO::FETCH_ASSOC);
            $NearbyAttractions = $this->sqlData["nearbyAttractions"];
            $NearbyAttractionsRemoveCommas = str_replace(',', '',$NearbyAttractions);
            $NearbyAttractionsArray = str_split($NearbyAttractionsRemoveCommas, 4);

            print_r($NearbyAttractionsArray);

            $CountNearbyAttractions = sizeof($NearbyAttractionsArray);

            if($NearbyAttractionsArray[0] != "") {
                $results = "<h3>There are $CountNearbyAttractions Nearby Attractions</h3>";

                $arrayQuery = $this->con->prepare("SELECT attid, attTitle, attThumbnail, AttTagline FROM attractions WHERE 
                                attid=$NearbyAttractionsArray AND attStatus=1");
                $arrayQuery->execute();

                $results .= "<div class='nearbyAttractionsItemsContainer'>";
                while($row = $arrayQuery->fetchAll(PDO::FETCH_ASSOC)) {
                        $id = $row["attid"];
                        $img = $row["attThumbnail"];
                        $title = $row["attTitle"];
                        $tagline = $row["AttTagline"];

                $results .= "<div class='nearbyAttractionListItem'>
                                <a href='Attraction.php?attId=$id&title=$title' data-AttractionId='$id' 
                                class'NearbyAttractionItem-url'>
                                <img class='NearbyAttractionItem-thumbnail' src='$img' height='220' width=300'>
                                <h3 class='NearbyAttractionItem-title'>$title</h3>
                                <p class='NearbyAttractionItem-tagline'>$tagline</p>
                                </a>
                            </div>";
                } // End of while loop
            $results .= "</div>"; // End of nearbyAttractionsItemsContainer

            } // End of IF statement

            else {
                $results = "<h3>There are No Nearby Attractions</h3>";
            } // End of Else statement

        return $results;         

    } // End of public function createNearbyAttractionsList

} // End pf class NearbyAttractionsProvider

【问题讨论】:

  • 看看这个可能的骗局,stackoverflow.com/questions/14767530/…
  • 你为什么不简单地加入?
  • 这是另一个很好的例子,说明为什么逗号分隔的数据不适合 DB 列。如果这只是在 1nf 中,您可以使用子查询。见stackoverflow.com/questions/3653462/…
  • 联接是链接两个或多个表中的行,但这里只有一个表,因此不是有效的解决方案。

标签: php arrays foreach


【解决方案1】:

您的查询应如下所示:

SELECT attid, attTitle, attThumbnail, AttTagline 
FROM attractions 
WHERE attid IN('A001', 'A003')
AND attStatus=1

当然,我假设attid 存储原子值。要将数组项转换为字符串,您可以使用foreach() loopimplode() function。在第二种情况下,您需要在加入之前用撇号包裹它。

【讨论】:

  • 应该加入占位符,不需要撇号。
【解决方案2】:

花了好几个小时,它与 foreach 循环一起工作。

<?php 
    
    class NearbyAttractionsProvider {
    
    private $con, $attId;
    
        public function __construct($con, $attId) {
            $this->con = $con;
            $this->attId = $attId;
        } // end of constructor
    
    
        public function createNearbyAttractionsList($con, $attId) {
            $query = $this->con->prepare("SELECT nearbyAttractions FROM attractions WHERE attId=:attId");
                $query->bindParam(":attId", $attId);
                $query->execute();
    
                $this->sqlData = $query->fetch(PDO::FETCH_ASSOC);
                $NearbyAttractions = $this->sqlData["nearbyAttractions"];
                $NearbyAttractionsRemoveCommas = str_replace(',', '',$NearbyAttractions);
                $NearbyAttractionsArray = str_split($NearbyAttractionsRemoveCommas, 5);
    
                $CountNearbyAttractions = sizeof($NearbyAttractionsArray);
    
                if($NearbyAttractionsArray[0] != "") {
                    $results = "<h3>There are $CountNearbyAttractions Nearby Attractions</h3>";
    
                    foreach($NearbyAttractionsArray as $row) {
    
                        $arrayQuery = $this->con->prepare("SELECT attId, attTitle, attThumbnail, AttTagline FROM attractions WHERE 
                                    attId=:row AND attStatus=1");
                        $arrayQuery->bindParam(":row", $row);
                        $arrayQuery->execute();
    
                        $results .= "<div class='nearbyAttractionsItemsContainer'>";
                        while($row = $arrayQuery->fetch(PDO::FETCH_ASSOC)) {
                                $id = $row["attId"];
                                $img = $row["attThumbnail"];
                                $title = $row["attTitle"];
                                $tagline = $row["AttTagline"];
    
                        $results .= "<div class='nearbyAttractionListItem'>
                                        <a href='Attraction.php?attId=$id&title=$title' data-AttractionId='$id' 
                                        class'NearbyAttractionItem-url'>
                                        <img class='NearbyAttractionItem-thumbnail' src='$img' height='220' width=300'>
                                        <h3 class='NearbyAttractionItem-title'>$title</h3>
                                        <p class='NearbyAttractionItem-tagline'>$tagline</p>
                                        </a>
                                    </div>";
                        } // End of while loop
                    $results .= "</div>"; // End of nearbyAttractionsItemsContainer
                    } // End of foreach loop
                    
                } // End of IF statement
    
                else {
                    $results = "<h3>There are No Nearby Attractions</h3>";
                } // End of Else statement
    
            return $results;         
    
        } // End of public function createNearbyAttractionsList
    
    } // End pf class NearbyAttractionsProvider

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多