[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос к базе в цикле.
Хиросим
Здравствуйте.
пытаюсь реализовать задачку:
есть массив ($vse) со строками формата "название группы | название альбома"
нужно для каждого значения массива обратиться к базе и вытащить дополнительный пареметр (из столбца базы link_1df).
Вот так хочу сделать:
foreach ($vse as $value)
{
$mas = explode(" | ", $vse[$i]);
$gruppa= $mas['0'];
$albom = $mas['1'];
$resultH = mysql_query("SELECT * FROM baza WHERE gruppa='$gruppa' and albom = '$albom'", $db) or die("ne rabotaets");
$myrowH = mysql_fetch_array($resultH);
if ($myrowH['link_1df'] == 0)
{
$xn = $myrowH['gruppa']." | ".$myrowH['albom'];
$net[] = $xn;
}
}

Естественно ошибка... видимо цикл летит быстрее, чем запрос к базе заканчивается...
в опчем вопрос простой - как такие задачи правильно решать?? или где почитать про корректную организацию селектов в цикле??
(если тема не нова (а скорее всего так и есть), извиняюсь, но поиск чего то не работает....)




Спустя 6 минут, 44 секунды (28.06.2010 - 11:07) tomash написал(а):
Хиросим
Не советую запрос в цикле использовать! Лучше вытащить все, а потом уже работать с этими данными!

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

Спустя 45 минут, 58 секунд (28.06.2010 - 11:53) Хиросим написал(а):
Да какие шутки.. если это
WHERE gruppa='$gruppa' and albom = '$albom'"
меняю на это
WHERE gruppa='$gruppa'
запросы перевариваются нормально, вот и подумал что со скоростью связано...
(а на поиск зря грешил... все работает.. это я туплю..)

Спустя 7 минут, 3 секунды (28.06.2010 - 12:00) SlavaFr написал(а):
1)в цикле ты можеш делать запросы к таблице точно так же как и без цикла.
2)запрос к б.д не асинхронный, т.е цикл не может бежать быстрее чем запрос в б.д
3)у тебя проблемы с foreach, почитай туториал, так как ты его абсолютно не правильно используеш. где ты пытаешся работать с $value?
4)есл у тебя масив $vse не большой, то попытайся в цикле создать стринг который ты мог бы использовать в селекте
$from_where.=" and gruppa='$gruppa' and albom = '$albom' ";
это могло бы решить проблему в одном запросе.

Спустя 13 минут, 43 секунды (28.06.2010 - 12:14) antonov_sa написал(а):
Цитата (tomash @ 28.06.2010 - 08:07)
Естественно ошибка... видимо цикл летит быстрее, чем запрос к базе заканчивается...

добавь в цикл что-нибудь притормаживающее! извините)

Спустя 23 минуты, 52 секунды (28.06.2010 - 12:38) Хиросим написал(а):
Грешно смеяться я над убогими....
SlavaFr
1. имеешь ввиду, ввиду что сделать одну выборку всей базы, а потом с этими данными и работать, как tomash велел??
2. я уж понял, ну хоть народ повеселил...
3. с forech все нормально, это я скопировал не совсем то что нужно..
в коде:
$mas = explode(" | ", $value);
по 4му пункту не понял...
массив около 400 элементов, это большой или нет?? и как величина массива влияет??? почему стринговая переменная именно оператором сложения строк создается???? как стринг в селекте использовать?
"SELECT * FROM baza WHERE ".$from_where
??????????

Спустя 23 минуты, 43 секунды (28.06.2010 - 13:01) tomash написал(а):
Цитата (Хиросим @ 28.06.2010 - 09:38)
массив около 400 элементов, это большой или нет??

Не большой! Хотя все относительно)))

Цитата
и как величина массива влияет???

занимает память, увеличивает время выполнения скрипта
Цитата

почему стринговая переменная именно оператором сложения строк создается????

Вы сами ответили в своем же вопросе, потому что стринговая переменная это и есть строка)))

Цитата
как стринг в селекте использовать?

у Вас строка $from_where должна преобрести вид:

1.
WHERE album IN ('Князь тишины', 'Продавец кошмаров') AND gruppa IN ('КиШ', 'Наутилус')

