Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: вывод данных из двух таблиц в одном запросе
 
 автор: миша   (14.07.2012 в 19:32)   письмо автору
 
 

Добрый день!
Вывод комментариев выводим для модерации. Коммент выводится на странице университета с id_university

Комменты лежат в таблице comment
CREATE TABLE IF NOT EXISTS `comment` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`post` int(5) NOT NULL,
`author` varchar(30) NOT NULL,
`text` text NOT NULL,
`date` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=135 ;

где post соотвествует id_university статьи

Надо вывести еще и название университета, которое лежит в таблице universities
Вопрос как связать 2 нижеследующих запроса

$sql = "SELECT * FROM comment ORDER by date DESC";
$result = mysql_query($sql);
$post = $result['post'];

$sql2 = "SELECT * FROM universities WHERE id_university='$post'";
$result2 = mysql_query($sql2);

  Ответить  
 
 автор: cheops   (15.07.2012 в 05:57)   письмо автору
 
   для: миша   (14.07.2012 в 19:32)
 

Можно начать отталкиваться от следующего запроса
SELECT
  c.*,
  u.*
FROM
  comment c
LEFT JOIN
  universities u
ON c.post =  id_university

  Ответить  
 
 автор: миша   (16.07.2012 в 05:49)   письмо автору
 
   для: cheops   (15.07.2012 в 05:57)
 

Дает ошибку.
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home.... on line 28
No rows found, nothing to print so am exiting
Привожу часть кода

<table >
<?php 

$sql 
"SELECT comment.*, universities.* FROM comment c 
LEFT JOIN universities and ON comment.post =  id_university"
;

$result mysql_query($sql);

if (
mysql_num_rows($result) == 0) {
    echo 
"No rows found, nothing to print so am exiting";
    exit;
}

  Ответить  
 
 автор: cheops   (16.07.2012 в 07:06)   письмо автору
 
   для: миша   (16.07.2012 в 05:49)
 

Обработайте ошибку при помощи функции mysql_error(), что выдается в ответ?

  Ответить  
 
 автор: Valick   (16.07.2012 в 09:39)   письмо автору
 
   для: миша   (16.07.2012 в 05:49)
 

откуда взялось and в запросе?
и после присвоения алиасов не допустимо обращаться к полному имени таблицы
cheops дал вам запрос в который осталось добавить только сортировку
но для начала просто подставьте его запрос в свой код

  Ответить  
 
 автор: миша   (22.07.2012 в 02:08)   письмо автору
 
   для: Valick   (16.07.2012 в 09:39)
 

$sql = "SELECT comment.*, universities.* FROM comment c 
LEFT JOIN universities u ON comment.post =  id_university";

$result = mysql_query($sql);

if (!$result)

  echo "Ошибка базы данных. MySQL пишет:", mysql_error();


Ошибка базы данных. MySQL пишет:Unknown table 'comment'

  Ответить  
 
 автор: cheops   (22.07.2012 в 06:35)   письмо автору
 
   для: миша   (22.07.2012 в 02:08)
 

Попробуйте поправить запрос следующим образом
$sql = "SELECT comment.*, universities.* FROM comment  
LEFT JOIN universities ON comment.post =  universities.id_university";

  Ответить  
 
 автор: миша   (22.07.2012 в 19:25)   письмо автору
 
   для: cheops   (22.07.2012 в 06:35)
 

ошибки нет.
но таблица с данными не выводится.

в колонке title выводится ;
в колонке author выводится ";
в колонке date пусто
в колонке text пусто

<?php 
if (isset($_GET['id'])) {$id $_GET['id'];}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Модерация</title>
<link href="../style.css" rel="stylesheet" type="text/css">
</head>
<body>
<title>Редактирование комментария</title>
</head>

<body>
<h1 align="center">Редактирование комментария ВУЗа</h1>
<table  border="1" cellspacing="0" cellpadding="4">
<?php 
$sql 
"SELECT comment.*, universities.* FROM comment   
LEFT JOIN universities ON comment.post =  universities.id_university"
;
$result mysql_query($sql);
if (
mysql_num_rows($result) == 0) {
    echo 
"No rows found, nothing to print so am exiting";
    exit;
}

