2010-03-08 3 views
1

J'ai donc 3 tables DB qui sont toutes identiques dans tous les sens (les données sont différentes) sauf le nom de la table. Je l'ai fait pour que je puisse utiliser un morceau de code avec un interrupteur comme ceci:Problème mysql_fetch_array()

function disp_bestof($atts) { 
extract(shortcode_atts(array(
    'topic' => '' 
), $atts)); 
$connect = mysql_connect("localhost","foo","bar"); 
    if (!$connect) { die('Could not connect: ' . mysql_error()); } 
switch ($topic) { 
    case "attorneys": 
    $bestof_query = "SELECT * FROM attorneys p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
    $category_query = "SELECT * FROM categories"; 
    $db = mysql_select_db('roanoke_BestOf_TopAttorneys'); 
    $query = mysql_query($bestof_query); 
    $categoryQuery = mysql_query($category_query); 
    break; 
    case "physicians": 
    $bestof_query = "SELECT * FROM physicians p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
    $category_query = "SELECT * FROM categories"; 
    $db = mysql_select_db('roanoke_BestOf_TopDocs'); 
    $query = mysql_query($bestof_query); 
    $categoryQuery = mysql_query($category_query); 
    break; 
    case "dining": 
    $bestof_query = "SELECT * FROM restaurants p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
    $category_query = "SELECT * FROM categories"; 
    $db = mysql_select_db('roanoke_BestOf_DiningAwards'); 
    $query = mysql_query($bestof_query); 
    $categoryQuery = mysql_query($category_query); 
    break; 
    default: 
    $bestof_query = "switch on $best did not match required case(s)"; 
    break; 
} 

$category = ''; 
while($result = mysql_fetch_array($query)) { 
    if($result['category'] != $category) { 
    $category = $result['category']; 
    //echo "<div class\"category\">"; 
    $bestof_content .= "<h2>".$category."</h2>\n"; 
    //echo "<ul>"; 

Maintenant, tout cela fonctionne parfaitement pour les deux premiers cas, mais la troisième pauses « à manger » avec cette erreur:

Attention: mysql_fetch_assoc(): argument fourni est pas une ressource de résultat MySQL ... sur la ligne 78

ligne 78 est le while() au fond. J'ai vérifié et revérifié et ne peux pas comprendre quel est le problème. Voici la structure de la base de données pour les «restaurants»:

CREATE TABLE `restaurants` (
    `id` int(10) NOT NULL auto_increment, 
    `restaurant` varchar(255) default NULL, 
    `address1` varchar(255) default NULL, 
    `address2` varchar(255) default NULL, 
    `city` varchar(255) default NULL, 
    `state` varchar(255) default NULL, 
    `zip` double default NULL, 
    `phone` double default NULL, 
    `URI` varchar(255) default NULL, 
    `neighborhood` varchar(255) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=249 DEFAULT CHARSET=utf8 

Est-ce que quelqu'un voit ce que je fais mal ici? Je passe "salle à manger" à la fonction et comme je l'ai déjà dit, les deux premiers cas dans le commutateur fonctionnent bien.

Je suis sûr que c'est quelque chose de stupide ...

+1

Un conseil: puisque vous savez que les deux autres cas de commutation fonctionne; extrayez le code problématique et essayez-le avec un minimum de facteurs d'erreur possibles. Après avoir fait cela, éditez votre réponse afin que nous puissions nous concentrer sur la partie problématique du code (si vous en avez toujours besoin, c'est généralement la façon dont vous pouvez le voir par vous-même :)). À votre santé. – chelmertz

+2

Cela n'aide pas à répondre à votre question, mais avoir 3 tables identiques avec des noms différents semble idiot. Vous pouvez très facilement utiliser simplement une autre colonne, par exemple 'type' ou' type_id' pour différencier. En outre, 'SELECT * ...' est mauvais. http://www.parseerror.com/sql/select%2Aisevil.html –

Répondre

1

Vous devez toujours initialiser la variable que vous utilisez à une valeur (nulle), puis vérifiez-la avant de l'utiliser. Ma conjecture est que votre troisième cas (dining) ne soit jamais exécuté à cause d'un identifiant mal orthographié ou quelque chose. Cela provoque l'exécution de default:, après quoi votre while() s'exécutera malgré tout. Cependant, $query n'est pas défini pour quelque chose d'utile. Par conséquent, vous devez lever une exception ou interrompre l'exécution dans le gestionnaire default: par conséquent. Ou, vous pouvez initialiser $query = null; avant le switch() et seulement faire la boucle while() lorsque $query !== null.


Sur une note connexe: vous pouvez coder plus efficace lorsque vous utilisez à la place les éléments suivants (notez le gestionnaire d'exception):

$db_name = null; 
$table = null; 
switch ($topic) { 
    case "attorneys": 
    $db_name = 'roanoke_BestOf_TopAttorneys'; 
    $table = 'attorneys' 
    break; 
    case "physicians": 
    $db_name = 'roanoke_BestOf_TopDocs'; 
    $table = 'physicians' 
    break; 
    case "dining": 
    $db_name = 'roanoke_BestOf_DiningAwards'; 
    $table = 'restaurants' 
    break; 
    default: 
    throw new Exception("Unknown topic."); 
    break; 
} 

$bestof_query = "SELECT * FROM $table p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
$category_query = "SELECT * FROM categories"; 
$db = mysql_select_db($db_name); 
$query = mysql_query($bestof_query); 
$categoryQuery = mysql_query($category_query); 
+0

Merci pour cela, je l'ai utilisé pour nettoyer mon code et le rendre plus simple, les accessoires donnés.Je reçois toujours l'erreur mysql_fetch_array sur le while() même avec l'exception ... ergh – Marty

+0

J'ai été capable de déclencher l'exception en utilisant un mauvais att passé à la fonction – Marty

+0

Je l'ai trouvé. J'ai changé mon $ category_query à "SELECT * FROM $ db_name". ".categories" et a reçu une erreur en retour que mon nom d'utilisateur n'avait pas d'autorisations sur cette base de données. Oups :) Eh bien, merci pour l'aide et le code ci-dessus définitivement rendu plus agréable/propre. À votre santé! – Marty

1

Regardez votre code de requête - vous exécutez $bestof_query indépendamment du fait qu'il a été défini sur SQL valide. Ma première supposition est que vous avez mal orthographié 'dining' quelque part et obtenir le cas par défaut. Vérifiez également que les noms de vos bases de données sont corrects (ils sont assez compliqués) et que toutes les bases de données ont les mêmes autorisations. Est-ce que vous vérifiez si $db est vrai?

1

Vous obtenez une erreur SQL sur cette requête. Vous devriez faire écho à votre erreur mysql et l'examiner pour corriger votre requête. L'avertissement que vous obtenez est parce que vous passez un booléen faux à mysql_fetch_assoc() qui attend un ensemble de résultats. mysql_query() retourne false s'il y a une erreur.

Questions connexes