пытаюсь реализовать задачку:
есть массив ($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 написал(а):
Хиросим
Не советую запрос в цикле использовать! Лучше вытащить все, а потом уже работать с этими данными!
Не советую запрос в цикле использовать! Лучше вытащить все, а потом уже работать с этими данными!
Цитата |
Естественно ошибка... видимо цикл летит быстрее, чем запрос к базе заканчивается... |
хорошая шутка

Спустя 45 минут, 58 секунд (28.06.2010 - 11:53) Хиросим написал(а):
Да какие шутки.. если это
WHERE gruppa='$gruppa' and albom = '$albom'"
меняю на это
WHERE gruppa='$gruppa'
запросы перевариваются нормально, вот и подумал что со скоростью связано...
(а на поиск зря грешил... все работает.. это я туплю..)
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' ";
это могло бы решить проблему в одном запросе.
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
??????????
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 на русском языке и для начинающих.
к 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) Хиросим написал(а):
Массив создается тоже запросом к базе
ну тоесть. если по простому, структура базы - исполнитель | альбом
| песня. Я создаю массив уникальных "связок" исполнитель | альбом. Если еще подробнее, то меня интересует только массив из названий альбомов, но поскольку бывает, что у разных исполнителей названия альбомов одинаковые. то приходится воттак чудить.
а дальше хочу для каждого элемента массива выдернуть из той же базы еще койкакие данные, но это я уж говорил...
linker, tomash, спасибо за советы, пытаюсь разбираться....
$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
советую разнести по трем таблицам! в одной исполнители, во второй альбомы, в третьей песни! связать по внешним id, во многом упростите жизнь себе и базе))))
и почему когда Вы создаете массив не можете сразу туда впихнуть link_1df
Спустя 1 минута, 51 секунда (28.06.2010 - 13:50) tomash написал(а):
sergeiss
Кстати вопрос, откуда вобще пошла такая традиция при обработке результатов запроса использоватьс do(){}while??? Очень часто встречаюсь с такой ерундой и не могу понять, кто первоисточник?
Кстати вопрос, откуда вобще пошла такая традиция при обработке результатов запроса использоватьс do(){}while??? Очень часто встречаюсь с такой ерундой и не могу понять, кто первоисточник?
Спустя 2 минуты, 45 секунд (28.06.2010 - 13:53) sergeiss написал(а):
Цитата (tomash @ 28.06.2010 - 14:50) |
Кстати вопрос, откуда вобще пошла такая традиция при обработке результатов запроса использоватьс do(){}while??? |
У меня (и не только у меня) есть большое подозрение, что от "незабвенного" Попова, от его видеокурса

В теме по ссылке, которую я дал, написано прямо "Специально для тех кто прошел курсы Е.Попова", т.е. "для жерт поповщины".
Спустя 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) |
Совершенно верно, от Попова. Наверное это далеко не идеальный, но пока единственный понятный чайнику видеокурс. Литературы много, но для новичков она тяжеловата, много непонятного и спросить не у кого, тут же все разжевано и показано. А не ошибается тот кто ничего не делает. Лучше исправлять ошибки и потехонечку учиться, чем упереться в непонятную страницу из Тима Конверса и в сердцах забросить это дело. |
Утверждение, возможно, и верное (с точки зрения говорящего его

Потому что переучиваться сложнее, чем учиться "с нуля".
Для начала достаточно просто почитать темы. В разных разделах. И уже в голове будет складыватья некоторое ощущение того, как надо делать. Также будут копиться знания. И при наличии желания программировать (и при наличии постоянной практики) это даст хороший результат.
Спустя 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,
У Вас не будет повторяющихся значений, лишних полей, и т.д. Вы сами не будете путаться
Я выше уже писал! Вам нужно структуру БД менять))) Из одной мега таблицы сделать 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 у меня теряется первая строка, а если для той же цели пользую 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 написал(а):
вот этот код не роботоспособный
если вы его используете и увас она работает то вы предоствили не весь пример.
щас поясню свои слова
перед эти кодом должна быть конструкция вида
$result=mysql_query('запрос');
while ($myrow = mysql_fetch_array($result))
{echo "<a href='articlesedit.php?id=$myrow['$id']'>$myrow['$title']</a><br>";}
/*Первая строка из базы потерялась*/
после отработки цикла указатель в наборе данных те.е результате запросв будет помещен в конец.
и поэтому цикл
do while выедет только одну строку с пустыми значениями.
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 на его месте теряет строку...
если это важно, то вот мой код дословно (с потерей строки):
А вот так все нормально выводится:
да канешна я не весь код вставил, запрос к базе естественно в наличии...
тока я не про последовательное использование циклов хотел узнать.. я один цикл в коде заменяю другим и получается, что не корректный цикл 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>";
}
Вот! Забудьте уроки Попова как страшный сон
