PHP. SELECT... while выдает на 1 результат меньше, чем должно быть

12
K
На сайте с 17.05.2016
Offline
25
1341

Здравствуйте, товарищи! Помогите чем можИте, пожалуйста!

Есть код PHP такого вида:


$decks = mysql_query("SELECT ...);
$deckcost = mysql_fetch_array ($decks);
echo " ... ".$deckcost['deckcost']." ...";
while ($row=mysql_fetch_array ($decks))
echo $row['value'];

Deckcost - нормально выводится, но результат "value" выводится всегда на одну - первую строку меньше.

Удаляю этот кусок:


$deckcost = mysql_fetch_array ($decks);
echo " ... ".$deckcost['deckcost']." ...";

и всё становится нормально.

Не могу понять как из этой ситуации выйти с наименьшей нагрузкой на сервер. Не охота делать еще один SELECT ряди вывода "Deckcost". Дело в том, что на странице и так 8 штук SELECTов. Не хотелось бы их умножать на два еще.

По случаю, может кто-то даст совет как не плодить SELECTы?

Я наверное использую какой-то колхозный способ. Делаю много запросов SELECT в одну и ту же таблицу. В запросах отличаются только значения WHERE .... AND WHERE... Ну в общем чтобы отразить данные в нужном порядке, приходится делать отдельный запрос на каждую группу совпадений в БД. Нельзя сделать один общий запрос в БД, а уже при выводе каждой группы задавать конкретные условия?

Проверенная видеореклама (https://goo.gl/vhomjx) для любых сайтов Нормальные пацаны покупают и продают сайты здесь (https://goo.gl/nKv5Vk)
ДП
На сайте с 23.11.2009
Offline
203
#1

Опишите задачу на русском языке, без всяких селетов и т.п. что в выводите на странице?

Вы одним запросом сразу выбирате из базы текст и варианты значений?

Если да - то просто ставите флажок, что у вас первая итерация по результатам, внутри цикла проверяете, что если первая - выводите deckcost и сбрасываете флаг.

Что-то типа:


$decks = mysql_query("SELECT ...);
$deckcost = mysql_fetch_array ($decks);
$first = true;
while ($row=mysql_fetch_array ($decks)){
if ($first){
echo " ... ".$deckcost['deckcost']." ...";
$first = false;
}
echo $row['value'];
}
}
K
На сайте с 17.05.2016
Offline
25
#2
Дикий пионер:
Опишите задачу на русском языке, без всяких селетов и т.п. что в выводите на странице?
Вы одним запросом сразу выбирате из базы текст и варианты значений?

Попробую описать иначе.

Есть БД, в которой четыре колонки: id, deckcost, class, mana

Поиск произвожу по колонке "class".

Я знаю, что во всех строках с этим "class" проставлен одинаковый "deckost", который я вывожу один раз в самом начале.

Далее мне нужно, чтобы выводились списком значения "id" и "mana" у которых есть то же самое совпадение по колонке "class".

В принципе, оно как бы работает, дело не в грамматических ошибках, но тот самый список "id" и "mana" выводится без первой строки. И я понимаю, что это как раз из-за того, что я выводил значение "deckcost" перед списком результатов. И я не не догоняю как правильно обойти эту проблему.

ДП
На сайте с 23.11.2009
Offline
203
#3

Понятно, ну я в приницпе написал вам общий принцип решения.

т.е. осталвяем один цикл, на первом проходе выводим deckost и id с mana, на последующих только id с mana

S
На сайте с 23.05.2004
Offline
315
#4

Вы перед циклом вытаскиваете "следующую" строку, а потом в цикле так же тянете "следующие" записи.

На кой черт вам там это echo сдалось ? Ну или делайте после него


mysql_data_seek($deckcost, 0);
Это просто подпись.
SI
На сайте с 03.12.2007
Offline
130
#5


$result = mysql_query(...);

$row = mysql_fetch_array($result);
echo $row['value1'];

do {
echo $row['value2'];
} while ( $row = mysql_fetch_array($result) );
-= Онлайн сервисы =-
K
На сайте с 17.05.2016
Offline
25
#6
Дикий пионер:
Понятно, ну я в приницпе написал вам общий принцип решения.
т.е. осталвяем один цикл, на первом проходе выводим deckost и id с mana, на последующих только id с mana

В принципе, ничего секретного нет... Просто много лишнего кода. Попробовал сделать как Вы рекомендовали


$decks = mysql_query("SELECT * FROM decks WHERE iddeck='26' AND value != '0' AND cardclass='7' ORDER BY cardcost DESC",$db);
$deckcost = mysql_fetch_array ($decks);
$first = true;
while ($row=mysql_fetch_array ($decks)){
if ($first){
echo "<b>ТОП Дорогая стандартная колода ШАМАНА - ".$deckcost['deckcost']." чар. пыли:</b><br><b>Карты шамана:</b> <br>";
$first = false;
}
echo $row['value']." x [".$row['card']."] - <span class='cena'> ".$row['cardcost']. "</span><br>";
}

ничего не поменялось. Или я что-то не так сделал? Я если честно не понял, что это за $first и в чем логика...

C
На сайте с 26.10.2013
Offline
54
#7

нужно было убрать первый

$deckcost = mysql_fetch_array ($decks);


$decks = mysql_query("SELECT * FROM decks WHERE iddeck='26' AND value != '0' AND cardclass='7' ORDER BY cardcost DESC",$db);
$first = true;
while ($row=mysql_fetch_array ($decks)){
if ($first){
echo "<b>ТОП Дорогая стандартная колода ШАМАНА - ".$row['deckcost']." чар. пыли:</b><br><b>Карты шамана:</b> <br>";
$first = false;
}
echo $row['value']." x [".$row['card']."] - <span class='cena'> ".$row['cardcost']. "</span><br>";
}
Услуги по парсингу данных (/ru/forum/939826), единоразовый и регулярный сбор данных. Любые объемы. Скрипты на PHP, создание и доработка, решение проблем с сайтами Пишите в личные сообщения или скайп
K
На сайте с 17.05.2016
Offline
25
#8
Stek:
Вы перед циклом вытаскиваете "следующую" строку, а потом в цикле так же тянете "следующие" записи.
На кой черт вам там это echo сдалось ? Ну или делайте после него

mysql_data_seek($deckcost, 0);

echo мне сдалось, чтобы в заголовке вставить кусочек инфы из той же бд. Как это сделать без помощи echo я не знаю.

За


mysql_data_seek($deckcost, 0);

спасибо. Изучу принцип действия.

---------- Добавлено 03.06.2016 в 15:57 ----------

colorito:
нужно было убрать первый

$deckcost = mysql_fetch_array ($decks);

Работает! Спасибо!

Я только не понимаю, почему в

$row['deckcost']
выдает только один результат, а
$row['value']
и далее выдает все результаты? как так?))
totamon
На сайте с 12.05.2007
Offline
437
#9
knak:
Я только не понимаю,

потому что программирование - это сначала алгоритм, а потом уже операторы, функции и переменные))

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
K
На сайте с 17.05.2016
Offline
25
#10
totamon:
потому что

так-то без язвенного тролля вообще никак, да?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий