2013-08-19 79 views
0

我正在從數據庫中挑選用戶數據的表上工作。無法檢索每個記錄額外查詢的值?

問題是,即時通訊不能在我的條件,因爲我從不同的表和行獲取數據兩個語句。

@CODE

<?php 
$con = mysql_connect("localhost", "username", "password") or die(mysql_error()); 
mysql_select_db("database_name") or die(mysql_error()); 

$result = mysql_query("select * FROM users"); 

$space_used = mysql_query("SELECT SUM(fileSize) FROM file WHERE file.userId=users.id AND file.statusId=1"); 

$total_files = mysql_query("SELECT COUNT(id) FROM file WHERE file.userId=users.id AND file.statusId=1"); 

echo "<table class='table table-striped table-hover table-bordered' id='sample_editable_1'> 
<tr> 
    <th>Username</th> 
    <th>Type</th>         
    <th>Email</th> 
    <th>Last Login</th> 
    <th>Last IP</th> 
    <th>space_used</th> 
    <th>total_files</th> 
    <th>status</th> 
</tr>"; 

while($row = mysql_fetch_array($result)) 
{ 
    echo "<tr>"; 
     echo "<td>" . $row['username'] . "</td>"; 
     echo "<td>" . $row['level'] . "</td>"; 
     echo "<td>" . $row['email'] . "</td>"; 
     echo "<td>" . $row['lastlogindate'] . "</td>"; 
     echo "<td>" . $row['lastloginip'] . "</td>"; 
     echo "<td>" . $space_used['space_used'] . "</td>"; 
     echo "<td>" . $total_files['total_files'] . "</td>"; 
     echo "<td>" . $row['status'] . "</td>"; 
    echo "</tr>"; 
} 

echo "</table>"; 
mysql_close($con); 
?> 

什麼即時得到的用戶名,級別,電子郵件,lastlogindate的所有值,lastloginip &狀態。在我的桌子上沒有顯示的兩個是我想要實現的第二個條件:space_used和total_files。

我在做什麼錯了?我不是一個PHP的專家,事實上,我有一個混合的教程和腳本即時鏈接來獲得這個結果有點複雜。

謝謝

+8

注意:'mysql'庫已被棄用,並且自PHP5.5以來已被刪除 - 您正在運行一個過時的版本。當您或您的主機升級時,您的應用程序將停止工作。 –

+3

您確實需要了解如何執行SQL表連接,因爲這是您需要執行的操作。您可以在一個查詢中獲取所有這些數據。您也不應該使用'mysql_ *'函數,因爲它們已被棄用。所以,無論你遵循的教程是真的過時了。你應該調查使用'mysqli'或'PDO'。 –

+1

@ConnorPeet:不要誇大它; ext/mysql已棄用,但尚未刪除AFAIK。如果它在5.7之前被取出,即使那樣,我也會感到驚訝。 – cHao

回答

1

您需要重新修改您的查詢,您可以使用JOIN恢復您3個查詢到一個查詢:

SELECT u.*, 
     SUM(f.fileSize) AS space_used, 
     COUNT(f.id) AS total_files 
    FROM users u 
    JOIN file f 
     ON f.userId = u.id AND f.statusId = 1 
GROUP BY u.id 

然後,你可以這樣閱讀:

<?php 
// your database info 
$db_host = 'your MySQL server host'; 
$db_user = 'your username'; 
$db_pass = 'your password'; 
$db_name = 'your database name'; 
$con = new mysqli($db_host, $db_user, $db_pass, $db_name); 
if($con->connect_error) 
{ 
     die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error()); 
} 

