2011-05-31 7 views
1

J'ai des bases de données d'utilisateurs et chacune a des tables. Je veux faire une boucle à travers chaque utilisateur et trouver le nombre de rangées d'une table particulière commune à chacun. Je me connecte donc au premier DB (usersDB) et sélectionne les noms d'autres DB à partir d'une ligne de table (userinfo) (user_name). Je me connecte ensuite à chaque DB en utilisant les noms obtenus dans userinfo et essaye de trouver le nombre de lignes qu'ils ont chacun sur une table particulière (produits) commune à eux. J'ai essayé ceci mais montre le même nombre de rangées pour chacun d'eux. De l'aide??Trouver le nombre de lignes de chaque utilisateur dans 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

Avez-vous cassé vers le bas pour vérifier les variables sont ce que vous pensez qu'elles devraient être? De plus, quel numéro sortez-vous, savez-vous s'il s'agit du premier nombre de lignes db 1 ou 0? – BenWells

+0

@BenWells: Oui Cela compte 1. De toute façon, le problème était que je ne fermais pas les connexions. – karto

Répondre

2

cela peut ne pas être votre problème, mais je vous remarqué arn't Fermeture de la connexion à chaque base de données après l'interrogation. vous devez assigner une variable à mysql_select_db et après avoir écho fermer la base de données comme ceci:

$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); 
    } 
} 

remarque aussi que je pris la ligne mysql_connect() hors de la boucle while parce que vous n'avez pas besoin d'appeler plus d'une fois . et j'ai ajouté la variable $conn pour votre commande mysql_connect(), de cette façon vous pouvez utiliser $ conn dans votre instruction mysql_select_db(). Cela indique à l'instruction select_db quelle connexion rechercher cette base de données (juste un peu plus sûr).

+0

Merci. C'était dû à des erreurs de synthax et ne fermant pas la DB mysql_Close(). Ça a marché. Je veux échapper à l'exécution de rupture quand il n'y a aucune base de données. Comment puis-je y arriver? – karto

+0

@karto - J'ai édité mon post pour refléter ce que vous voulez faire. Fondamentalement, en vérifiant si $ db = true, nous demandons si $ db est une connexion de base de données valide, sinon ce sera faux et rien ne se passera. – sadmicrowave

+0

J'ai également édité ma réponse pour inclure l'erreur de syntaxe dont vous et les autres répondeurs font référence. – sadmicrowave

3

Je pense que problème est en suivant la ligne

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

Je pense que cette ligne sera

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

merci pour les corrections. C'était une combinaison de mysql_select_db ("dbprefix _". $ BName) ou die ("Erreur MySQL:". Mysql_error()); et mySQL Close(); – karto

2

Paraît qu'il ya une faute de frappe ici:

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

Avez vous voulez dire "dbprefix _". $ dbName au lieu de $ bName?

+0

Merci pour la correction. Résolu maintenant. c'était la non-fermeture de mes connexions. – karto

0

C'est une pâte de copie du manuel PHP peut être il vous aide

Si vous utilisez implode() avec la valeur de retour par mysql_fetch_array,

si vous utilisez MYSQL_BOTH sur le paramètre 2, le résultat est vraiment ce que vous attendez. Par exemple: ma base de données sql contient "Amine, Sarah, Mohamed";

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

le résultat est: Amine-Amine-Sarah-Sarah-Mohamed-Mohamed et nous nous attendons simplement: Amine-Sarah-Mohamed

Vous devez utiliser MYSQL_NUM ou MYSQL_ASSOC sur le paramètre 2 pour résoudre le problème .

+0

@G molvi: merci. ça a marché. MYSQL_ASSOC n'était pas le problème, mais j'ai eu quelques erreurs de synthax et n'ai pas fermé mes connexions. – karto

1

Vous n'avez pas besoin d'appeler

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

chaque fois, il suffit d'appeler mysql_select_db pour chaque base de données et PHP réutiliser la connexion

0

Semble plutôt inefficace pour démarrer une nouvelle connexion, en utilisant le même utilisateur/mot de passe pour chaque utilisateur que vous avez.MySQL est parfaitement capable d'interroger à travers différentes bases de données de la même connexion:

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

En bref, faire

SELECT somedb.sometable.somefield 

est la même chose que faire

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