[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: запрос
nasferatu
1-ый вопрос: необходимо значение в БД уменьшит на единицу. Я делаю один запрос, считываю это значение, уменьшаю на единицу и назад записываю это значение. Получаеться 2 запроса. А нельзя ли это сделать одним запросом???

2-ой вопрос: есть форма (allnews), на которой выводятся название всех новостей и их кол-во (это одна таблица) и кол-во всех комментариев (2-ая таблица). Для этого делается 2 запроса. После нажатия на новость, открывается полное описание этой новости со всеми комментариями к этой новости. После удаления комментария, необходимо опять загрузить форму allnews и опять происходить 2 запроса для считывания кол-ва новостей и кол-ва комментариев. Тут я задумался, не много ли происходить запросов в БД???? Но по другому я пока не придумал как. Может вы что-нибудь посоветуете?????



Спустя 42 минуты, 30 секунд (4.03.2009 - 13:25) jetistyum написал(а):
1. Update `tablename` SET `field` = `field`+1
WHERE....

2. можно придумать кэширование.. и хранить все данные например в текстовом файле, но не уверен что это вызовет прирост производительности. тем более ИМХО два запроса это нормально. при кэшировании ты не сможешь отобразить самые свежие комментарии (вдруг в эту секунду кто-то добавил свежий комментарий к посту)

Спустя 34 минуты, 8 секунд (4.03.2009 - 13:59) nasferatu написал(а):
спасибо

Спустя 11 минут, 25 секунд (4.03.2009 - 14:10) nasferatu написал(а):
Цитата (jetistyum @ 4.03.2009 - 10:25)
1. Update `tablename` SET `field` = `field`+1
WHERE....

прибавляет нормально. А вычитать не хочет.

Спустя 5 минут, 22 секунды (4.03.2009 - 14:16) sergeiss написал(а):
Код - в студию! smile.gif Иначе сложно сказать.

По второму вопросу, я думаю, не надо "париться". Потому что я согласен с предыдущим оратором smile.gif, что вряд ли при других вариантах будет прирост в производительности. А вот пробем кучу получишь.

Спустя 7 минут, 34 секунды (4.03.2009 - 14:23) nasferatu написал(а):
PHP
elseif ($_POST['delete_comm'])
{
  
$id $_POST['id'];
  
$login $_POST['login'];
  
$resultcomm mysql_query("DELETE FROM commentary WHERE id='$id'");
  
$resultdb mysql_query("SELECT number_commentary FROM nameuser WHERE login='$login'");
  
$result mysql_fetch_array($resultdb);
  
$number_commentary $result['number_commentary'] - 1;
  
$resultdb mysql_query("UPDATE nameuser SET number_commentary='number_commentary' WHERE login='$login'");
        
  
/* кол-во новостей */
  
$resultdb mysql_query("SELECT * FROM news ORDER BY id DESC");
  
$kol_news mysql_num_rows($resultdb);

  
/* Кол-во комментариев */
  
$result_comm mysql_query("SELECT * FROM commentary");
  
$kol_comm mysql_num_rows($result_comm);
  include(
"allnews.php");
}


Я сделал так, но может как-то можно упростить???

Спустя 47 минут, 9 секунд (4.03.2009 - 15:10) sergeiss написал(а):
Фигасе, уменьшил на единицу...

См. код и комменты внутри него.

PHP
elseif ($_POST['delete_comm'])
{
  $id = $_POST['id'];
  $login = $_POST['login'];
  $resultcomm = mysql_query("DELETE FROM commentary WHERE id='$id'");
// я тут закомментировал то, что надо выкинуть

//  $resultdb = mysql_query("SELECT number_commentary FROM nameuser WHERE login='$login'");

//  $result = mysql_fetch_array($resultdb);
//  $number_commentary = $result['number_commentary'] - 1;
// а в следующем запросе добавил "минус один"
  $resultdb = mysql_query("UPDATE nameuser SET number_commentary=number_commentary-1 WHERE login='$login'");
        
  
/* кол-во новостей */
  $resultdb = mysql_query("SELECT * FROM news ORDER BY id DESC");
  $kol_news = mysql_num_rows($resultdb);

  /* Кол-во комментариев */
  $result_comm = mysql_query("SELECT * FROM commentary");
  $kol_comm = mysql_num_rows($result_comm);
  include("allnews.php");
}


PS. И у тебя нету защиты от SQL-инъекции... Ты используешь данные из $_POST['id'] и $_POST['login'] непосредственно в запросе. А это очень плохо.

PPS. И кавычки лишние убери в запросе!!!

Спустя 4 минуты, 53 секунды (4.03.2009 - 15:15) nasferatu написал(а):
SQL-инъекция есть, это я здесь ее просто удалил.

PHP
$resultdb = mysql_query("UPDATE nameuser SET number_commentary='number_commentary'-1 WHERE login='$login'");

у меня заносит в БД -1, несмотря на то, какое значение там стояло.

Спустя 3 минуты, 32 секунды (4.03.2009 - 15:19) sergeiss написал(а):
Вот про это я и написал (правда, потом уже сделал приписку) - "убери лишние кавычки":
PHP
$resultdb mysql_query("UPDATE nameuser SET number_commentary=number_commentary-1 WHERE login='$login'");


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

Спустя 14 секунд (4.03.2009 - 15:19) jetistyum написал(а):
1. Почитай про MySQL Injection ....
Гуглим...

Не буду тебе давать конкретных решений - они уже даже тут рассматривались стотыщь раз, и если ты сам дойдешь - будет полезнее намного.


и подсчет можно еще выполнять вместо
PHP
$resultdb mysql_query("SELECT * FROM news ORDER BY id DESC");
  
$kol_news mysql_num_rows($resultdb);


сделать запрос
PHP
$resultdb mysql_query("SELECT COUNT(`id`) AS `cnt` FROM news ");
  
$kol_news mysql_fetch_array($resultdb);
  
$kol_news $kol_news['cnt'];

так уменьшится нагрузка на MySQL сервер, ему не придется каждый раз возвращать все найденные новости... а только цифру - их кол-во.

Спустя 5 минут, 17 секунд (4.03.2009 - 15:24) nasferatu написал(а):
sergeiss
сори, я уже заметил. Все получилось.. Пасиб. А логика с БД может быть, я только совсем недавно начал работать с БД. Вот, потому и задаю вам вопросы smile.gif
jetistyum, про MySQL Injection уже многое прочитал. Уже один раз исправлял весь свой код. Но, все равно пасиб. Запрос поменяем.

Спустя 47 минут, 20 секунд (4.03.2009 - 16:12) nasferatu написал(а):
Вернемся к логике работы с БД.
Кол-во комментариев с юзера я убрал.
В таблице news, где все новости, есть у меня поле coun_comment, где хранится кол-во комментариев к каждой новости. Разумно ли убрать это поле и считать для каждой новости с таблицы comment, где хранятся все комментарии. Ведь получается, что на страницу выводится 5 новостей и для каждой новости выполняется запрос с расчетом комментариев, но зато при внесении комментариев, наобходимо вставить только в одну таблицу. Как тут лучше быть????

Спустя 24 минуты, 29 секунд (4.03.2009 - 16:36) sergeiss написал(а):
Цитата (nasferatu @ 4.03.2009 - 16:12)
В таблице news, где все новости, есть у меня поле coun_comment, где хранится кол-во комментариев к каждой новости. Разумно ли убрать это поле и считать для каждой новости с таблицы comment, где хранятся все комментарии.

Вобщем-то, это лучше всего будет.
Можно даже сделать это в одном запросе, и не мудрить в ПХП.

Типа такого (структура таблиц "абстрактная", но, я думаю, понятная), как я написал ниже. Запрос сложный (хотя и не особо сложный smile.gif), но понятный.

SQL
select news.news_date, news.news_text, comments.count_comment from news_table news,
(select news_id, count(*) as count_comment from comments_table where Условие_для_комментов
group by news_id ) as comm

where news.news_id=comm.news_id and любое_условие_для_новостей
order by news.news_date desc limit 5

Работать будет так:
сначала будет подсчитатно количество комментариев для каждой новости, при этом будет использовано ограничение согласно условию_для_комментов. Затем будет составлена таблица из дат новостей, их текста и количества комментов, на основании таблицы новостей и полученного нами запроса с количеством комментов. Для связки таблиц использовано условие news.news_id=comm.news_id. Также будет использовано (если требуется) дополнительное любое_условие_для_новостей.
Полученная таблица с полями news_date, news_text и count_comment будет отсортирована в порядке убывания даты, и будут взяты первые 5 записей...

Реально это будет сделано намного быстрее, чем ты это всё читал smile.gif

И тебе останется только вывести в цикле эти данные.

Спустя 9 минут, 40 секунд (4.03.2009 - 16:46) nasferatu написал(а):
мда, осталось только разобраться с этим запросом. biggrin.gif
спасибо

Спустя 4 минуты, 48 секунд (4.03.2009 - 16:51) sergeiss написал(а):
Разберешься... Это практически то же самое, что и простой запрос.
Быстрый ответ:

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