Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Модули » Помощь по циклу php, обновление и удаление данных из таблицы БД

Помощь по циклу php, обновление и удаление данных из таблицы БД


     06.02.2012    Все вопросы » Модули    3567

вопрос
Доброго времени суток, уважаемые разработчики и программисты!
Задали мне задачку - написать модуль для DLE 9.4, чтобы на главной странице в блоке выводить 3 поста, которые добавляются в админке. В админке я написал: добавление поста и вывод его из БД.
Добавление нового поста выглядит так:
Вывод вот такой:

И так, вопрос номер один:
когда в файле modules/module.php в цикле вывожу по 3 поста, то последний элемент повторяется:

Должно выводиться от "Заголовок 5" до "Заголовок 1". Как это исправить?
Вот кусок кода данного цикла:

И что любопытно, в админке этот же код выводит все четко (как на 2-м скриншоте) smile .

Вопрос второй: как реализовать функцию изменения и удаления этих самых постов из БД. Знаю, что делается это через UPDATE и DELETE, но вот обработчик не могу написать.
Вот код занесения данных в таблицу:

Этот обработчик изначально предназначался для загрузки картинки без перезагрузки картинки, но я его "усовершенствовал", добавив туда функцию записи в БД, то бишь данные отправляются как только выбрана картинка.

Буду очень признателен и благодарен за помощь, так как она мне очень нужна!
P.S. Описал как можно подробно smile

Ответа пока нет


12 комментариев

ПафНутиЙ
Админ

ПафНутиЙ - 6 февраля 2012 22:20 -

Образцово-показательный вопрос. Наверняка на него оч быстро ответят.

Каков вопрос - таков и ответ. Просто помните об этом.

rashpil
Эксперт

rashpil - 6 февраля 2012 22:27 -

По первому вопросу. Дело в том, что условие выполнения цикла в конце сценария. Поэтому скрипт сначала выводит последнее что запомнил, а уже потом проверяет. Я написал бы это вот так:

$db->query("SELECT * FROM ".PREFIX."_module ORDER BY id DESC");
if ($db->num_rows() > 0) {
    while ($row = $db->get_row()) {
        echo "<a href='{$row['link']}' class='link'><div class='link_block'><div class='image'><img src='{$row['images']}' style='height:38px;'/></div><div class='p_title'>{$row['title']}</div><div class='p_descr'>{$row['descr']}</div></div></a>";
    }
    $db->free();
} else
    echo "В базе данных нет записей.";

rashpil
Эксперт

rashpil - 6 февраля 2012 22:40 -

Относительно второго вопроса. Редактирование пишется по сути аналогично добавлению, только в ссылке на редактирование в вашем случае вроди поста нужно передавать некий ключик, по которому выдирать из базы данные собственно этого поста.
К примеру многие передают в такой ссылке id. Т.е. в списке должны генерироваться ссылки типа admin.php?mod=module&action=edit&id=41
Где module - соответственно ваш модуль
action - Я к примеру так называю переменную определяющую компонент модуля. В ссылке она передаёт параметр edit
id - Это уже параметр по которому вам следует задавать вопрос.
Дальше в сценарии своём пишите условие вида:

if ($_REQUEST['action'] == 'edit' AND intval($_REQUEST['id']) > 0) {

Выполняете запрос в базу (Тут к примеру для запроса можно использовать функцию super_query), после чего выводить форму похожую на форму добавления, с той лишь разницей, что в поля будут вставлены данные из базы

}

Ну а после отправления изменённых данных, их нужно все тщательно проверить и отфильтровать и исполнить UPDATE запрос.

С удалением несколько легче. В дле к примеру есть 2 способа удаления новостей и оба довольно просты. 1. Это на странице редактирования новости кнопка "Удалить", после которой аналогичный вышеописанному сценарий, с той лишь разницей, что запрос другой и кода меньше)
Массовое удаление тоже довольно легко делается. Около каждой записи ставится чекбокс означающий удаление записи. А после нажатия кнопочки вынимается массив полученных данных и в цикле удаляются загруженные файлы, а записи удаляются одним запросом.

