2017-08-05 82 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.