или
2.
WHERE CONCAT(album,gruppa) IN ('Князь тишиныНаутилус', 'Продавец кошмаровКиШ')

Спустя 55 секунд (28.06.2010 - 13:02) SlavaFr написал(а):
к 1. нет, я имел в виду, что в принципе техника запроса остается одинакова в независемости от тоги где ты ее применяеш.
к 2. да, смешно, но кроме как посмеятся нужно ещё и немного подсказать. Люди быстро забывают, что они тоже с нуля начинали.
к 3. о.к.
к 4. Забудем, так как 400 елементов уже многовато для создания динамического query. Раскажи мне лучше от куда эта информация в масив поподает. Если из таблиц, то проблема решается в sql, если нет, то подумай, как ты эту информацию правильно в б.д загониш.

надеюсь что колеги по форуму подскажут тебе подходящий туториал по sql на русском языке и для начинающих.

Спустя 20 минут, 12 секунд (28.06.2010 - 13:23) tomash написал(а):
Хиросим
Можно попробовать так

$where = implode(',' $vse);
$resultH = mysql_query("SELECT * FROM baza WHERE CONCAT_WS('|', gruppa, albom) in ('$vse')", $db) or die("ne rabotaets");

Спустя 1 минута, 48 секунд (28.06.2010 - 13:24) linker написал(а):
А не пробовали этот параметр выдергивать одним запросом через "left join" в момент когда выгребаете группы с альбомами? Ну типа

select * from megabaza as mb
left join baza as b on b.gruppa like mb.gruppa and b.albom like mb.albom

Спустя 16 минут, 19 секунд (28.06.2010 - 13:41) Хиросим написал(а):
Массив создается тоже запросом к базе
$result = mysql_query("SELECT gruppa, albom  FROM baza ", $db) or die("ne rabotaet");
$myrow = mysql_fetch_array($result);
$vse = array();
do
{
$x11 = $myrow['gruppa']." | ".$myrow['albom'];
$vse[] = $x11;
}
while ($myrow = mysql_fetch_array($result));
$vse = array_unique($vse);

ну тоесть. если по простому, структура базы - исполнитель | альбом
| песня. Я создаю массив уникальных "связок" исполнитель | альбом. Если еще подробнее, то меня интересует только массив из названий альбомов, но поскольку бывает, что у разных исполнителей названия альбомов одинаковые. то приходится воттак чудить.
а дальше хочу для каждого элемента массива выдернуть из той же базы еще койкакие данные, но это я уж говорил...
linker, tomash, спасибо за советы, пытаюсь разбираться....

Спустя 4 минуты, 53 секунды (28.06.2010 - 13:46) sergeiss написал(а):
Ёпрст... Граждане, ЗАБУДЬТЕ о таком цикле!!!

Цитата (Хиросим @ 28.06.2010 - 14:41)
$myrow = mysql_fetch_array($result);
$vse = array();
do
{
$x11 = $myrow['gruppa']." | ".$myrow['albom'];
$vse[] = $x11;
}
while ($myrow = mysql_fetch_array($result));


Низзя тут do-while использовать! Во-первых, если данных нету, то ошибка будет, а во-вторых, даже при наличии данных в выборке неудобно обрабатывать.

ВОТ ТУТ описано http://phpforum.ru/index.php?showtopic=21916, как правильно обрабатывать данные, полученные из БД.

Спустя 2 минуты, 41 секунда (28.06.2010 - 13:48) tomash написал(а):
Хиросим
советую разнести по трем таблицам! в одной исполнители, во второй альбомы, в третьей песни! связать по внешним id, во многом упростите жизнь себе и базе))))

и почему когда Вы создаете массив не можете сразу туда впихнуть link_1df

Спустя 1 минута, 51 секунда (28.06.2010 - 13:50) tomash написал(а):
sergeiss
Кстати вопрос, откуда вобще пошла такая традиция при обработке результатов запроса использоватьс do(){}while??? Очень часто встречаюсь с такой ерундой и не могу понять, кто первоисточник?

Спустя 2 минуты, 45 секунд (28.06.2010 - 13:53) sergeiss написал(а):
Цитата (tomash @ 28.06.2010 - 14:50)
Кстати вопрос, откуда вобще пошла такая традиция при обработке результатов запроса использоватьс do(){}while???

