2009-10-31 6 views
0

Основываясь на совете, который мне дал на StackOverflow, я попробовал запрос ниже, но он не работал. Я пытаюсь получить список из 25 наиболее недавно добавленных стоимостей для «сайта» в базе данных, независимо от того, в какую таблице они находятся в ниже код дает следующее сообщение об ошибке:.Двойной цикл while не работает

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in domain.php on line 82

линии 82 имеет while ($rowa = mysql_fetch_array($indexa))

Любые идеи, почему это не работает?

echo "<table class=\"samples\">"; 
$index = mysql_query("select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='sitefeather'"); 
while ($row = mysql_fetch_array($index)) 
{ 
    $indexa = mysql_query("select site FROM index order by createdatetime desc limit 25"); 
    while ($rowa = mysql_fetch_array($indexa)) 
    {  
     echo '<tr><td><a href="sitelookup3.php?entry='.urlencode($rowa['site']).'&searching=yes&search=search">'.$rowa['site'].'</a></td></tr>'; 
    }  
} 
echo "</table>"; 
+0

Я получаю сообщение об ошибке при выполнении «select site FROM index order by createdatetime desc limit 25», он говорит, что индекс таблицы не должен быть написан таким образом. И мне интересно, почему вы хотите запускать тот же самый внутренний запрос, который не имеет отношения к внешнему запросу. –

+1

Вы получаете эту ошибку, потому что индекс является зарезервированным словом в mysql, поэтому, если вы собираетесь использовать его в качестве имени таблицы, он должен быть экранирован (в вашем случае mysql пытается интерпретировать его так, как если бы он был реальным ключевое слово). – shylent

+0

FYI: то, что вы используете, называется * вложенным * while циклом. Я также предлагаю вам прочитать о вводе кода. – Artelius

ответ

2

Возможно, вам понадобится переменная вместо index. Может быть, это?

$indexa = mysql_query("select site FROM {$row['TABLE_NAME']} order by createdatetime desc limit 25"); 

Однако, гм ... что вы делаете? Я не знаю, что именно вы пытаетесь выполнить, но в моей голове раздаются очень громкие сигналы тревоги. Наличие динамического имени таблицы в запросе является крупным красным флагом и является признаком плохого проектирования базы данных.

My database has a variable number of tables, all with the same structure.

Плохо.

Что в этих таблицах? Позвольте нам помочь вам получить все эти данные в одну таблицу.

Самый простой способ - создать отдельную таблицу с дополнительным столбцом, содержащим имя таблицы, в которой вы сейчас храняете каждую строку. Вместо таблиц «foo», «bar» и «baz», создайте единую таблицу со столбцом, содержащим «foo», «bar» или «baz» в качестве строкового значения.

+0

Я тоже думал о том же, но все же это не имеет смысла, поскольку я считаю, что он пытается запросить некоторую мета-таблицу, которая будет иметь столбец, созданный одновременно. –

+0

Спасибо ... это все еще дало мне ошибку. Моя база данных имеет переменное количество таблиц, все с одинаковой структурой. Я хочу напечатать список из 25 последних добавленных строк из всех итоговых таблиц. – John

+1

«Я хочу напечатать список из 25 последних добавленных строк из всех итоговых таблиц». ... и именно поэтому создание группы таблиц с одинаковой структурой - идея BAD. – longneck

0

Ваш innerquery не имеет отношения с внешним запросом, вы можете попробовать этот

<?php 
echo "<table class=\"samples\">"; 
$index = mysql_query("select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='jammulinks'"); 
while ($row = mysql_fetch_row($index)) 
{ 
$indexa = mysql_query("select site FROM $row[0] order by createdatetime desc limit 25");//assuming you have site and createddatetime column there. 
while ($rowa = mysql_fetch_array($indexa)) 
{ 

    echo '<tr><td><a href="sitelookup3.php?entry='.urlencode($rowa['site']).'&searching=yes&search=search">'.$rowa['site'].'</a></td></tr>'; 
} 

} 
echo "</table>"; 
?> 
1

В запросе

select site FROM index order by createdatetime desc limit 25 

не должны работать. «index» - зарезервированное слово.

Вместо этого вы хотите использовать $ row ['TABLE_NAME'] вместо этого?

$indexa = mysql_query("select site FROM " + $row['TABLE_NAME'] + " order by createdatetime desc limit 25"); 
0

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

echo "<table class=\"samples\">"; 
// Get a list of table names from the schema 
$index = mysql_query("select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='sitefeather'"); 
while ($row = mysql_fetch_array($index)) 
{ 
    // For every table in the schema, select site from it 
    $indexa = mysql_query("select site FROM {$row['table_name']} order by createdatetime desc limit 25"); 
    while ($rowa = mysql_fetch_array($indexa)) 
    { 
     echo '<tr><td><a href="sitelookup3.php?entry='.urlencode($rowa['site']).'&searching=yes&search=search">'.$rowa['site'].'</a></td></tr>'; 
    } 

} 
echo "</table>"; 

я не уверен, если это будет ошибкой, если столбец сайта не существует в некоторых таблицах вы запрашивая, но быть в курсе.

0

Считайте, что вы можете использовать зарезервированные слова для имен таблиц и столбцов, если вы избежите токена с обратными окнами или как разыменование таблицы.

mysql> create table `index` (id int(11)); 
Query OK, 0 rows affected (0.06 sec) 

mysql> show tables like 'index'; 
+----------------------------+ 
| Tables_in_umbrella (index) | 
+----------------------------+ 
| index      | 
+----------------------------+ 
1 row in set (0.00 sec) 

mysql> select * from `index`; 
Empty set (0.00 sec) 
Смежные вопросы