其他声明没有出现

时间:2016-06-23 18:48:51

标签: php mysqli

我正在开展一个学校项目,人们可以在那里出售房屋并购买房屋。我试图做一个最喜欢的"功能,但第一步不是100%工作。第一步是如果用户将房子保存为收藏,如果用户没有将房子保存为收藏,则心脏会变红,心脏应为灰色。

这是我在while循环中使用的代码,其中所有房屋都将返回,因此$ detailsHuis [' id']来自while循环。

<?php
$huisid = $detailsHuis['id'];
$getFavoriet = "SELECT * FROM favoriet WHERE persoon_id = $gebruikerid AND huis_id = $huisid";
$dataFavoriet = mysqli_query($con, $getFavoriet) or die(mysqli_error($con));
?>
<?php while($detailsFavoriet = mysqli_fetch_assoc($dataFavoriet)): ?>                   
    <?php if($getFavoriet || mysqli_num_rows($getFavoriet) > 0): ?>
        <span class="favorite" style="margin-top: 0px; color: #f44336;"><i class="fa fa-heart" style="margin-right: 0px;"></i></span>
    <?php else: ?>
        <span class="favorite" style="margin-top: 0px;"><i class="fa fa-heart" style="margin-right: 0px;"></i></span>
    <?php endif; ?>
<?php endwhile; ?>

当mysqli_num_rows高于0时,我看到房屋信息旁边有一颗红心,但当mysqli_num_rows低于0时,我看到房屋信息旁边没有心脏。

$ con在config.php中创建

$con = mysqli_connect("localhost","root","kerimbjk","huizenverkoop");

if (!$con) {
    echo "Kan geen verbinding maken met MySQL" . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}

如果有人可以帮我解决这个问题,我会很高兴。

编辑: 表(favoriet):

+--------------------------+
| id | huis_id | persoon_id|
| 1  |   4     |     2     |
| 2  |   6     |     4     |
+--------------------------+

表(huis)(完整版:http://prntscr.com/bk5zkl):

+------------------------+
| id | prijs | stad      |
| 1  | 146521| Amsterdam |
| 2  | 125932| London    |
+------------------------+

表(persoon):

+-----------------------+
| id |username|password |
| 1  | test123|encrypted|
| 2  | demo   |encrypted|
+-----------------------+

favoriet意味着最爱,huis意味着家,prijs意味着价格,stad意味着城市,persoon意味着人。

我的&#34;房子&#34;循环,你也可以看到&#34;最喜欢的&#34;环。 由于某种原因,我无法通过整个代码,所以这里是:http://pastebin.com/Ld2rqcQX

1 个答案:

答案 0 :(得分:0)

一些问题:

  • 您在SQL结果集上有一个循环,其中包含另一个被执行的SQL语句,这实际上效率不高。最好使用一个SQL语句,并在其中加入favoriet表。
  • 您应用CSS类favorite是否是最喜欢的,而您应该逻辑上只申请收藏。连接到:不要再添加颜色样式。该颜色应在favorite类中定义。
  • 您的代码容易受到SQL注入攻击,因为您在SQL字符串中注入了$gebruikersid。这不是你应该怎么做的。而是使用prepared statement并单独传递参数。

以下是一些可用于解决上述问题的未经测试的代码:

<?php

$detailsSql = 
    "SELECT   huis.*, favoriet.id AS fav_id 
    FROM      huis
    LEFT JOIN favoriet ON favoriet.huis_id = huis.id
    WHERE     favoriet.persoon_id = ?"; 

$stmt = mysqli_prepare($con, $detailsSql) or die(mysqli_error($con));
mysqli_stmt_bind_param($stmt, "i", $gebruikerid);
mysqli_stmt_execute($stmt);
$detailsRes = mysqli_stmt_get_result($stmt);

while ($detailsHuis = mysqli_fetch_assoc($detailsRes)): ?>
<div class="item overzicht-item">
    <!-- ... etc ... -->
            <span class="<?php echo $detailsHuis['fav_id'] ? 'favorite' : '' ?>" 
                  style="margin-top: 0px;">
                <i class="fa fa-heart" style="margin-right: 0px;"></i>
            </span>
    <!-- ... etc ... -->
</div>
<?php endwhile; ?>

... etc ...部分可以像您一样保留。