Joomla 1.5 UPDATE jos_menu

Тема в разделе "Программирование", создана пользователем ыскуфь, 27.10.2008.

  1. ыскуфь
    Offline

    ыскуфь Недавно здесь

    Регистрация:
    07.06.2008
    Сообщения:
    27
    Симпатии:
    0
    Пол:
    Мужской
    Подскажите плиз, что не так делаю:
    Код (PHP):
    1. ...
    2. $id = $this->item->id;
    3. ...
    4.         $query = "UPDATE jos_menu SET `form` = '$form' WHERE `id` = '.$id'" ;
    5.         $db->setQuery( $query );
    6.         $db->query();

    Такое поле точно есть в таблице jos_menu. К БД так же подключён. С формы в переменную $form попадают данные, которые должны заносится в поле form. Но там пусто (NULL).
     
  2.  
  3. sectus
    Offline

    sectus специалист

    Регистрация:
    19.04.2006
    Сообщения:
    1 210
    Симпатии:
    46
    Пол:
    Мужской
    ну, у меня нету такого поля (возможно потому что 1.5.3). Попробуй вывод ошибок БД сделать, типы данных поля и вводимых сравнить.
    Точка перед $id - опечатка?
     
  4. ыскуфь
    Offline

    ыскуфь Недавно здесь

    Регистрация:
    07.06.2008
    Сообщения:
    27
    Симпатии:
    0
    Пол:
    Мужской
    Точка - опечатка)))
    Такого поля вообще нет. Я его сам создал, так как оно предназначается для хранения текстовых даннных.
     
  5. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Ошибки выводятся при помощи метода stderr. По крайней мере в старой джумле. Посмотри как щас и сразу после ->query() выведи ошибку.
     
  6. ыскуфь
    Offline

    ыскуфь Недавно здесь

    Регистрация:
    07.06.2008
    Сообщения:
    27
    Симпатии:
    0
    Пол:
    Мужской
    Ошибок никаких нет.
    Тут суть в том, что переменная $form с формы ничего не передаёт
    Код (PHP):
    1. <form action="index.php" method="post" name="adminForm">
    2.        <textarea name="form" rows="5" cols="30"></textarea>
    3. </form>

    Я создал в таблице jos_menu поле form и в коде сделал такую запись:
    Код (PHP):
    1. ...
    2. $id = $this->item->id;
    3. $db = & JFactory::getDBO();
    4. ...
    5.         $query = "UPDATE jos_menu"
    6.         . "SET form = '$form'"
    7.         . "WHERE id = '$id'" ;
    8.         $db->setQuery( $query );
    9.         $db->query();  
    10. if ($db) echo 'Данные в поле form занесены успешно';  else echo 'Error: не удалось занести данные в поле form';

    Мне выводится, что "Данные в поле form занесены успешно". Но в БД ничего не попадает. Хотя по сути всё правильно написано.
     
  7. sectus
    Offline

    sectus специалист

    Регистрация:
    19.04.2006
    Сообщения:
    1 210
    Симпатии:
    46
    Пол:
    Мужской
    Глобальные переменные - это зло : )
    Я еще не разбирался с 1.5, но беглый взгляд показал, что надо получать переменные через класс статическими методами JRequest
     
  8. ыскуфь
    Offline

    ыскуфь Недавно здесь

    Регистрация:
    07.06.2008
    Сообщения:
    27
    Симпатии:
    0
    Пол:
    Мужской
    Перед запросом добавил $form = JRequest::getVar('form', 0); но результат всё тот же, в БД пусто)
     
  9. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
  10. ыскуфь
    Offline

    ыскуфь Недавно здесь

    Регистрация:
    07.06.2008
    Сообщения:
    27
    Симпатии:
    0
    Пол:
    Мужской
    Выводит NULL
    Кста, после записи $form = JRequest::getVar('form', 0); , в поле записывается ноль.
     
  11. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Ну и правильно. Если нулл на входе, то что в базу запишется? Разбирайся с тем, что и как к тебе приходит и как форма отправляется. И не говори, что это запрос не работает.
     
  12. Greck
    Offline

    Greck Недавно здесь

    Регистрация:
    08.11.2008
    Сообщения:
    19
    Симпатии:
    0
    Пол:
    Мужской
    Код (PHP):
    1. $query= 'UPDATE '.$db->nameQuote('#__menu').
    2.              ' SET '.$db->nameQuote('form').' = '.$db->Quote($form).
    3.             ' WHERE '.$db->nameQuote('id').' = '.$db->Quote($id).';';

    Правильный зпрос выглядит так. Тот, что в первом сообщении совсем неверный.
     
  13. Greck
    Offline

    Greck Недавно здесь

    Регистрация:
    08.11.2008
    Сообщения:
    19
    Симпатии:
    0
    Пол:
    Мужской
    Не вникну что обсуждается в теме, но запрос, написанный в первом сообщении работать не может.
    Запрос, который я написал изменяет поле form, в таблице префикс_menu (по-умолчанию jos_menu) в записи с id, записанном в переменной $id, на значение записанное в переменной $form.

    к сообщению №5
    $db->stderr(); - проверка ошибок в MySQL. Возвращает текст последней ошибки.
    if ($db) - true, если такой объект существует. Это ничего не значит.
     
    Последнее редактирование: 08.11.2008
  14. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Greck, сто раз не соглашусь. А если уже до вызова ->Quote был mosGetParam?

    это про запрос
     
  15. Greck
    Offline

    Greck Недавно здесь

    Регистрация:
    08.11.2008
    Сообщения:
    19
    Симпатии:
    0
    Пол:
    Мужской
    Я не знаю, что это за функция. В 1.5 она врядли существует, по крайней мере в api.joomla.org ee нет. функция Quote и nameQuote, просто добавляет соответсвующие майэскюэлевские кавычки и изменяет код некоторых символов, я не думаю что это может каким-либо образом навредить.

    "UPDATE jos_menu SET `form` = '$form' WHERE `id` = '.$id'" - это строка, MySQL будет искать элемент с id = '.$id', а не с подставленным в php значением переменной $id.

    Короче, я не вижу поводов для спора, все слишком тупо и так понятно. Если кому-то непонятно, то рекомендую слушать меня: я знаю что говорю.
     
    Последнее редактирование: 08.11.2008
  16. Greck
    Offline

    Greck Недавно здесь

    Регистрация:
    08.11.2008
    Сообщения:
    19
    Симпатии:
    0
    Пол:
    Мужской
    Нашел, что такое "mosGetParam". Не думаю, что одно помешает другому. Для информации - это аналог Htmlspecialchar, необходим для избежания хакерских атак через формы. Заменяет специальные символы в строке, например '&' на '&amp;'.
     
  17. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Самомнение рекомендую не выказывать, очень сильно граничит с хамством. Можем и попрощаться.

    Я утверждаю, что вызов ->Quote бесполезен. И еще я утверждаю, что "просто добавляет соответсвующие майэскюэлевские кавычки и изменяет код некоторых символов" - ерунда. Щас докажу.
    Вот ее определение:
    Код (CODE):
    1. function Quote( $text, $escaped = true )
    2.     {
    3.         return '\''.($escaped ? $this->getEscaped( $text ) : $text).'\'';
    4.     }

    И даже если туда true передать, то вот вам функция:
    Код (CODE):
    1. function getEscaped( $text, $extra = false )
    2.     {
    3.         return;
    4.     }

    Поэтому не дурите голову. Тоже самое касается nameQuote. Посмотрите исходники, прежде чем говорить тут.

    mosGetParam это функция в 1.0.х, в 1.5 она стала называться JRequest::get(). И именно ее вызов должен защищать от SQL-injection, ибо он и определяет все заморочки с мэджик_квотес.

    Аналогично. Кавычки двойные и если $id = 123, то и запрос будет UPDATE ... WHERE id=123;

    Хватит бредить. Смотрите код и не парьте мозг юным товарищам этой фигней. Это же надо так сказать "хакерские атаки через формы". А если не через формы, так уже и не хакерская что ли. И конечно же да, симовол & офигеть как опасен. Я побежал в угол, буду там бояться.

    Резюме: товарища слушать стоит. Фигню какую-то говорит.
     
  18. Greck
    Offline

    Greck Недавно здесь

    Регистрация:
    08.11.2008
    Сообщения:
    19
    Симпатии:
    0
    Пол:
    Мужской
    Dead Krolik, мне есть чем занятся помимо того, что бы спорить и рыться в исходниках на пустом месте. Запрос в мессеге №11 100% рабочий и совместим с Htmlspecialchar и вероятнее всего и с JRequest::get()

    Задачка: если я введу строку(ниже) в форму, например INPUT, которая потом станет $form(в рассматриваемом запросе) и не будет обработана и соответсвующие символы не будут заменены. Cтоит ли бояться?
    Как сказал они мой знакомый, древнейший способ хакерства...
     
    Последнее редактирование: 08.11.2008
  19. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    >рыться в исходниках на пустом месте
    Место не пустое, я вам прямо показал, что эти функции НИЧЕГО не делают. И их вызов бессмысленен.

    >Cтоит ли бояться?
    Если форм получена через JRequest, то не стоит. И ерунда с nameQuote нафик не нужна.
     
    sectus нравится это.

Поделиться этой страницей

Загрузка...