if (!$result = $con->query("SELECT u.*, 
            SUM(f.fileSize) AS space_used, 
            COUNT(f.id) AS total_files 
           FROM users u 
           JOIN file f 
           ON f.userId = u.id AND f.statusId = 1 
          GROUP BY u.id")) 
{ 
    die('Select query error: ' . $con->error); 
} 
?> 
<table class='table table-striped table-hover table-bordered' id='sample_editable_1'> 
    <tr> 
     <th>Username</th> 
     <th>Type</th>         
     <th>Email</th> 
     <th>Last Login</th> 
     <th>Last IP</th> 
     <th>space_used</th> 
     <th>total_files</th> 
     <th>status</th> 
    </tr> 
<?php 
while ($row = $result->fetch_array()) 
{ 
?> 
    <tr> 
     <td><?php echo $row['username']; ?></td> 
     <td><?php echo $row['level']; ?></td> 
     <td><?php echo $row['email']; ?></td> 
     <td><?php echo $row['lastlogindate']; ?></td> 
     <td><?php echo $row['lastloginip']; ?></td> 
     <td><?php echo $row['space_used']; ?></td> 
     <td><?php echo $row['total_files']; ?></td> 
     <td><?php echo $row['status']; ?></td> 
    </tr> 
<?php 
} 
$con->close(); 
?> 
</table> 
+0

完美。像魅力一樣工作。感謝m8 –

0

首先查詢數據庫並將結果保存到變量中。

$result = mysql_query("select * FROM users"); 
$space_used = mysql_query("SELECT SUM(fileSize) FROM file WHERE file.userId=users.id AND file.statusId=1"); 
$total_files = mysql_query("SELECT COUNT(id) FROM file WHERE file.userId=users.id AND file.statusId=1"); 

然後你通過你的第一個結果的迭代與

while($row = mysql_fetch_array($result)) 

通知您的來電mysql_fetch_array。另外兩個結果你永遠不會撥打mysql_fetch_array

查看PHP documentation on mysql_query瞭解更多詳情。具體而言,返回類型是資源

返回的結果資源應該傳遞給mysql_fetch_array()和其他用於處理結果表的函數來訪問返回的數據。

然而,

SELECT SUM(fileSize) FROM file WHERE file.userId=users.id AND file.statusId=1 

甚至不是你想要的。您檢查file.userId=users.id,但只能從file表中讀取。您缺少用戶源表。

+0

「你從來不會在其他兩個結果上調用mysql_fetch_array。」我該怎麼做?這就是我尋找的答案。謝謝 –

+0

我已經做到了這一點:while($ row = mysql_fetch_array($ result)&& $ row2 = mysql_fetch_array($ space_used)&& $ row3 = mysql_fetch_array($ total_files))但沒有工作 –

+0

我刪除了一段時間因爲在查詢第二個和第三個查詢只有一個結果時它無效。所以你不想迭代結果,但只爲這些結果獲取結果。 – Kissaki

1

您想要聚合每個userId。

這兩個查詢進入while循環。使用檢索到的用戶的id進行彙總查詢。

while($row = mysql_fetch_array($result)) 
{ 
    $space_used = mysql_query("SELECT SUM(fileSize) FROM file WHERE file.userId={$row['id']} AND file.statusId=1"); 
    $total_files = mysql_query("SELECT COUNT(id) FROM file WHERE file.userId={$row['id']} AND file.statusId=1"); 
    ... 
} 

結合他們到一個查詢。

$agragateDataResponce = mysql_query("SELECT SUM(fileSize) as size, 
              COUNT(id) as count 
             FROM file 
             WHERE file.userId={$row['id']} AND 
              file.statusId=1"); 
$agragateData = mysql_fetch_array($agragateDataResponce); 

通過$agragateData['size']$agragateData['count']訪問;

然後查看如何將剩餘的兩個SQL合併爲一個連接:)。SO Question on topic

0

嘗試使用

$space_used = mysql_query("SELECT SUM(fileSize) 
          FROM file 
          WHERE file.userId=users.id AND 
            file.statusId=1"); 

$total_files = mysql_query("SELECT COUNT(id) 
           FROM file 
          WHERE file.userId=users.id AND 
            file.statusId=1"); 

以上內線While並使用user.id驗證

我是新來的stackoverflow,所以不要我的。我不知道如何讓代碼看起來像每個人一樣