2017-08-05 79 views
1

所以我在我的数据库中的两个表:显示结果从SQL内连接表的PHP页面上

用户:

用户ID的用户类型的用户名

门票:

ticketID userID ticketMessage

我的目标是使用php从USER表中回显用户名,其中来自ticket的USERID =与USER表中的USERID相同。

这里是我到目前为止的代码:

<?PHP 
    if ($result['admin'] == 1) { 

     $sql = "SELECT * FROM ticket ORDER BY ticketDateTime DESC"; 
       $res = do_sql($sql); 

       if ($res->rowCount() == 0) { 
       echo "You have 0 Tickets, you haven't created any tickets!"; 

       } else { 
       ?> 
     <table class="table-container"> 
        <thead> 
         <tr> 
          <th id="table-subject">Subject</th> 
          <th>Id</th> 
          <th>Created</th> 
          <th>User</th> 
          <th>Status</th> 
         </tr> 
        </thead> 
        <tbody> 
       <?php 
       while ($row = $res->fetch(PDO::FETCH_ASSOC)) { 

       ?> 
         <tr> 
          <td> 
          <a id="ticket-subject" href="single-ticket-view.php?page=singletickview&ticketID=<?php echo $row['ticketID'];?>"> 
          <?php 
          echo $row['ticketSubject'];?> 
          </a> 
          </td> 
          <td><?php 
          echo sprintf('%04d', $row['ticketID']); ?> 
          </td> 

          <td><?php 
          $a_date = strtotime($row['ticketDateTime']); 
          $formatted_date = date('d/m/Y', $a_date); 
          echo $formatted_date; ?> 
          </td> 

          <td> 
          <?php 
$sql2 = "SELECT users.username FROM users INNER JOIN ticket ON users.userID = '" . $row['userID'] . "'"; 
$res2 = do_sql($sql2); 
    if ($res2->rowCount() == 1) { 
     echo $res2['username']; 
    } 
           ?> 

          </td> 

          <td> 
          <?php if ($row['is_active'] == 1) {?> 
           <div class="status" id="open">Open</div> 
          <?php } else { ?> 
           <div class="status" id='closed'>Closed</div> <?php } ?> 
          </td> 
         </tr> 
        </tbody> 
       <?php 
       }}?> 
      </table> 

我在这里的问题是,我无法弄清楚如何呼应线60上的用户名,我认为它具有财产以后与我的SQL查询。这里是我在上面的代码段中的第60行的SQL查询和php代码 - 问题100%位于本节内,也许与查询和使用INNER JOIN的不正确方式有关。这里又是:

       <td> 
<?php 
$sql2 = "SELECT users.username FROM users INNER JOIN ticket ON users.userID = '" . $row['userID'] . "'"; 
$res2 = do_sql($sql2); 
    if ($res2->rowCount() == 1) { 
     echo $res2['username']; 
    } 
?> 

          </td> 

$ row ['userID'] =表格票据中的userID,在这种情况下碰巧是11。我去运行SQL查询在PHP我的管理和运行查询:

SELECT users.username FROM users INNER JOIN ticket ON users.userID = 11 

其返回正确的结果我找的,所以我不知道为什么它不会对我的PHP网页呼应。任何帮助将是惊人的,谢谢!

编辑:

我忘了展示我do_sql();功能,那就是:

function do_sql($sql_string) { 
$connection = new PDO("mysql:host=localhost;dbname=secret", 'root', ''); 
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    $row_result = $connection->query($sql_string); 
} catch (PDOException $Exception) { 
    echo $sql_string . '</br>'; 
    echo $Exception; 
    exit(); 
} 

return $row_result; 

}

回答

1

而不是调用查询多次,您可以加入查询并获得单查询执行的用户名。 改变这一行

$sql = "SELECT * FROM ticket ORDER BY ticketDateTime DESC"; 

$sql = "SELECT ticket.*,Users.username FROM ticket LEFT JOIN Users ON ticket.userID = Users.userID ORDER BY ticketDateTime DESC"; 

您可以通过$row['username']得到的用户名;在循环

+0

非常感谢,我不知道为什么我没有想到这个...在这里与SQL初学者!再次感谢。 – Tomble

1

如果你只是执行的初始查询的连接,那么你将有机会获得您需要的所有领域,而不运行的第二查询。

SELECT * FROM ticket INNER JOIN users ON users.userID = ticket.userID ORDER BY ticketDateTime DESC

+0

谢谢尼尔,我不知道为什么我没有想到这一点。当然会让事情变得更容易。 – Tomble

0

,应该是SELECT users.username FROM users INNER JOIN ticket ON users.userID = ticket.USERID希望它帮助,如果您选择一个特定的记录添加WHERE子句中查询

0

你只需要一个SQL查询来获取所有你需要的数据。

SELECT Ticket.*, User.username FROM Ticket INNER JOIN User ON User.userid = Ticket.userID; 

这将选择所有票据数据以及票据所属用户的用户名。用例:

echo $data['username'] . ' has a ticket with the following message: ' . $data['ticketMessage']; 

在未来,我建议你到前缀列名,以防止这样的疑问困惑。 (例如user_name,user_id,ticket_message,ticket_id)。

You can read up more about INNER JOIN here.