2016-03-30 78 views
0

交代1個用戶通過PHP從SQL

選擇多個值,我有一個用戶表以及存儲與用戶ID的證書另一個表。 1個用戶可以有多個證書。我需要選擇一次用戶並按用戶ID列出所有證書,但我無法正確實現,只爲一個用戶選擇了一個證書。

樣本數據

這非常簡化的樣本數據,對於現實中有超過150個字段和5頁的表。

我有如下表:

用戶

Id FirstName LastName 
1 John  Smith 
2 Lisa  Washington 

證書

UserId CertificateName 
1  Foo 
1  Bar 
1  Something 
2  FooBar 
2  Bizz 

PHP樣子:

$UserID = get_current_user_id(); 
$GetUserId = $_GET["Id"]; 
if(isset($UserID)) {  

    $users = $con->prepare(" 
    SELECT u.FirstName 
      ,u.LastName 
      ,c.CertificateName   
    FROM Users u 
    LEFT JOIN Certificates c ON u.Id = c.UserID 
    WHERE u.Id = '$GetUserId' 
    LIMIT 1 
    "); 

    $users->execute(); 

    $users->bind_result(  
     $FirstName,    
     $LastName, 
     $CertificateName 
    ); 


} else { 
    echo "There is no User ID detected, try to refresh browser."; 
} 

<html> 
.... 

    <?php 
    while ($users->fetch()) { 
    ?> 
     <div class="grid-item"><?php echo $FirstName; ?></div>   
     <div class="grid-item"><?php echo $LastName; ?></div> 
     <div class="certificates"><?php echo $CertificateName; ?></div> 
    <?php 
    } 
    ?> 

輸出NOW

如果我通過GetUserId = 1我得到的結果:

John Smith 
Foo 

所需的輸出

應該列出所有針對特定用戶證書。

John Smith 
Foo 
Bar 
Something 

我已經試過

我試着使用foreach循環而循環中,獲得證書,但這樣它沒有選擇任何證書都沒有。你有什麼想法,我該如何實現它?

+0

您的查詢看起來不錯,應該返回john,bar和其他東西,爲什麼它會返回'Foo'? – sagi

+1

這是很好,你正在使用準備好的陳述。你錯誤地使用它們是不好的。你應該在你的查詢中使用綁定來避免sql注入:'WHERE u.Id =:uid'和'$ users-> execute(array('uid'=> $ GetUserId)) ;' –

回答

0

試試這個:

SELECT 
    * 
FROM 
    Users usr 
INNER JOIN 
    Certificates cert 
ON 
    usr.Id = cert.UserId 
WHERE 
    usr.Id = '1' 

得到這個輸出-1

Id FirstName LastName UserId CertificateName 
1 John  Smith  1  Foo 
1 John  Smith  1  Bar 
1 John  Smith  1  Something 
+0

如果您想要在POST中顯示相同的結果。 ** 1。**遍歷通過我的查詢獲取的結果。 ** 2。**在PHP中創建另一個數組並構建邏輯以將獲取的結果存儲爲所需的格式。 **注意:**這種方式你必須調用數據庫一次(這聽起來有效) –

0

你會輸出約翰·史密斯的多個副本,像這樣的輸出設置:

John Smith 
Foo 
John Smith 
Bar 
John Smith 
Something 

如果你想要的是

John Smith 
Foo 
Bar 
Something 

然後,你需要先輸出之前,無論是讀你的查詢到一個數組:

<?php 
    $certArray = array(); 
    while ($users->fetch()) { 
     $certArray[] = $CertificateName; 
    } 
?> 
     <div class="grid-item"><?php echo $FirstName; ?></div>   
     <div class="grid-item"><?php echo $LastName; ?></div> 
<?php 
    foreach($certArray as $CertificateName) { 
?> 
     <div class="certificates"><?php echo $CertificateName; ?></div> 
<?php 
    } 
?> 

或者把它分解成2個查詢,我將離開別人來解釋,如果你需要它。

+0

謝謝你的答案,它的工作如果我試圖從證書表中只選擇'$ CertificateName'。如果我加入CertificatesDetails表,並試圖在下面選擇'$ CertificateNo':'的foreach($ certArray爲$ CertificateName){ >

Infinity

1

這應該有效,你可能不得不改變你喜歡的其他東西的分隔符。

SELECT u.FirstName, 
     u.LastName, 
     GROUP_CONCAT(c.CertificateName SEPARATOR '<br>') AS CertificateName   
FROM Users u 
LEFT JOIN Certificates c ON u.Id = c.UserID 
WHERE u.Id = '$GetUserId' 
LIMIT 1 

編輯: 根據來自你應該綁定參數,而不是把他們在查詢@Matei米哈伊這是SQL的注射

$users = $con->prepare(" 
SELECT u.FirstName, 
     u.LastName, 
     GROUP_CONCAT(c.CertificateName SEPARATOR '<br>') AS CertificateName   
FROM Users u 
LEFT JOIN Certificates c ON u.Id = c.UserID 
WHERE u.Id = ? 
LIMIT 1 
"); 
$users->bind_param('i',$GetUserId); 
$users->execute(); 
0

像這樣的東西應該工作正確的評論。我使用了結構化編程和mysqli語法,但我相信你可以使用它。

<?php 
//Assuming $con is your DB connector 

$q = 'SELECT * FROM Users'; 
$r = mysqli_query($con, $q); 

while($list = mysqli_fetch_assoc($r)) { ?> 
    <tr>  
    <td><?php echo $list['id']; ?></td> 
    <td><?php echo $list['FirstName']; ?></td> 
    <td><?php echo $list['LastName']; ?></td>   
    <td> 
    <?php 
    //echo the certificate names    
    $userId = $list['id'];        

     $q1 = 'SELECT * from Certificates WHERE UserId = '.$userId.''; 
     $r1 = mysqli_query($con, $q1); 

     while($certif = mysqli_fetch_assoc($r1)){ 

      echo $certif['CertificateName'].'<br /> ';   
     }    
?> 
    </td> 
</tr> 

<?php }?>