Надеюсь объяснил доступно, если возникнут вопросы по коду, обращайтесь

KaSeo
Юзер

KaSeo - 7 февраля 2012 15:40 -

rashpil,
Спасибо за отклик! Чуть позже отпишу, что получилось, а что нет)

KaSeo
Юзер

KaSeo - 9 февраля 2012 22:31 -

Не получается реализовать функции удаления и обновления. Следовал рекомендациям rashpil - результат:
Вот примерные запросы на данные функции:
<a href=\"$PHP_SELF?mod=lastmanga&action=edit&id={$row['id']}\">Править</a>

<a href=\"$PHP_SELF?mod=lastmanga&action=delete&id={$row['id']}\">Удалить</a>

Вот такой обработчик для удаления:

if ($_REQUEST['action'] == 'edit' AND intval($_REQUEST['id']) > 0) {
    
    $result = $db->super_query("DELETE FROM ".PREFIX."_lastmanga WHERE id='".$row['id']."'");
    
    if($result == TRUE) {
        echo"Запись успешно удалена";
    } else echo "Запись не удалена";
}


Вышеизложенный код не работает. Подскажите, пожалуйста, что не так?

ПафНутиЙ
Админ

ПафНутиЙ - 10 февраля 2012 06:29 -

а напрямую в мускул работает?

Каков вопрос - таков и ответ. Просто помните об этом.

rashpil
Эксперт

rashpil - 10 февраля 2012 06:53 -

Условие обработки этого кода то собственно проверь. Почему для удаления, переменная преобретает значение edit?

nowheremany
Эксперт

nowheremany - 10 февраля 2012 07:55 -

if ($_REQUEST['action'] == 'delete' AND intval($_REQUEST['id']) > 0) {

$db->query("DELETE FROM ".PREFIX."_lastmanga WHERE id='".intval($_REQUEST['id'])."'"); // !!!!! не забываем входящие данные обрабатывать
...


$result проверять не стоит. либо делать доп запрос на существование этого id в базе, либо юзать кол-во выполненных действий (модификация, удаление) (не помню какая функция ибо не пользуюсь этим).
Если запись не удалиться то это внештатная ситуация, а все внештатные операции не стоит обрабатывать.

Зы Если не видете результата своих действий в БД почему бы вместо $db->query не заюзать die и посмотреть какой запрос в итоге получится. Все таки прежде чем писать на форумы, хотябы проверить себя надо для начала.

Благодарность принимаю тут Связь

nowheremany
Эксперт

nowheremany - 10 февраля 2012 07:56 -

Да и вообще копипаст вреден, нужно смотреть что пишешь. Если такие очевидные ошибки не видите, то не стоит писать модули пока... ну или не пускать в свет

Благодарность принимаю тут Связь

rashpil
Эксперт

rashpil - 10 февраля 2012 08:59 -

Не совсем правильно. Проще постигать таинства веб программирования как раз таки методом проб и ошибок, покрайней мере я именно так их постигал. Читал курсы, ковырял примеры скриптов, пытался их дорабатывать, если что-то не получалось, спрашивал знакомых программистов. И сейчас, когда уже более менее хоть что-то умею постепенно отхожу от использования этого метода и анализирую как свои, так и чужие коды. Программирование в полной мере не познать уроками или курсами, оно познаётся с опытом же

nowheremany
Эксперт

nowheremany - 10 февраля 2012 11:19 -

Я таки и написал
Если такие очевидные ошибки не видите ... не пускать в свет


В частности имелось ввиду - в паблик или давать пользоваться другим людям не знающим как это работает (должно работать).

Благодарность принимаю тут Связь

KaSeo
Юзер

KaSeo - 10 февраля 2012 23:12 -

Ребята, большое человеческое спасибо, что помогли мне - без вас я бы не справился) P.S. Модуль я закончил

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх