PDO While循环导致无限循环

时间:2016-02-02 11:52:57

标签: php css pdo while-loop 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; }}
?>

1 个答案:

答案 0 :(得分:1)

正如评论中已经说明的那样,问题的根源在于您始终在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
?>

参考: