Делаю страничку типа словаря разных терминов.
Сваял две таблицы:
Первая - letters, с полями id, letter. Поле letter заполнил буквами русского алфавита;
Вторая - dictionary, с полями id, id_letters, title, text.
Естественно, dictionary.id_letters=letters.id
Хочу, чтобы все буквы выходили в цикле как обычно, но та буква, соответственно которой уже есть инфа в таблице dictionary, была бы ссылкой на файл dict.php
вот что я имею:
<?php
include './blocks/db.php'; /*Соединяемся с базой*/
$result = mysql_query ("SELECT * FROM `letters`",$db);
$result2 = mysql_query ("SELECT * FROM `dictionary` WHERE `dictionary.id_letters`=`letters.id`",$db);
?>
и далее (ненужное пропустил):
<?php
echo '<p>';
while($myrow = mysql_fetch_assoc($result))
{
if (!isset ($id_letters))
{
echo $myrow['letter'].'  ';
}
else
{
echo '<a href="dict.php?id='.$myrow['id'].'">'.$myrow['letter'].'</a>  ';
}
}
echo '</p>';
?>
Буквы все появились, но как ссылки не подчеркиваются. А инфа в таблице есть.
Помогите найти кривизну. Спасибо.
p.s. Если есть возможность вместо двух запросов сформировать один, подскажите как это сделать.
Спустя 18 минут, 5 секунд (22.02.2012 - 11:19) johniek_comp написал(а):
<?php
include './blocks/db.php'; /*Соединяемся с базой*/
$result = mysql_query ("SELECT * FROM `letters`",$db);
$result2 = mysql_query ("SELECT * FROM `dictionary` WHERE `dictionary.id_letters`=`letters.id`",$db);
echo '<p>';
while($myrow = mysql_fetch_assoc($result2))
{
if (empty($id_letters))
{
echo $myrow['letter'].'  ';
}
else
{
echo '<a href="dict.php?id='.$myrow['id'].'">'.$myrow['letter'].'</a>  ';
}
}
echo '</p>';
?>
А Попов тебе разве не научил культуре написания кода? Не понятно же где цикл кончается если не всматриваться :blink:
Спустя 22 минуты, 26 секунд (22.02.2012 - 11:41) MrBrown написал(а):
Про Попова уже было сказано много в других темах и реабилитационных уроках. С вашего позволения, я просил бы вас - ближе к теме поста. Буду признателен, если кое-что в моем коде "поповское" поправите. Я, хотя и прошел курсы реабилитации (видите же - никаких "bd.php", никаких do-while, никаких printf, сплошные echo ну и т.д.), тем не менее многого еще не понимаю. Прошу помощи, а не "шпилек" в мой адрес, тем более, что я их не заслуживаю, как не заслуживают все, кому по жизни довелось прежде познакомиться с курсами Попова, а только затем попасть на ваш сайт. Спасибо.
p.s. А переучиваться и вправду тяжелее, чем учиться с нуля: много мусора засело в памяти.
p.p.s Ваш код ничего не меняет, увы.
p.s. А переучиваться и вправду тяжелее, чем учиться с нуля: много мусора засело в памяти.
p.p.s Ваш код ничего не меняет, увы.
Спустя 1 час, 3 минуты, 51 секунда (22.02.2012 - 12:45) Kuliev написал(а):
Если не ошибаюсь, то можно было написать так
Как то так.
$sql = "SELECT * FROM
`dictionary`
WHERE `id_letters`
IN(SELECT `id_letters` FROM `letters`)";
$result = mysql_query($sql) or die(mysql_error() .'<br>.' $sql);
Как то так.
Спустя 37 минут, 35 секунд (22.02.2012 - 13:23) MrBrown написал(а):
Спасибо за код запроса (я его чуть поправил):
но он тоже не дает нужного результата - чтобы несколько букв, на которые в таблице dictionary существуют записи, были бы подчеркнутыми ссылками.
$sql = "SELECT * FROM
`letters`, `dictionary`
WHERE `id_letters`
IN(SELECT `id` FROM `letters`)";
$result = mysql_query($sql) or die(mysql_error() .'<br>'. $sql);
но он тоже не дает нужного результата - чтобы несколько букв, на которые в таблице dictionary существуют записи, были бы подчеркнутыми ссылками.
Спустя 6 минут, 50 секунд (22.02.2012 - 13:30) m4a1fox написал(а):
johniek_comp
Цитата |
А Попов тебе разве не научил культуре написания кода? |
А ты видел курсы Е.Попова???? Где там культура?
Спустя 1 минута, 31 секунда (22.02.2012 - 13:31) m4a1fox написал(а):
MrBrown
Цитата |
но как ссылки не подчеркиваются |
А по ссылкам перейти можно?
Спустя 11 минут, 12 секунд (22.02.2012 - 13:42) MrBrown написал(а):
Друзья мои! m4a1fox, а также johniek_comp! Уж если вам так хочется поговорить о культуре, то вот моё к вам обращение:
Премилостивые государи! А не соизволите ли соблаговолить обратить свои очи ясные на челом бьющего в ноги недостойного слугу Вашего - автора сего поста, - и, преисполнившись к нему милосердия, вникнуть в его нижайшую челобитную и разрешить его проблему, прекратив оффтопить.
Речь в топике не о Попове. Помогите подчеркнуть "букафки" в списке.
m4a1fox, буквы, которые должны быть ссылками, не подчеркиваются. Когда меняю на
if (!empty($id_letters)) - то есть добавляю воскл. энак, то все буквы становятся ссылками.
Премилостивые государи! А не соизволите ли соблаговолить обратить свои очи ясные на челом бьющего в ноги недостойного слугу Вашего - автора сего поста, - и, преисполнившись к нему милосердия, вникнуть в его нижайшую челобитную и разрешить его проблему, прекратив оффтопить.
Речь в топике не о Попове. Помогите подчеркнуть "букафки" в списке.
m4a1fox, буквы, которые должны быть ссылками, не подчеркиваются. Когда меняю на
if (!empty($id_letters)) - то есть добавляю воскл. энак, то все буквы становятся ссылками.
Спустя 5 минут, 10 секунд (22.02.2012 - 13:48) Placido написал(а):
SELECT `l`.`id`, `l`.`letter`, COUNT(`d`.`id`) AS `words`
FROM `letters` `l` LEFT JOIN `dictionary` `d`
ON `l`.`id` = `d`.`letters_id`
GROUP BY `l`.`id`
ORDER BY `l`.`letter`;
При выводе проверяйте,
if ($myrow['words'] > 0)
{
echo '<a href="dict.php?id='.$myrow['id'].'">'.$myrow['letter'].'</a>';
}
else
{
echo $myrow['letter'];
}
Спустя 15 минут, 20 секунд (22.02.2012 - 14:03) m4a1fox написал(а):
MrBrown
Цитата |
Премилостивые государи! А не соизволите ли соблаговолить обратить свои очи ясные на челом бьющего в ноги недостойного слугу Вашего - автора сего поста, - и, преисполнившись к нему милосердия, вникнуть в его нижайшую челобитную и разрешить его проблему, прекратив оффтопить. |
Это не культура, а насмешка.... а культура кода важна, может вы еще этого не понимаете, но в дальнейшем поймете....
Спустя 9 минут, 2 секунды (22.02.2012 - 14:12) m4a1fox написал(а):
MrBrown
Цитата |
if (!empty($id_letters)) - то есть добавляю воскл. энак, то все буквы становятся ссылками. |
А вы знаете, что означает воскл. знак?
Спустя 6 минут, 45 секунд (22.02.2012 - 14:19) MrBrown написал(а):
Воскл. знак? Конечно знаю! (респект Попову, обучил. Гы-гы) 
Блин, хоть застрелите меня вон тем автоматом, с аватарки, нифига не догоню код Placido!

