在 PHP 中使用来自 2 个 SQL 表的数据

Using data from 2 SQL tables in PHP

提问人:The Major 提问时间:11/11/2023 最后编辑:Your Common SenseThe Major 更新时间:11/13/2023 访问量:98

问:

我有一个脚本,可以访问数据库并遍历商店中的各种商品。我正在尝试访问另一个包含应用程序中的用户及其积分余额的表。当我使用我的脚本时,我得到的结果是每个项目重复三次。所以我的 shopitems 表中有 6 个项目,但我得到了 18 个结果,即项目 1 3 次,项目 2 3 次,等等。我想知道如何解决这个问题。我想要从列表表中获取的唯一一列是他们的积分。

<?php 




include('../config.php');
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT * FROM shopitems CROSS JOIN listings");
$stmt->execute();
while($row = $stmt->fetch()) {
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);

$balance = $row['points'];
$cost = $row['itemcost'];

if ($balance < $cost) {
  $status = 'Not enough points';  
  } 
  else{
  $status = 'Purchase';
  }
echo'

      
  
        <div class="col-lg mb-md-0 mb-4">
          <div class="card border rounded shadow-none">
            <div class="card-body">
              <div class="my-3 pt-2 text-center">
                <img src="'.$row['itemimage'].'" alt="Basic Image" height="140">
              </div>
              <h3 class="card-title text-center text-capitalize mb-1">'.$row['itemname'].'</h3>

              <div class="text-center">
                <div class="d-flex justify-content-center">
                  <sup class="h6 pricing-currency mt-3 mb-0 me-1 text-primary">P</sup>
                  <h1 class="display-4 mb-0 text-primary">'.$row['itemcost'].'</h1>
                </div>
              </div>
<br/>

<a href="./protected/webhook-alerts/shop-purchase.php?desc='.$row['itemdesc'].'" method="post" type="submit" class="btn btn-primary d-grid w-100 post">'.$status.'</a>
            </div>
          </div>
    

     


  ';

}
}catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
    ?>
php sql pdo

评论

0赞 Adi 11/11/2023
为什么使用交叉连接而不是内部连接?
0赞 The Major 11/11/2023
我在发布之前就已经尝试了内部连接,但它仍然用重复项循环我的结果
0赞 Adi 11/11/2023
你能分享一下你尝试使用什么吗?只需在底部创建一个部分,即可在问题中发布编辑,例如Inner JoinEdit: What i have i tried
0赞 The Major 11/11/2023
$stmt = $conn->prepare("SELECT * FROM shopitems INNER JOIN listings");@Adi - 我需要 shopitems 表中的所有数据,listings 表我只需要积分余额,我目前可以获得积分余额,但它正在复制结果
0赞 Barmar 11/11/2023
您应该有一个将两个表关联的子句。ON

答:

0赞 ADyson 11/12/2023 #1

这两个表似乎基本上不相关,因此任何类型的 JOIN 似乎都没有意义。听起来你只需要两个查询。然后,您可以使用 PHP 将不同的数据片段放在输出中的正确位置。

像这样的东西:

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmtListings = $conn->prepare("SELECT points FROM listings WHERE username = :username");
$stmtListings->execute(["username" => $user->username]);
$balanceRow = $stmtListings->fetch(PDO::FETCH_ASSOC);
$balance = $balanceRow['points'];

$stmtItems = $conn->prepare("SELECT * FROM shopitems");
$stmtItems->execute();

while($row = $stmtItems->fetch(PDO::FETCH_ASSOC)) {

  $cost = $row['itemcost'];

  if ($balance < $cost) {
    $status = 'Not enough points';  
  } 
  else{
    $status = 'Purchase';
  }
echo'
        <div class="col-lg mb-md-0 mb-4">
          <div class="card border rounded shadow-none">
            <div class="card-body">
              <div class="my-3 pt-2 text-center">
                <img src="'.$row['itemimage'].'" alt="Basic Image" height="140">
              </div>
              <h3 class="card-title text-center text-capitalize mb-1">'.$row['itemname'].'</h3>

              <div class="text-center">
                <div class="d-flex justify-content-center">
                  <sup class="h6 pricing-currency mt-3 mb-0 me-1 text-primary">P</sup>
                  <h1 class="display-4 mb-0 text-primary">'.$row['itemcost'].'</h1>
                </div>
              </div>
              <br/>
              <a href="./protected/webhook-alerts/shop-purchase.php?desc='.$row['itemdesc'].'" method="post" type="submit" class="btn btn-primary d-grid w-100 post">'.$status.'</a>
            </div>
          </div>
  ';