У меня (и не только у меня) есть большое подозрение, что от "незабвенного" Попова, от его видеокурса smile.gif

В теме по ссылке, которую я дал, написано прямо "Специально для тех кто прошел курсы Е.Попова", т.е. "для жерт поповщины".

Спустя 13 минут, 33 секунды (28.06.2010 - 14:06) tomash написал(а):
sergeiss
Извините за оффтоп! Но попса страшная штука)))) Самое печальное, что она из талантов создает посредственность, это касается и программирования.

Спустя 10 минут, 27 секунд (28.06.2010 - 14:17) Хиросим написал(а):
Совершенно верно, от Попова.
Наверное это далеко не идеальный, но пока единственный понятный чайнику видеокурс. Литературы много, но для новичков она тяжеловата, много непонятного и спросить не у кого, тут же все разжевано и показано. А не ошибается тот кто ничего не делает. Лучше исправлять ошибки и потехонечку учиться, чем упереться в непонятную страницу из Тима Конверса и в сердцах забросить это дело.
извиняюсь за отход от темы.
Всем очень спасибо, буду ковырять....

Спустя 11 минут, 21 секунда (28.06.2010 - 14:28) linker написал(а):
Цитата (Хиросим @ 28.06.2010 - 10:41)
Я создаю массив уникальных "связок" исполнитель | альбом. Если еще подробнее, то меня интересует только массив из названий альбомов, но поскольку бывает, что у разных исполнителей названия альбомов одинаковые. то приходится воттак чудить.

Гм, тогда еще один совет, используйте целочисленное, уникальное, автоинкрементное id. Если база реляционная, то она должна быть реляционной. Использовать в качестве индексов строковые значения, мягко говоря некультурно.

Спустя 12 минут, 32 секунды (28.06.2010 - 14:41) sergeiss написал(а):
Цитата (Хиросим @ 28.06.2010 - 15:17)
Совершенно верно, от Попова.
Наверное это далеко не идеальный, но пока единственный понятный чайнику видеокурс. Литературы много, но для новичков она тяжеловата, много непонятного и спросить не у кого, тут же все разжевано и показано. А не ошибается тот кто ничего не делает. Лучше исправлять ошибки и потехонечку учиться, чем упереться в непонятную страницу из Тима Конверса и в сердцах забросить это дело.

Утверждение, возможно, и верное (с точки зрения говорящего его smile.gif). Я же предлагаю забросить подальше Попова и идти дальше с помощью сего форума.
Потому что переучиваться сложнее, чем учиться "с нуля".

Для начала достаточно просто почитать темы. В разных разделах. И уже в голове будет складыватья некоторое ощущение того, как надо делать. Также будут копиться знания. И при наличии желания программировать (и при наличии постоянной практики) это даст хороший результат.

Спустя 15 минут, 10 секунд (28.06.2010 - 14:56) Хиросим написал(а):
tomash
Цитата
и почему когда Вы создаете массив не можете сразу туда впихнуть link_1df

потомучто в массив заносится много повторяющихся значений, у каждого альбома еще несколько песен в таблице, отесть структура базы примерно такая:
id1 | gruppa1 | albom1 | song1 | link_1df1
id2 | gruppa1 | albom1 | song2 | 0
id3 | gruppa1 | albom1 | song3 | 0
и т.д.
потом array_unique убивает повторения, если добавлю в строку еще что нибудь, чехорда получится...
linker
по той же причине не представляю как задействовать id
sergeiss
А я ему всетаки благодарен, хоть он и чудит в области PHP, но основы html css photoshop , и много других полезностей я узнал из его курсов.... но не буду Вас бесить более, Попов заброшен!!!... )))

Спустя 7 минут, 29 секунд (28.06.2010 - 15:03) tomash написал(а):
Хиросим
Я выше уже писал! Вам нужно структуру БД менять))) Из одной мега таблицы сделать 3,

CREATE TABLE `groups` (
`id_group` int(10) NOT NULL AUTO_INCREMENT ,
`group_name` varchar(100) NOT NULL ,
PRIMARY KEY (`id_group`)
);


