0 Пользователей и 1 Гость просматривают эту тему.
  • 6 Ответов
  • 206 Просмотров
*

pavel2950

  • Захожу иногда
  • 176
  • 2 / 0
Приветствую товарищи!

Беда какая, уже как угодно переписовал код и по документации писал не работает код обновления и добавления.


В первом запросе через поля (user_id и ref_id) мы проверяем голосовал ли он. Если пусто, значит нет и выпольням след. код вставка в эту же таблицу #__js_res_vote поля и еще обновляем одну таблицу.

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

Скрин запроса из phpAdmin

А вот другие не работают вообще.

Писал sql запрос как стрингой,  открывал соединение отедльно и без рузультатотно. Если запрос обновления и вставки вывести и его же вставить в phpMyAdmin заменив только на префикс таблицы все четко работает и добавляет.

С меня +, кто свежим взглядом найдет ошибку
Код
class modcobaltRatingTopicHelper
{
    public static function getAjax()

    {
        $topic_rating = $_POST['topic_rating'];
        $id_topic = $_POST['id_topic'];
        $id_user = $_POST['id_user'];

        $db = JFactory::getDbo();
        $sql = $db->getQuery(true);

        $sql->select('ref_id');
        $sql->from('#__js_res_vote');
        $sql->where('user_id = ' . $id_user. " AND ref_id = ".$id_topic);
        $db->setQuery($sql);
        $resultCheckVote = $db->loadColumn();

        if (empty($resultCheckVote)):

            $columns = array('user_id', 'ref_id', 'vote');
            $values = array($id_user, $id_topic, $topic_rating);

            $sql->insert('#__js_res_vote');
            $sql->columns($db->quoteName($columns));
            $sql->values(implode(',', $values));
            $db->setQuery($sql);


            $sql->update('#__js_res_record')->set('votes = 1')->where('id = ' . $id_topic);
            $db->setQuery($sql)->execute();
        else:

            return "Голосовали уже";

        endif;
    }
}


Вот при таком расскладе что есть сейчас консоль ругается на ""JDatabaseExceptionExecuting: Unknown column 'ref_id' in 'where clause'""

« Последнее редактирование: 06.09.2019, 14:00:41 от pavel2950 »
*

icom

  • Давно я тут
  • 820
  • 198 / 4
Re: sql запрос не работает
« Ответ #1 : 01.09.2019, 21:15:51 »
возможно $id_topic пустое значение,
перед запросом проверяйте
if ($id_topic) {

}

или вместо $id_topic = $_POST['id_topic'];
прописать
$jinput = JFactory::getApplication()->input;
$id_topic = $jinput->get('id_topic', 0);
*

pavel2950

  • Захожу иногда
  • 176
  • 2 / 0
Re: sql запрос не работает
« Ответ #2 : 01.09.2019, 22:23:49 »
возможно $id_topic пустое значение,
перед запросом проверяйте
if ($id_topic) {

}

или вместо $id_topic = $_POST['id_topic'];
прописать
$jinput = JFactory::getApplication()->input;
$id_topic = $jinput->get('id_topic', 0);
В том то идело что все заполненно
*

AlekVolsk

  • Гуру
  • 6874
  • 398 / 4
Re: sql запрос не работает
« Ответ #3 : 01.09.2019, 23:13:04 »
покажите, что выводит перед выполнением запроса
Код: php
$sql->__toString();

и напрямую из $_POST получать значения для подставновки в запрос - это прямая sql-инъекция, либо через фабрику получайте, как в примере выше, либо через filter_input(), и если это должно быть числовое значение, то делайте обязательное приведение типов, либб значение через $db->quote() обязательно пропускайте
« Последнее редактирование: 01.09.2019, 23:18:28 от AlekVolsk »
*

pavel2950

  • Захожу иногда
  • 176
  • 2 / 0
Re: sql запрос не работает
« Ответ #4 : 04.09.2019, 16:49:34 »
$sql->__toString();

ничего не выводит. стринга пустая мол
*

AlekVolsk

  • Гуру
  • 6874
  • 398 / 4
Re: sql запрос не работает
« Ответ #5 : 04.09.2019, 17:23:50 »
посмотрел внимательней и только сейчас заметил: вам необходимо после каждого выполнения запроса снова его инициализировать, т.е. перед каждым формированием нового запроса обязательно
Код: php
$sql = $db->getQuery(true);
*

pavel2950

  • Захожу иногда
  • 176
  • 2 / 0
Re: sql запрос не работает
« Ответ #6 : 04.09.2019, 18:40:19 »
посмотрел внимательней и только сейчас заметил: вам необходимо после каждого выполнения запроса снова его инициализировать, т.е. перед каждым формированием нового запроса обязательно
Код: php
$sql = $db->getQuery(true);
Вы совершены правы. Я как раз это и сделал и еще переделал на вариант такой чтоб данные экранировались автоматически.

Для понимания(пример):

Код
// Создаем и заполняем объект
$profile = new stdClass();
$profile->user_id = 42;
$profile->profile_key = 'custom.message';
$profile->profile_value= 'Вставка данных с помощью insertObject()';
$profile->ordering = 1;
 
// Вставляем объект в таблицу профиля пользователя
$result = JFactory::getDbo()->insertObject('#__user_profiles', $profile);


Метод insertObject() автоматически экранирует данные: применяет quoteName() к имени таблицы и колонкам, а также quote() к значениям.


Спасибо сайту в очередной раз cmscafe.ru



P.S. Я думал что открыв 1 подключение выполнил все запросы и закрыть, казалось вроде это логично и типа лишний раз не открывал/закрывать подклчюение. А вышло что надо каждый раз открыть, закрыть.
« Последнее редактирование: 04.09.2019, 18:43:49 от pavel2950 »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Как убрать значение ссылки с атрибутом Nofollow?

Автор Клим

Ответов: 1
Просмотров: 121
Последний ответ 06.09.2019, 16:48:34
от Клим
Не работает стандартный поиск на мобильных устройствах

Автор V@lentin

Ответов: 2
Просмотров: 115
Последний ответ 31.08.2019, 23:21:05
от AlekVolsk
Маркер безопасности не прошел проверку. Запрос был прерван, чтобы предотвратить

Автор sesil

Ответов: 2
Просмотров: 192
Последний ответ 27.08.2019, 08:27:27
от sesil
[Решено] Пункт меню не видимый для гостей

Автор dron

Ответов: 3
Просмотров: 149
Последний ответ 23.08.2019, 10:29:03
от dron
[Решено] Не могу зайти в панель управления

Автор scenann

Ответов: 11
Просмотров: 266
Последний ответ 23.08.2019, 09:42:50
от scenann