2011-05-31 28 views
1

我有用戶數據庫,每個用戶都有表。我想遍歷每個用戶並查找每個用戶共同的特定表的行數。所以我連接到第一個數據庫(usersDB),並從表(userinfo)行(user_name)中選擇其他數據庫的名稱。然後,我使用userinfo中獲得的名稱連接到每個數據庫,並嘗試查找它們在特定表(產品)上共有的行數。我試過這個,但是顯示了所有這些行的相同數量的行。任何幫助?查找MYSQL中每個用戶的行數

<?php 
    //db parameters 
$dbhost = "localhost"; 
$dbname = "usersDB"; 
$dbuser = "root"; 
$dbpass = ""; 

mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error()); 
mysql_select_db($dbname) or die("MySQL Error: " . mysql_error()); 


//select main db 
$query = "SELECT user_name FROM userinfo"; 
$result = mysql_query($query); 
while($row = mysql_fetch_array($result, MYSQL_BOTH)) 
    { 
$dbName =$row['user_name']; 
    mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error()); 
    mysql_select_db("dbprefix_".$bName) or die("MySQL Error: " . mysql_error()); 

// do a query for each db 
    $query = mysql_query('SELECT * FROM `products`');   
    $num_rows = mysql_num_rows($query); 
    echo $dbName." has".$num_rows."products"."<br/>"; 
} 
    ?> 
+0

你有沒有斷下來檢查變量是你認爲他們應該是什麼?你還會出什麼樣的數字,你知道它是第一個數據行計數1還是0? – BenWells 2011-05-31 15:47:06

+0

@BenWells:是它計數1.無論如何,問題是我沒有關閉連接。 – karto 2011-05-31 16:23:34

回答

2

這可能不是你的問題,但我注意到你arn't在從中查詢後關閉到每個數據庫的連接。你應該一個變量分配給mysql_select_db和之後關閉呼應這樣數據庫:

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error()); 
while($row = mysql_fetch_array($result, MYSQL_BOTH)){ 
    $dbName =$row['user_name']; 
    $db = mysql_select_db("dbprefix_".$dbName, $conn) or die("MySQL Error: " . mysql_error()); 
    if($db){ 
     // do a query for each db 
     $query = mysql_query('SELECT * FROM `products`');   
     $num_rows = mysql_num_rows($query); 
     echo $dbName." has".$num_rows."products"."<br/>"; 

     mysql_close($db); 
    } 
} 

還會注意到我把mysql_connect()函數線路輸出while循環,因爲你不需要調用其再次。我爲你的mysql_connect()命令添加了$conn變量,這樣你可以在你的mysql_select_db()語句中使用$ conn。這告訴select_db語句哪個連接查找這個數據庫(只是更安全)。

+0

謝謝。這是由於synthax錯誤,而不是關閉數據庫mysql_Close()。有效。當沒有數據庫時,我想逃避執行。我怎樣才能實現它? – karto 2011-05-31 16:17:22

+0

@karto - 我編輯了我的帖子,以反映你想要做的事情。基本上通過檢查$ db = true,我們問是否$ db是一個有效的數據庫連接,否則它將是錯誤的,什麼都不會發生。 – sadmicrowave 2011-05-31 17:21:26

+0

我還編輯了我的答案,以包含您和其他答覆者所指的語法錯誤。 – sadmicrowave 2011-05-31 19:04:09

3

我認爲問題出在下面一行

mysql_select_db("dbprefix_".$bName) or die("MySQL Error: " . mysql_error()); 

我覺得這條線將是

mysql_select_db("dbprefix_".$dbName) or die("MySQL Error: " . mysql_error()); 
+0

感謝您的更正。它是mysql_select_db(「dbprefix _」。$ bName)或die(「MySQL Error:」。mysql_error())的組合。和mySQL Close(); – karto 2011-05-31 16:14:32

2

看來,這裏有一個錯字:

mysql_select_db("dbprefix_".$bName) or die("MySQL Error: " . mysql_error()); 

難道你的意思是「dbprefix _」。$ dbName而不是$ bName?

+0

感謝您的更正。現在解決。它並沒有關閉我的聯繫。 – karto 2011-05-31 16:22:24

0

這是從PHP手冊中拷貝粘貼可能是它可以幫助你

如果您使用破滅()與mysql_fetch_array返回值,

如果您在參數2使用MYSQL_BOTH,結果不真的是你期待的。

例如: 我的sql數據庫包含「Amine,Sarah,Mohamed」;

$array = mysql_fetch_array($resource,MYSQL_BOTH); 
or $array = mysql_fetch_array($resource); 
echo implode(" - ", $array); 

結果是:胺胺薩拉 - 薩拉 - 穆罕默德 - 穆罕默德 ,我們只是希望:胺薩拉 - 穆罕默德

必須使用MYSQL_NUM或MYSQL_ASSOC上的參數2來解決問題。

+0

@G Molvi:謝謝。它的工作。 MYSQL_ASSOC不是問題,但我有一些synthax錯誤,並沒有關閉我的連接。 – karto 2011-05-31 16:16:22

1

你不需要調用

mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error()); 

每一次,只需要調用mysql_select_db爲每個數據庫和PHP會重用連接

0

似乎啓動一個新的連接效率不高,對於每個用戶使用相同的用戶/密碼。MySQL是完全能夠從同一個連接在不同的數據庫查詢的:

mysql_connect(...); 
$sql = "SELECT user_name FROM userinfo"; 
$result = mysql_query($sql) or die(mysql_error()) { 

while($row = mysql_fetch_assoc($result)) { 
    $username = $row['user_name']; 
    $sql2 = "SELECT count(*) AS cnt FROM dbprefix_{$username}.products"; 
    $result2 = mysql_query($sql2) or (die(mysql_error()); 
    echo "$username has {$result2['cnt']} products"; 
} 

總之,做

SELECT somedb.sometable.somefield 

是一樣的做

mysql_select_db('somedb'); 
SELECT sometable.somefield;