CREATE TABLE `albums` (
`id_album` int(10) NOT NULL AUTO_INCREMENT ,
`group_id` int(10) NOT NULL,
`album_name` varchar(100) NOT NULL ,
PRIMARY KEY (`id_album`)
);


CREATE TABLE `songs` (
`id_song` int(10) NOT NULL AUTO_INCREMENT ,
`album_id` int(10) NOT NULL AUTO_INCREMENT ,
`group_id` int(10) NOT NULL,
`song_name` varchar(100) NOT NULL ,
PRIMARY KEY (`id_song`)
);


У Вас не будет повторяющихся значений, лишних полей, и т.д. Вы сами не будете путаться

Спустя 4 дня, 20 часов, 46 минут, 37 секунд (3.07.2010 - 11:50) Хиросим написал(а):
tomash
спасибо, учту, но уже для следующего проекта, переделывать текущий не позволит раздел мозга, отвечающий за лень.
а задачу я решил, хоть и кривенько наверное, запрос к базе полюбому в цикле оказался, но все работает.
У меня другой вопрос возник. Уж поскольку в этой теме затронули вопрос корректного вывода данных из базы хочу поинтересоваться почему очень часто при использовании while у меня теряется первая строка, а если для той же цели пользую do while, который пользовать настоятельно не рекомендуется, то все выводится правильно. Вот простейший пример, сегодня столкнулся:
while ($myrow = mysql_fetch_array($result))
{echo "<a href='articlesedit.php?id=$myrow['$id']'>$myrow['$title']</a><br>";}
/*Первая строка из базы потерялась*/
do
{echo "<a href='articlesedit.php?id=$myrow['$id']'>$myrow['$title']</a><br>";}
while ($myrow = mysql_fetch_array($result))
/*Все нормально*/

Спустя 15 минут, 49 секунд (3.07.2010 - 12:06) Basili4 написал(а):
вот этот код не роботоспособный

do
{echo "<a href='articlesedit.php?id=$myrow['$id']'>$myrow['$title']</a><br>";}
while ($myrow = mysql_fetch_array($result))

если вы его используете и увас она работает то вы предоствили не весь пример.

щас поясню свои слова

перед эти кодом должна быть конструкция вида
$result=mysql_query('запрос');
while ($myrow = mysql_fetch_array($result))
{echo "<a href='articlesedit.php?id=$myrow['$id']'>$myrow['$title']</a><br>";}
/*Первая строка из базы потерялась*/

после отработки цикла указатель в наборе данных те.е результате запросв будет помещен в конец.

и поэтому цикл
do while выедет только одну строку с пустыми значениями.

Спустя 17 минут, 51 секунда (3.07.2010 - 12:24) Хиросим написал(а):
Basili4
да канешна я не весь код вставил, запрос к базе естественно в наличии...
тока я не про последовательное использование циклов хотел узнать.. я один цикл в коде заменяю другим и получается, что не корректный цикл do while работает правильно, а корректный while на его месте теряет строку...
если это важно, то вот мой код дословно (с потерей строки):
$result = mysql_query("SELECT id, title FROM articles WHERE razdel='Основы' ORDER BY date", $db);
$statia = mysql_fetch_array($result);
$id = $statia['id'];
$title = $statia['title'];
while ($statia = mysql_fetch_array($result))
{
echo "<a href='articlesedit.php?id=$id'>$title</a><br>";
}

А вот так все нормально выводится:
$result = mysql_query("SELECT id, title FROM articles WHERE razdel='Основы' ORDER BY date", $db);
$statia = mysql_fetch_array($result);
$id = $statia['id'];
$title = $statia['title'];
do
{
echo "<a href='articlesedit.php?id=$id'>$title</a><br>";
}
while ($statia = mysql_fetch_array($result));

Спустя 6 часов, 39 минут, 13 секунд (3.07.2010 - 19:03) tomash написал(а):
$result = mysql_query("SELECT id, title FROM articles WHERE razdel='Основы' ORDER BY date", $db);
while ($statia = mysql_fetch_array($result))
{
echo "<a href='articlesedit.php?id=$id'>$title</a><br>";
}


Вот! Забудьте уроки Попова как страшный сон biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.