在MYSQL中查找每个用户的行数

时间:2011-05-31 15:42:23

标签: php mysql

我有用户数据库,每个都有表。我想遍历每个用户并找到每个用户共有的特定表的行数。所以我连接到第一个DB(usersDB)并从表(userinfo)行(user_name)中选择其他DB的名称。然后,我使用在userinfo中获取的名称连接到每个数据库,并尝试查找它们在它们共有的特定表(产品)上各自具有的行数。我尝试了这个,但显示了所有这些行的相同行数。任何帮助?

<?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/>";
} 
  ?>

6 个答案:

答案 0 :(得分:3)

我认为问题在以下一行

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

我认为这一行将是

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

答案 1 :(得分:2)

这里似乎有一个错字:

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

您的意思是“dbprefix _”。$ dbName而不是$ bName?

答案 2 :(得分:2)

这可能不是您的问题,但我注意到您在查询后不会关闭与每个数据库的连接。你应该为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语句要查找此数据库的连接(只是更安全)。

答案 3 :(得分:1)

您无需致电

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

每次,只需为每个数据库调用mysql_select_db,PHP将重用连接

答案 4 :(得分:0)

这是一本来自php手册的复制粘贴可能对你有帮助

如果你使用带有mysql_fetch_array的返回值的implode(),

如果在参数2上使用MYSQL_BOTH,结果实际上并不是您所期望的。

例如: 我的sql数据库包含“Amine,Sarah,Mohamed”;

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

结果是:Amine-Amine-Sarah-Sarah-Mohamed-Mohamed 我们只期望:Amine-Sarah-Mohamed

您必须在参数2上使用MYSQL_NUM或MYSQL_ASSOC来解决问题。

答案 5 :(得分: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;