2009-02-01 9 views
1

Je veux exécuter une requête SQL comme:place plusieurs champs similaires dans un tableau multidimensionnel - php mysql

 
select 'tb1'.'f1','tb1'.'f2','tb2'.'f1' from 'tb1','tb2'; 

Maintenant, le problème est que je veux le mettre dans un tableau en PHP comme:

 
$result['tb1']['f1'], $result['tb1']['f2'], $result['tb2']['f1']... 

Une idée de comment réaliser ce qui précède? Afaik il n'y a pas de fonction qui fait ce qui précède. Je me demandais la meilleure façon simple de le faire. Je ne veux pas utiliser une requête comme "select .. as .." à moins que nécessaire.

Je ne sais pas à l'avance ce que seront les champs, donc je ne peux pas les assigner manuellement comme le suggère la réponse de benlumley.

Merci, Alec

+0

que diriez-vous de maintenant? Je l'ai mis à jour à la lumière de ce que dit Bill Karwin. – benlumley

Répondre

3

Vous devez sélectionner les données que vous faites déjà, puis en boucle sur elle l'obtenir dans le format requis, et parce que les champs ont les mêmes noms, le plus facile pour utiliser des alias ou ils vont juste s'écraser les uns les autres dans les données retournées (mais vous pouvez utiliser mysql_fetch_row à la place, ce qui retourne un tableau indexé numériquement).

Par exemple:

$sql = "select tb1.f1 as tb1f1,tb1.f2 as tb1f2,tb2.f1 as tb2f1 from tb1,tb2"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_assoc($result)) { 
    $result['t1']['f1']=$row['tb1f1']; 
    $result['t1']['f2']=$row['tb1f2']; 
    $result['t2']['f1']=$row['tb2f1']; 
} 

(La citation a été mal dans votre sql aussi)

Cela ne traitera pas plusieurs lignes non plus, mais votre question genre de implique que vous ne jamais attendez une rangée?

alias WithOUT:

$sql = "select tb1.f1,tb1.f2,tb2.f1 from tb1,tb2"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_row($result)) { 
    $result['t1']['f1']=$row[0]; 
    $result['t1']['f2']=$row[1]; 
    $result['t2']['f1']=$row[2]; 
} 

Je préfère la première version, sauf si vous avez une bonne raison d'utiliser la seconde, comme moins susceptibles d'entraîner des erreurs si vous changez jamais sql ou ajouter des champs, etc.

EDIT:

Prendre l'idée de méta-données de la réponse ci-dessous ....

<?php 
mysql_connect('localhost', 'username', 'password'); 
mysql_select_db('dbname'); 
$result = mysql_query('select tb1.f1, tb1.f2, tb2.f1 from tb1, tb2'); 
$meta = array(); 
for ($i = 0; $i < mysql_num_fields($result); ++$i) { 
    $meta[$i] = mysql_fetch_field($result, $i); 
} 
while ($row = mysql_fetch_row($result)) { 
    foreach($row as $key=>$value) { 
    $out[$meta[$key]->table][$meta[$key]->name]=$value; 
    } 
} 

semble faire exactement ce que vous recherchez - bien que vous ne puissiez toujours obtenir qu'une ligne à la fois.

facilement mis à jour pour stocker plusieurs lignes avec une autre dimension sur le tableau:

Change:

$out[$meta[$key]->table][$meta[$key]->name]=$value; 

Pour:

$out[][$meta[$key]->table][$meta[$key]->name]=$value; 
0

Préfixer noms de champs avec la version courte du nom de la table est un bon moyen de le réaliser sans avoir besoin de créer des alias dans select. Bien sûr, vous n'obtenez pas la structure exacte que vous avez décrite mais chaque champ a son index unique dans le tableau des résultats. Supposons par exemple que vous ayez des utilisateurs de table et que l'utilisateur ait un nom, appelez ce champ nom_utilisateur.

2

Puisque vous dites que vous ne pouvez pas spécifier des alias de colonne, et vous ne pouvez pas connaître les champs de la requête préalable, je vous suggère une solution à l'aide mysql_fetch_field() pour obtenir des informations de métadonnées:

<?php 
mysql_connect('localhost', 'username', 'password'); 
mysql_select_db('dbname'); 
$result = mysql_query('select tb1.f1, tb1.f2, tb2.f1 from tb1, tb2'); 
for ($i = 0; $i < mysql_num_fields($result); ++$i) { 
    $meta = mysql_fetch_field($result, $i); 
    print_r($meta); 
} 

Vous pouvez extraire de cette information de métadonnées le nom de la table et le nom de la colonne, même s'il y a plusieurs colonnes du même nom dans la requête.

La fonction ext/mysqli de PHP supporte une fonction similaire mysqli_stmt::result_metadata(), mais vous avez dit que vous ne pouvez pas connaître le nombre de champs dans la requête au préalable, ce qui rend difficile l'utilisation de mysqli_stmt::bind_result(). PDO_mysql ne semble pas prendre en charge les métadonnées des ensembles de résultats pour l'instant.


La sortie du script ci-dessus est ci-dessous.

stdClass Object 
(
    [name] => f1 
    [table] => tb1 
    [def] => 
    [max_length] => 1 
    [not_null] => 0 
    [primary_key] => 0 
    [multiple_key] => 0 
    [unique_key] => 0 
    [numeric] => 1 
    [blob] => 0 
    [type] => int 
    [unsigned] => 0 
    [zerofill] => 0 
) 
stdClass Object 
(
    [name] => f2 
    [table] => tb1 
    [def] => 
    [max_length] => 1 
    [not_null] => 0 
    [primary_key] => 0 
    [multiple_key] => 0 
    [unique_key] => 0 
    [numeric] => 1 
    [blob] => 0 
    [type] => int 
    [unsigned] => 0 
    [zerofill] => 0 
) 
stdClass Object 
(
    [name] => f1 
    [table] => tb2 
    [def] => 
    [max_length] => 1 
    [not_null] => 0 
    [primary_key] => 0 
    [multiple_key] => 0 
    [unique_key] => 0 
    [numeric] => 1 
    [blob] => 0 
    [type] => int 
    [unsigned] => 0 
    [zerofill] => 0 
) 
Questions connexes