Подскажите плиз, что не так делаю: Код (PHP): ... $id = $this->item->id; ... $query = "UPDATE jos_menu SET `form` = '$form' WHERE `id` = '.$id'" ; $db->setQuery( $query ); $db->query(); Такое поле точно есть в таблице jos_menu. К БД так же подключён. С формы в переменную $form попадают данные, которые должны заносится в поле form. Но там пусто (NULL).
ну, у меня нету такого поля (возможно потому что 1.5.3). Попробуй вывод ошибок БД сделать, типы данных поля и вводимых сравнить. Точка перед $id - опечатка?
Точка - опечатка))) Такого поля вообще нет. Я его сам создал, так как оно предназначается для хранения текстовых даннных.
Ошибки выводятся при помощи метода stderr. По крайней мере в старой джумле. Посмотри как щас и сразу после ->query() выведи ошибку.
Ошибок никаких нет. Тут суть в том, что переменная $form с формы ничего не передаёт Код (PHP): <form action="index.php" method="post" name="adminForm"> <textarea name="form" rows="5" cols="30"></textarea> </form> Я создал в таблице jos_menu поле form и в коде сделал такую запись: Код (PHP): ... $id = $this->item->id; $db = & JFactory::getDBO(); ... $query = "UPDATE jos_menu" . "SET form = '$form'" . "WHERE id = '$id'" ; $db->setQuery( $query ); $db->query(); if ($db) echo 'Данные в поле form занесены успешно'; else echo 'Error: не удалось занести данные в поле form'; Мне выводится, что "Данные в поле form занесены успешно". Но в БД ничего не попадает. Хотя по сути всё правильно написано.
Глобальные переменные - это зло : ) Я еще не разбирался с 1.5, но беглый взгляд показал, что надо получать переменные через класс статическими методами JRequest
Ну и правильно. Если нулл на входе, то что в базу запишется? Разбирайся с тем, что и как к тебе приходит и как форма отправляется. И не говори, что это запрос не работает.
Код (PHP): $query= 'UPDATE '.$db->nameQuote('#__menu'). ' SET '.$db->nameQuote('form').' = '.$db->Quote($form). ' WHERE '.$db->nameQuote('id').' = '.$db->Quote($id).';'; Правильный зпрос выглядит так. Тот, что в первом сообщении совсем неверный.
Не вникну что обсуждается в теме, но запрос, написанный в первом сообщении работать не может. Запрос, который я написал изменяет поле form, в таблице префикс_menu (по-умолчанию jos_menu) в записи с id, записанном в переменной $id, на значение записанное в переменной $form. к сообщению №5 $db->stderr(); - проверка ошибок в MySQL. Возвращает текст последней ошибки. if ($db) - true, если такой объект существует. Это ничего не значит.
Я не знаю, что это за функция. В 1.5 она врядли существует, по крайней мере в api.joomla.org ee нет. функция Quote и nameQuote, просто добавляет соответсвующие майэскюэлевские кавычки и изменяет код некоторых символов, я не думаю что это может каким-либо образом навредить. "UPDATE jos_menu SET `form` = '$form' WHERE `id` = '.$id'" - это строка, MySQL будет искать элемент с id = '.$id', а не с подставленным в php значением переменной $id. Короче, я не вижу поводов для спора, все слишком тупо и так понятно. Если кому-то непонятно, то рекомендую слушать меня: я знаю что говорю.
Нашел, что такое "mosGetParam". Не думаю, что одно помешает другому. Для информации - это аналог Htmlspecialchar, необходим для избежания хакерских атак через формы. Заменяет специальные символы в строке, например '&' на '&'.
Самомнение рекомендую не выказывать, очень сильно граничит с хамством. Можем и попрощаться. Я утверждаю, что вызов ->Quote бесполезен. И еще я утверждаю, что "просто добавляет соответсвующие майэскюэлевские кавычки и изменяет код некоторых символов" - ерунда. Щас докажу. Вот ее определение: Код (CODE): function Quote( $text, $escaped = true ) { return '\''.($escaped ? $this->getEscaped( $text ) : $text).'\''; } И даже если туда true передать, то вот вам функция: Код (CODE): function getEscaped( $text, $extra = false ) { return; } Поэтому не дурите голову. Тоже самое касается nameQuote. Посмотрите исходники, прежде чем говорить тут. mosGetParam это функция в 1.0.х, в 1.5 она стала называться JRequest::get(). И именно ее вызов должен защищать от SQL-injection, ибо он и определяет все заморочки с мэджик_квотес. Аналогично. Кавычки двойные и если $id = 123, то и запрос будет UPDATE ... WHERE id=123; Хватит бредить. Смотрите код и не парьте мозг юным товарищам этой фигней. Это же надо так сказать "хакерские атаки через формы". А если не через формы, так уже и не хакерская что ли. И конечно же да, симовол & офигеть как опасен. Я побежал в угол, буду там бояться. Резюме: товарища слушать стоит. Фигню какую-то говорит.
Dead Krolik, мне есть чем занятся помимо того, что бы спорить и рыться в исходниках на пустом месте. Запрос в мессеге №11 100% рабочий и совместим с Htmlspecialchar и вероятнее всего и с JRequest::get() Задачка: если я введу строку(ниже) в форму, например INPUT, которая потом станет $form(в рассматриваемом запросе) и не будет обработана и соответсвующие символы не будут заменены. Cтоит ли бояться? Как сказал они мой знакомый, древнейший способ хакерства...
>рыться в исходниках на пустом месте Место не пустое, я вам прямо показал, что эти функции НИЧЕГО не делают. И их вызов бессмысленен. >Cтоит ли бояться? Если форм получена через JRequest, то не стоит. И ерунда с nameQuote нафик не нужна.