Блин, хоть застрелите меня вон тем автоматом, с аватарки, нифига не догоню код Placido!
Спустя 5 минут, 52 секунды (22.02.2012 - 14:25) Placido написал(а):
А чего догонять? Объединяем две таблицы по LEFT JOIN. Если в правой таблице (словарь) нет слов на какую-то букву, то в результате в поле words будет 0 (COUNT(`количество id слов на определенную букву`) + GROUP BY `id буквы`), если есть - то там будет количество слов на эту букву. При выводе, если есть слова, то рисуем ссылку, если нет, то пишем просто букву.
Спустя 39 минут, 23 секунды (22.02.2012 - 15:04) MrBrown написал(а):
Placido, спасибо, буду разбираться. Получается, мне надо дополнительное поле `words` делать? У меня в таблице уже есть поля:
id, id_letters, title (типа "слово", "заголовок"), text (типа разъяснение слова из поля `title`). Думаю, можно заменить `words` на `title`, правильно?
id, id_letters, title (типа "слово", "заголовок"), text (типа разъяснение слова из поля `title`). Думаю, можно заменить `words` на `title`, правильно?
Спустя 34 минуты, 43 секунды (22.02.2012 - 15:39) Placido написал(а):
Вы мой запрос пробовали запустить?
Никакого дополнительного поля не требуется. Оно создается динамически в запросе (COUNT(`d`.`id`) AS `words`) - туда выбирается из таблицы dictionary количество записей, соответствующих определенной букве.
Никакого дополнительного поля не требуется. Оно создается динамически в запросе (COUNT(`d`.`id`) AS `words`) - туда выбирается из таблицы dictionary количество записей, соответствующих определенной букве.
Спустя 3 минуты, 25 секунд (22.02.2012 - 15:42) MrBrown написал(а):
Placido, не работает. Вполне допускаю кривизну своих рук, тем не менее, ищу ошибку.
LEFT JOIN `dictionary` `d` - возможно LEFT JOIN `dictionary`.`id`?
И еще: FROM `letters` `l` - возможно FROM `letters`, `dictionary`?
LEFT JOIN `dictionary` `d` - возможно LEFT JOIN `dictionary`.`id`?
И еще: FROM `letters` `l` - возможно FROM `letters`, `dictionary`?
Спустя 6 минут, 38 секунд (22.02.2012 - 15:49) Placido написал(а):
Нет, там все правильно. Какая ошибка?
Спустя 7 минут, 53 секунды (22.02.2012 - 15:57) MrBrown написал(а):
А я правильно делаю, что ваш код раскрываю, типа `l` - `letters`, а `d` - `dictionary`?
Ошибка - пишет, что нет то одного поля, то вообще таблицы такой нет.
Ошибка - пишет, что нет то одного поля, то вообще таблицы такой нет.
Спустя 31 минута, 41 секунда (22.02.2012 - 16:28) Placido написал(а):
Мой запрос нужно запускать "как есть". Ничего не изменяя. `d` - это псевдоним таблицы `dictionary`, а `l` - таблицы `letters`.
Спустя 45 минут, 54 секунды (22.02.2012 - 17:14) MrBrown написал(а):
Вот что получается при вставке "как есть":
Unknown column 'd.letters_id' in 'on clause'
SELECT `l`.`id`, `l`.`letter`, COUNT(`d`.`id`) AS `words` FROM `letters` `l` LEFT JOIN `dictionary` `d` ON `l`.`id` = `d`.`letters_id` GROUP BY `l`.`id` ORDER BY `l`.`letter`;
Unknown column 'd.letters_id' in 'on clause'
SELECT `l`.`id`, `l`.`letter`, COUNT(`d`.`id`) AS `words` FROM `letters` `l` LEFT JOIN `dictionary` `d` ON `l`.`id` = `d`.`letters_id` GROUP BY `l`.`id` ORDER BY `l`.`letter`;
Спустя 2 минуты, 52 секунды (22.02.2012 - 17:17) Placido написал(а):
В запросе letters_id измените на id_letters.
Спустя 15 минут, 54 секунды (22.02.2012 - 17:33) MrBrown написал(а):
Ё! Получилось. Работает! Ну, я тут "ваще ничё не панимаю".
Спасибо огромное, пошёл разбирать код.
p.s. Про псевдонимы впервые узнал.
Спасибо огромное, пошёл разбирать код.
p.s. Про псевдонимы впервые узнал.