mysql_fetch_array () проблема - PullRequest
       26

mysql_fetch_array () проблема

1 голос
/ 08 марта 2010

Итак, у меня есть 3 таблицы БД, которые все одинаковы (данные разные), кроме названия таблицы. Я сделал это, чтобы я мог использовать один кусок кода с переключателем, например, так:

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

Теперь, все это работает ОТЛИЧНО для первых двух случаев, но третий "обеденный" разрывается с этой ошибкой:

Предупреждение: mysql_fetch_assoc (): предоставленный аргумент не является допустимым ресурсом результата MySQL ... в строке 78

Линия 78 - это while() внизу. Я проверил и дважды проверил и не могу понять, в чем проблема. Вот структура БД для «ресторанов»:

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

Кто-нибудь видит, что я здесь делаю не так? Я передаю «обеденный» функции и, как я уже говорил, первые два случая в коммутаторе работают нормально.

Я уверен, что это что-то глупое ...

Ответы [ 3 ]

1 голос
/ 08 марта 2010

Вы получаете ошибку SQL в этом запросе.Вы должны повторить ошибку MySQL и просмотреть ее, чтобы исправить ваш запрос.Вы получаете предупреждение, потому что вы передаете логическое значение false функции mysql_fetch_assoc (), которая ожидает набор результатов.mysql_query () возвращает false, если есть ошибка.

1 голос
/ 09 марта 2010

Вы должны всегда инициализировать переменную, которую вы используете, к какому-либо (нулевому) значению, а затем проверять ее перед использованием. Я предполагаю, что ваш третий случай (dining) никогда не будет выполнен из-за какого-либо идентификатора с ошибкой или чего-то еще. Это заставляет default: работать, после чего ваш while() будет выполняться в любом случае. Однако для $query не установлено ничего полезного.

Поэтому вы должны выбросить исключение или иным образом прервать выполнение в обработчике default:. Или вы можете инициализировать $query = null; перед switch() и выполнять цикл while() только тогда, когда $query !== null.


В связанной заметке: вы можете кодировать более эффективно, если вместо этого используете следующее (обратите внимание на обработчик исключений):

$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);
1 голос
/ 08 марта 2010

Посмотрите на свой код запроса - вы запускаете $bestof_query независимо от того, был ли он установлен на допустимый SQL. Мое первое предположение состоит в том, что вы где-то набрали 'dining' и получаете случай по умолчанию.

Кроме того, дважды проверьте правильность имен вашей базы данных (они довольно сложные) и наличие у всех баз данных одинаковых разрешений. Вы проверяете, верно ли $db?

...