while (
$row mysql_fetch_assoc($result)) {
echo 
"<tr bgcolor='#FFFF99'>
<td align='center'><p class='nomistake'>title</p></td>
<td align='center'><p class='nomistake'>author</p></td>
<td align='center'><p class='nomistake'>date</p></td>
<td align='center'><p class='nomistake'>text</p></td>
</tr>
<tr>
<td><p class='mod'>;" 
?>
<?php 
printf 
("<a href='../post_university.php?id_university=%s'>%s</a>",$myrow3["id_university"],$myrow3["title"]);
?>
</p></td>
<td><p class='mod'>";
<?php 
printf 
("<a href='comment_edit.php?id=%s'>%s</a>",$myrow["id"],$myrow["author"]);
?>
</p></td>
<td><p class='mod'><?=$myrow["date"];?></p></td>
<td><p class='mod'><?=$myrow["text"];?></p></td>
</tr>
<?php 
}
mysql_free_result($result);

print <<<HERE

<form name='form1' method='post' action='comment_update.php'>

    <font color="#FF0000">    
   <p>
     <label>Автор<br>
       <input value="
$myrow[author]" type="text" name="author" size="100" id="author">
       </label>
   </p>
         <p>
       <label>Дата комментария<br>
         <input value="
$myrow[date]" type="text" name="date" id="date">
         </label>
       <label>Текст комментария<br>
        <textarea name="text" id="text" cols="120" rows="15">
$myrow[text]</textarea>
         </label>
   </p>
    <input name="id" type="hidden" value="
$myrow[id]">
    <p>
     <label>
     <input type="submit" name="submit" id="submit" value="Сохранить изменения">
     </label>
   </p>
   </font>
 </form>
HERE;
?>
</table>
</body>
</html>

  Ответить  
 
 автор: confirm   (22.07.2012 в 20:22)   письмо автору
 
   для: миша   (22.07.2012 в 19:25)
 

Делайте в коде отступы, иначе воспринимать его трудно.
Остановитесь пока на проблемах, и обратите внимание на запрос и вывод - вам не кажется ничего странным? Вы запросом выбираете все записи, а форма для редактирования одна! Спрашивается - а какую именно запись вы редактировать хотите?

  Ответить  
 
 автор: миша   (22.07.2012 в 22:10)   письмо автору
 
   для: confirm   (22.07.2012 в 20:22)
 

исправил ошибку.
вместо $myrow поставил $row

Вы запросом выбираете все записи, а форма для редактирования одна! Спрашивается - а какую именно запись вы редактировать хотите?
Все правильно. Выводим все записи, а далее нажимая на нужную запись - открыается окно для редактирования этой записи.

вот только у меня поле text не выводится
<?php 
$sql 
"SELECT comment.*, universities.* FROM comment   
LEFT JOIN universities ON comment.post =  universities.id_university"
;
$result mysql_query($sql);

if (!
$result)
echo 
"Ошибка базы данных. MySQL пишет:"mysql_error();
if (
mysql_num_rows($result) == 0) {
    echo 
"No rows found, nothing to print so am exiting";
    exit;
}
while (
$row mysql_fetch_assoc($result)) {
echo 
"<tr bgcolor='#FFFF99'>
<td align='center'><p class='nomistake'>title</p></td>
<td align='center'><p class='nomistake'>author</p></td>
<td align='center'><p class='nomistake'>date</p></td>
<td align='center'><p class='nomistake'>text</p></td>
</tr>
<tr>
<td><p class='mod'>" 
?>
<?php 
printf 
("<a href='../post_university.php?id_university=%s'>%s</a>",$row["id_university"],$row["title"]);
?>
</p></td>
<td><p class='mod'>
<?php 
printf 
("<a href='comment_edit.php?id=%s'>%s</a>",$row["id"],$row["author"]);
?>
</p></td>
<td><p class='mod'><?=$row["date"];?></p></td>
<td><p class='mod'><?=$row["text"];?></p></td>
</tr>
<?php 
}
mysql_free_result($result);

print <<<
HERE

  Ответить  
 
 автор: confirm   (22.07.2012 в 22:32)   письмо автору
 
   для: миша   (22.07.2012 в 22:10)
 

И что правильно то? Вот отвлеченно:
у вас есть массив значений 1,2,3,4,5
вы проходите его циклом приравнивая его значений переменной $a, выводя ее в столбец,
а после цикла подставляете эту переменную в качестве атрибута value в поле text формы.
Вопрос - что вы увидите в текстовом поле?

Вот так и у вас. Я вижу, что у вас есть ссылки с параметром id=..., и по имени запрашиваемого скрипта понимаю, что запрос на редактирование. Но что у вас будет обновлять форма, и зачем, которая в качестве значений получает значения последней записи?!
Это что?

if (mysql_num_rows($result) == 0) - 0, это false, достаточно if (!mysql_num_rows($result)).
"No rows found, nothing to print so am exiting" - а не лучше ли сообщать, что записей в базе нет, и почему это сообщение на английском, у вас англичане редактированием занимаются? :) А что же тогда остальное на русском, бедные инглиши... )

Примечание - делайте отступы в коде, ну неужто вам удобно разбираться в таком? Вот мне такое читать просто не охота, думаю не только мне.

  Ответить  
 
 автор: миша   (22.07.2012 в 23:16)   письмо автору
 
   для: confirm   (22.07.2012 в 22:32)
 

А что тогда в коде исправить конкретно?

  Ответить  
 
 автор: confirm   (22.07.2012 в 23:29)   письмо автору
 
   для: миша   (22.07.2012 в 23:16)
 

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

  Ответить  
 
 автор: Jovidon   (24.07.2012 в 00:55)   письмо автору
 
   для: миша   (22.07.2012 в 22:10)
 

>исправил ошибку.
>вместо $myrow поставил $row

???
попробуй так
<?php

$sql 
"SELECT comment.*, universities.* 
            FROM comment    
            LEFT JOIN universities 
            ON comment.post =  universities.id_university"

$result mysql_query($sql) or die("Ошибка : ".mysql_error());

if(
mysql_num_rows($result) > 0)
{
    while(
$row mysql_fetch_array($result))
    {
        echo 
"<tr>
                     <td>title</td>
                     <td>author</td>
                     <td>date</td>
                     <td>text</td>
                 </tr>
                 <tr>
                     <td><a href='../post_university.php?id_university=
$row[id_university]'>$row[title]</a></td>
                     <td><a href='comment_edit.php?id=
$row[id]'>$row[author]</a></td>
                     <td>
$row[date]</td>
                     <td>
$row[text]</td>
                 </tr>"
;
    }
}
?>

  Ответить  
 
 автор: миша   (24.07.2012 в 05:27)   письмо автору
 
   для: Jovidon   (24.07.2012 в 00:55)
 

Этот вариант тоже не работает (не выводит поле text)

А хочу я следующее.
В таблице выводим комменты (с колонками - title - название статьи где размещен коммент, автор, дата и сам коммент - text)

Далее кликая на конкретно автора или сам текст - чтобы выводилось новое окно, в котором происходит редактирования данного коммента.

  Ответить  
 
 автор: confirm   (24.07.2012 в 07:47)   письмо автору
 
   для: миша   (24.07.2012 в 05:27)
 

>Далее кликая на конкретно автора или сам текст...

Комментарий - это кто-то добавил к статье этого автора свое видение, и каким это боком щелчок по имени автора связан с переходом на страницу какого-то комментария автору не принадлежащего? Логично, когда щелчок по имени автора приведет вас, например, на страницу его данных, не так ли?
А щелчок по тексту комментария. Ну ладно, комментарий это два, три слова, а если это приличный текст, вы представляете себе текст такой ссылки?

И вообще - кто редактирует и что? Если автор комментария, то ему должны быть доступны для редактирования только его комментарии. Этого у вас не видно (судя по выбору всех записей), следовательно речь может идти об администрировании/модерации.

Если это администрирование, и будь я администратором, я бы помер от такого редактирования, а вместе со мною и моя мышка. Это же как нужно загонять хвостатую, чтобы просмотреть все комментарии и общелкать те, которые необходимо комментировать! Такие вещи лучше делать как групповые операции, но...

Для размышления

А зачем вы выводите список всех комментариев? Если я предполагаю правильно, это администрирование/модерация, то, по логике вещей, вам надо редактировать только те комментарии, которые такую операцию еще не проходили - это новые комментарии. Зачем просматривать те, которые ранее редактировались?

Даже, если выводить список только новых комментариев, то нельзя сбрасывать со счетов возможность того, что их может быть много. Представляете себе такой список-портянку? Может быть все-таки предусмотреть навигацию?

Что есть суть редактирования? Это изменение данных с последующим их обновлением. А поле text формы при изменении данных в нем генерирует событие onchange. Сам браузер, конечно же не производит глубокого анализа, действительно ли данные изменились, и это возможно только сценарием сделать (а нужно ли?), но тем не менее, это инструмент.

Для того чтобы редактировать записи, совсем не обязательно прыгать на другую страницу (тем более открывать окно новое), выводя в ней форму для каждой записи. Достаточно одной страницы работающей в режиме просмотра/редактирования.

В одну форму выводятся записи новых комментариев (учитывая навигацию), которые помещаются в поля формы, каждая в свою. По id этой записи сразу выводится и чекбокс (name=del[] value=id) "Удалить" (если модерация, то такая возможность должна быть), связанный по id с текстовым полем.

Если произошли изменения в поле, то по событию onchange в форму добавляется чекбокс (name=update[] value=id) со значением id текстового поля в котором произошли изменения, и несущий информацию для сервера, что данную запись нужно обновить. Если разотметить этот чекбокс (отменить редактирование), то он удаляется из формы, и данная запись не будет обновлена в базе.

Сервер получит массив записей, которые были помещены в форму, но обновляться будут только те, у которых есть связанные по их id чекбоксы update. Записи, у которых присутствует чекбокс del, соответственно удаляются.

--------

В вашем коде напрочь отсутствует логика, а вы все ошибки правите.
Объясните сначала для чего на этой странице форма, если запрос на редактирование, это запрос к другой странице?

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

Подумайте сначала о логике своего скрипта, о задаче которую надо решить, и как лучше и удобнее ее решить, и только потом конкретно по каждой строчке кода, которая вызывает ошибку.

  Ответить  
 
 автор: миша   (25.07.2012 в 04:21)   письмо автору
 
   для: confirm   (24.07.2012 в 07:47)
 

привожу код.
<table> 
<?php  
if (!isset($id)) 
{  
$result mysql_query ("SELECT * FROM comment ORDER by date DESC"); 
$myrow mysql_fetch_array($result); 
do 

?> 
<tr> 
<td align="center">author</td> 
<td align="center">date</td> 
<td align="center">text</td> 
</tr> 
<tr> 
<td><?php  
printf 
("<a href='comment_edit.php?id=%s'>%s</a>",$myrow["id"],$myrow["author"]); 
?> 
</p></td> 
<td><?=$myrow["date"];?></td> 
<td><?=$myrow["text"];?></td> 
</tr> 
<?php 

while (
$myrow mysql_fetch_array ($result)); 

else 

$result mysql_query ("SELECT * FROM comment where id=$id"); 
$myrow mysql_fetch_array($result); 
print <<<
HERE 
||| тут я вывожу форму которая выводит само сообщения и вносит обновление в БД 
HERE


?> 
</table>

он рабочий.выводятся комменты, кликая на автора (можно поменятьссылку на text) выводится форма для корректировки сообщения.
Все работает! Хотелось только в ту таблицу выводить и title статьи где расположен коммент.
Можно выводить и последние комменты.
Подробнее вот здесь http://softtime.ru/forum/read.php?id_forum=1&id_theme=87084&page=1

  Ответить  
 
 автор: confirm   (25.07.2012 в 15:11)   письмо автору
 
   для: миша   (25.07.2012 в 04:21)
 

Это другое дело, если форма после else, становиться понятно, что она тут не так приляпана, даже, если код был бы не с начала.
Вот только mysql_fetch_array(), do...while, сколько еще раз повторять, что это не хорошо?

>кликая на автора (можно поменятьссылку на text)

Не можно, а нужно. Если вы делаете это исключительно для себя, можете и по автору щелкать, но для других (в частности для меня), это странная логика, не догадался бы как запустить редактирование (без инструкции по эксплуатации).

>Можно выводить и последние комменты.

Не можно, а нужно, если речь идет об редактировании.

Что касается вывода, то код вам показали, и если есть в записях таблиц соответствия параметров запроса, и если в правой таблице у соответствий не пустые значения, значит вывод должен быть. Правда, по уму, запрос должен быть не к двум, а к трем таблицам. У вас должна быть таблица пользователей содержащая их id и имена, а таблица комментариев должна указывать не имя, а id пользователя, которому они принадлежат.

PS. Строковые значения при выводе на страницу необходимо пропускать через функцию htmlspecialchars().

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования