PDO循环导致无限循环


PDO While loop causing infinite loop

我有一个PDO对象连接到数据库以显示属性,如果找不到if语句的行,我正在尝试显示一条消息。 该消息有效,但是当找到结果时,循环会返回无休止的行并破坏我的 CSS。

它唯一起作用的时间是当我在循环括号内定义我的循环条件时,但随后我的 if 语句条件返回"未定义的变量错误"。我怎样才能让两者一起工作,我看过其他问题并尝试了不同的东西,但一无所获。

//法典

<?php function connectDB () {
    global $hostname, $db, $user, $pass;
    $dbh = new PDO("mysql:host=$hostname; dbname=$db; charset=utf8", $user, $pass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    if (stripos($_SERVER['REQUEST_URI'], 'sales.php')) {
         $sql = "SELECT * FROM DATABASE.property WHERE (bit1&33=33 and sendToPortals ='0') and (addressToDisplay like ? or fullDetails like ?) ORDER BY pricePerWeek ASC";
    }
    else if (stripos($_SERVER['REQUEST_URI'], 'lettings.php')) {
         $sql = "SELECT * FROM DATABASE.property WHERE bit1&17=17 and (addressToDisplay like ? or addressToDisplay like ?) ORDER BY pricePerWeek ASC";
    }
    $query = $dbh->prepare($sql);
    $query->execute(array('%Bedford Court Mansions%','%Adeline Place%')); 
    $query->setFetchMode(PDO::FETCH_ASSOC); 
    $r = $query->fetch();
        if (!$r) {
        echo 'We have successfully Sold 
            all their current property within Bedford Court Mansions, WC1 and urgently require 
            new apartments for sale.
            Call us now on 020 72459 3345, if you are considering 
            selling your property.';
        } 
        else { 
        while ($r): 
            $address = $r['addressToDisplay']; 
            $beds = $r['bedrooms'];
            $price = $r['price_week_min'];
            $summary = $r['summary'];
            $image = $r['mainImage'];
            $area = $r['addressAlias'];
            $id = $r['id'];
            $address1 = str_replace(' ','-',$address);
            $address2 = str_replace(',','',$address1);
?>
    <li class="property">
        <div class="image-wrapper overlay-fade-in">
            <img src="http://www.hurford-salvi-carr.co.uk/pss/image-resize?height=257&width=449&black=1&reflection=0&prop=0&asset=pictures&file=<?php echo $image; ?>" />
            <div class="image-overlay-content">
                <h2>
                    <a href="http://www.hurford-salvi-carr.co.uk/property-for-sale/<?php echo strtolower(str_replace(' ','-',$area)); ?>/<?php echo strtolower(str_replace(' ','-',$address)); ?>/<?php echo $id; ?>" target="_blank">Find out More</a>
                </h2>
            </div>
        </div>
        <div class="property-content">
            <h3><?php echo $address; ?></h3>
            <p><strong>£ <?php echo number_format($price); ?> </strong></p>
            <p><strong><?php echo $beds; ?> &nbsp; Beds</strong></p>
            <p>
                <?php echo substr($summary, 0, 263); ?>...</p>
            <a href="http://www.hurford-salvi-carr.co.uk/property-for-sale/<?php echo strtolower(str_replace(' ','-',$area)); ?>/<?php echo strtolower(str_replace(' ','-',$address)); ?>/<?php echo $id; ?>" target="_blank">Click here to find out more</a>
        </div>
    </li>
<?php           
        endwhile; }}
?>

正如评论中已经指出的,问题的根源是您始终检查while语句中的变量,而不是实际的fetch()方法。这反过来看起来像 while (true) ,它会创建从数据库返回的第一行的无限循环。

若要检查数据库中是否有任何结果,请检查 SELECT 查询返回的行数,如果不是 0,则可以循环访问结果。如果为 0,则显示一条很好的消息,告诉他们未找到任何内容。

<?php 
$query = $dbh->prepare($sql);
$query->execute(array('%Bedford Court Mansions%','%Adeline Place%')); 
$query->setFetchMode(PDO::FETCH_ASSOC);
$numRows = $query->rowCount();
if ($numRows == 0) {
    // No rows returned from database
} else { 
    // We have results!
    while ($query->fetch()): 
        // Loop through it all
?>

参考:

  • http://php.net/manual/en/pdostatement.rowcount.php