При SELECT заявка в цикъл изкарва само един резултат?

streleca_stz

Registered
Здравейте! Искам в началната страница на сайта ми да извадя последните 4 написани мнения във всички дискусии, но ми изкарва само 1.. А знам, че са повече...!

Ето как изглежда заявката със циъкла
PHP:
$q = mysql_query('SELECT disc_id,last_post_by,date_added FROM discussions_answers ORDER BY answer_id DESC LIMIT 0,4') or die (mysql_error());
while($answer = mysql_fetch_assoc($q))
{
	$q = mysql_query('SELECT title FROM `discussions` WHERE disc_id='.$answer['disc_id']) or die (mysql_error());
	$title = mysql_fetch_assoc($q);

  //Изкарване на заглавието и инфото за потребителя
}

И когато я има заявката в цикъла изкарва само един резултат, но когато я махна се появяват всички.. Проблема е обаче, че ако я няма - няма да мога взимам заглавието.. :X
 
PHP:
$q = mysql_query('SELECT disc_id,last_post_by,date_added FROM discussions_answers ORDER BY answer_id DESC LIMIT 0,4') or die (mysql_error());
while($answer = mysql_fetch_assoc($q))
{
        $q2 = mysql_query('SELECT title FROM `discussions` WHERE disc_id='.$answer['disc_id']) or die (mysql_error());
        $title = mysql_fetch_assoc($q2);

  //Изкарване на заглавието и инфото за потребителя
}
 
gamena007 ти отговори, аз само да поясня:

Имаш проблем с имената на променливите и по-точно - ресурсите, които получаваш като резултат от заявките. Виж как в началото взимаш ресурса в $q и въртиш цикъл докато $q връща резултати:

[sql]while($answer = mysql_fetch_assoc($q))[/sql]

и изведнъж вътре в цикъла $q приема нова стойност:

[sql]$q = mysql_query('SELECT title FROM `discussions` WHERE disc_id='.$answer['disc_id']) or die (mysql_error());[/sql]

Друг е въпроса, че така не се прави, защото...
Проблема е обаче, че ако я няма - няма да мога взимам заглавието.. :X

просто не е вярно:

[sql]SELECT `discussions_answers`.`disc_id`, `discussions_answers`.`last_post_by`, `discussions_answers`.`date_added`, `discussions_answers`.`title`
FROM `discussions_answers`
LEFT JOIN `discussions` on `discussions_answers.`.`disc_id` = `discussions`.`disc_id`
ORDER BY `discussions_answers`.`answer_id` DESC LIMIT 0,4
[/sql]
 
exec каза:
gamena007 ти отговори, аз само да поясня:

Имаш проблем с имената на променливите и по-точно - ресурсите, които получаваш като резултат от заявките. Виж как в началото взимаш ресурса в $q и въртиш цикъл докато $q връща резултати:

[sql]while($answer = mysql_fetch_assoc($q))[/sql]

и изведнъж вътре в цикъла $q приема нова стойност:

[sql]$q = mysql_query('SELECT title FROM `discussions` WHERE disc_id='.$answer['disc_id']) or die (mysql_error());[/sql]

Друг е въпроса, че така не се прави, защото...
Проблема е обаче, че ако я няма - няма да мога взимам заглавието.. :X

просто не е вярно:

[sql]SELECT `discussions_answers`.`disc_id`, `discussions_answers`.`last_post_by`, `discussions_answers`.`date_added`, `discussions_answers`.`title`
FROM `discussions_answers`
LEFT JOIN `discussions` on `discussions_answers.`.`disc_id` = `discussions`.`disc_id`
ORDER BY `discussions_answers`.`answer_id` DESC LIMIT 0,4
[/sql]
О, да.. разбира се, че не е вярно! Просто не мога да намеря подходящи уроци, за да се науча на заявките с JOIN.. :|

И междо другото твоята заявка ми дава грешка, защото не трябва да се селектва заглавието от discussions_answer, а от discussions.. Обаче не съм сигурен как точно да го оправя и.. :x
 
[sql]SELECT `discussions_answers`.`disc_id`, `discussions_answers`.`last_post_by`, `discussions_answers`.`date_added`, `discussions`.`title`
FROM `discussions_answers`
LEFT JOIN `discussions` on `discussions_answers.`.`disc_id` = `discussions`.`disc_id`
ORDER BY `discussions_answers`.`answer_id` DESC LIMIT 0,4
[/sql]
 
това е твоята заявка само смени mysql_fetch_assoc със mysql_fetch_array
PHP:
$q = mysql_query('SELECT * FROM discussions_answers ORDER BY answer_id DESC LIMIT 0,4') or die (mysql_error());
while($answer = mysql_fetch_array($q))
{
  //Изкарване на заглавието и инфото за потребителя тука си слагасх кода за изкарване на полетата от типа $answer ['ime na kolonata']
}

малко корекцй
 
stonybg каза:
това е твоята заявка само смени mysql_fetch_assoc със mysql_fetch_array
PHP:
$q = mysql_query('SELECT * FROM discussions_answers ORDER BY answer_id DESC LIMIT 0,4') or die (mysql_error());
while($answer = mysql_fetch_array($q))
{
  //Изкарване на заглавието и инфото за потребителя тука си слагасх кода за изкарване на полетата от типа $answer ['ime na kolonata']
}

малко корекцй


Моля те, обясни ми разликата между mysql_fetch_assoc(); и mysql_fetch_array(); при положение, че си посочил да се вадят данните по следния начин: $answer['ИМЕТО-НА-КОЛОНАТА']; :)


ЕДИТ:

Ето това ти е заявката:
[sql]
SELECT `da`.`disc_id`, `da`.`last_post_by`, `da`.`date_added`, `d`.`title`
FROM discussions_answers da, discussions d
WHERE `d`.`disc_id` = `da`.`disc_id`
ORDER BY `da`.`answer_id` DESC LIMIT 4
[/sql]

и ...

PHP:
while($row = mysql_fetch_assoc($result))
{
         echo $row['title'] . "<br />";
}
 
най лесния начин да го разбреш е че връща различен тип масив в mysql_fetch_array масива ти е в цифри а при при assoc е с имена имена в случая а лично бих направил кода с mysql_fetch_array че е по лесно в циклите да го завариш

просто

PHP:
while($row = mysql_fetch_array  ($result))

{

         echo $row['title'] . "<br />";

}

самия while по лесно работи така :)


за да разбереш какво имам напредвид има лесен метода да си го изобразиш

направи си следния код

PHP:
$row = mysql_fetch_array  ($result);
print_r($row);
// ili tozi kod
var_dump($row);
 
Ти май не ми прочете напълно въпроса :D Аз много добре знам какво връща _array, и какво връща _assoc

И въпроса ми беше: Кажи ми каква е разликата между _array и _assoc при положение, че си посочил на човека да вади резултата по следния начин - $answer['ИМЕТО-НА-ПОЛЕТО']

И не разбрах защо реши, че цикъла работи по-добре с _array ? След като _array го пълни 2 пъти повече отколкото _assoc. :)
 
relax4o каза:
Ти май не ми прочете напълно въпроса :D Аз много добре знам какво връща _array, и какво връща _assoc

И въпроса ми беше: Кажи ми каква е разликата между _array и _assoc при положение, че си посочил на човека да вади резултата по следния начин - $answer['ИМЕТО-НА-ПОЛЕТО']

И не разбрах защо реши, че цикъла работи по-добре с _array ? След като _array го пълни 2 пъти повече отколкото _assoc. :)

а сега ми обесни assoc как прави разлика междй две еднакви колони?
да аrry връща и [0]=>..... както и [ime_na_kolona] =>....
но при 2.5м записа реакцията е 1 секунда тъче ти ми кажи кое е за предпочитане, ако гоним фикцията за чистия код да assoc е по добре но ако гоним функционалността arry е по добре. Лично аз работа с 4гб база и не съм срещнал проблеми с _array. А особено както той ползва Join вероятностна да омаже нещо не е малка . Всичко е въпрос на стил на писане и с колко ресурси разполагаш. Болшинството от хората които се занимават с MySql и PHP не са виждали база с повече от 1000 реда за тях тая дискусия е напълно излишна и едва ли ще вдянат да пестят ресурси.
 
Щом казваш, няма да споря с теб. А заявките с тези LEFT JOIN-и толкова се усложнява, че няма накъде. Къде-къде по-просто е да се ползват само алиаси.

И все пак ще ти отговоря на въпроса. Как прави разлика ли? Отговарям ти на въпроса с въпрос. А защо трябва да има 2 еднакви колони, това показва, че е лошо структурирана базата данни. Има си релационни база данни, ако някой не е чувал. Прави се прилична структура и преспокойно може да се ползва assoc вместо да пълниш 2 пъти повече масива.
 
exec каза:
[sql]SELECT `discussions_answers`.`disc_id`, `discussions_answers`.`last_post_by`, `discussions_answers`.`date_added`, `discussions`.`title`
FROM `discussions_answers`
LEFT JOIN `discussions` on `discussions_answers.`.`disc_id` = `discussions`.`disc_id`
ORDER BY `discussions_answers`.`answer_id` DESC LIMIT 0,4
[/sql]

Мерси! Имаше само една допълнителна точка, но се оправих :) А може ли да ми препоръчаш видео/текстови уроци, за да мога да се науча да правя и аз такива заявки? Понеже очевидно са по-добри отколкото да правя по 1527 заявки на страница :)
 

Back
Горе