foreach循环和SQL(PDO)的问题

时间:2014-05-06 12:48:09

标签: php mysql sql pdo

我是新来的,这是我的第一个问题:)

我有这段代码:

<?php                   
/*
* Load messages from right users
*/
try {
    $selectContactQuery = 'SELECT profile_id, user_id  
        FROM profilecontact
        WHERE profile_id=:profile_id AND owner_id=:owner_id;';

    $prepSelectContacts = $conn->prepare($selectContactQuery);
    $prepSelectContacts->bindParam(':profile_id', $urlPid, PDO::PARAM_INT);
    $prepSelectContacts->bindParam(':owner_id', $uid, PDO::PARAM_INT);
    $prepSelectContacts->execute();
    $contactsResult = $prepSelectContacts->fetchAll();
    $contactsCount = count($contactsResult);
}
catch(PDOException $e) {
    $conn = null;
    header('Location: ../errors/error_101.html');
}

foreach($contactsResult AS $contactsRow) {
    $scrapProfileId = $contactsRow['profile_id'];
    $scrapUserId = $contactsRow['user_id'];

    $selectScrapQuery = 'SELECT scraps.user_id, scraps.scrap_text, scraps.profile_id, scraps.add_date, user.user_id, user.profile_picture_50
        FROM scraps
        JOIN user ON(scraps.user_id = user.user_id) 
        WHERE scraps.user_id = scraps.user_id AND scraps.profile_id = scraps.profile_id ORDER BY add_date';
    $prepSelectScrap = $conn->prepare($selectScrapQuery);
    $prepSelectScrap->bindParam(':scraps.user_id', $scrapUserId, PDO::PARAM_INT);
                $prepSelectScrap->bindParam(':profile_id', $scrapProfileId, PDO::PARAM_INT);
    $prepSelectScrap->execute();
    $scrapResult = $prepSelectScrap->fetchAll();
    $scrapResultCount = count($scrapResult);

    if($scrapResultCount > 0) {
        foreach($scrapResult AS $scrapResultRow) {
            echo '<div class="parentArrow"></div>
            <div class="scrapItemParent">
            <img class="scrapProfilePic" src=" ' . $scrapResultRow['profile_picture_50']. '" />
            <div class="scrapContent">' . $scrapResultRow['scrap_text'] . '<br />
            <span class="scrapTime">' . $scrapResultRow['add_date'] . '<br />' .  $scrapResultRow['user_id'] . ' ' . $scrapResultRow['profile_id'] . '</span></div></div>';
        }
    }
}
?>

我尝试做的是第一个SQL查询,我尝试选择一个用户的联系人和他/她关联的特定个人资料。这给了我一个看起来像的结果集:

+-----------+---------+
|profile_id | user_id |
+-----------+---------+
| 32        |  45     |
| 32        |  56     |
| 32        |  78     |
+-----------+---------+

我使用foreach获得了这些结果,您可以在我的代码中看到,该行开头是&#34; foreach($ contactsResult AS $ contactsRow)...&#34;在这个foreach循环中,我执行一个SQL查询来加载来自与正确配置文件关联的用户的消息(第一个SQL查询是加载用户及其关联的配置文件)。但是,我有很多问题。首先,在第二个SQL查询中,有一个WHERE子句:

"WHERE scraps.user_id = scraps.user_id AND scraps.profile_id = scraps.profile_id"

但是,第二个WHERE条件与scraps.profile_id ...被忽略。消息也会多次显示(测试时两次)。

有谁知道这段代码有什么问题?它没有给我任何错误,它只是赢得了我想要它做的事情。我知道大多数问题都是因为循环,但我无法看到另一种实现我需要的方式。

2 个答案:

答案 0 :(得分:1)

您必须在查询中输入您的php变量

WHERE scraps.user_id = scraps.user_id AND scraps.profile_id = scraps.profile_id 

这将总是相同的,因为scraps.user_id = scraps.user_id正在比较某些东西

您可以使用:

WHERE scraps.user_id = :scrapUserId AND scraps.profile_id = :scrapProfileId 

在这里,我将变量:scrapUserId:scrapProfileId输入到您的查询中。 这将使您能够使用以下语句设置这些值:

$prepSelectScrap->bindParam(':scrapUserId', $scrapUserId, PDO::PARAM_INT);
$prepSelectScrap->bindParam(':scrapProfileId', $scrapProfileId, PDO::PARAM_INT);

答案 1 :(得分:1)

试试这个

 $selectScrapQuery = 'SELECT scraps.user_id, scraps.scrap_text, scraps.profile_id, scraps.add_date, user.user_id, user.profile_picture_50
                                            FROM scraps
                                            JOIN user ON(scraps.user_id = user.user_id) 
                                            WHERE scraps.user_id =:scraps_user_id AND scraps.profile_id =:scraps_profile_id ORDER BY scraps.add_date';
            $prepSelectScrap = $conn->prepare($selectScrapQuery);
            $prepSelectScrap->bindParam(':scraps_user_id', $scrapUserId, PDO::PARAM_INT);
            $prepSelectScrap->bindParam(':scraps_profile_id', $scrapProfileId, PDO::PARAM_INT);