Нужно ли проверять id на numeric?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
zhwanik
Сообщения: 13
Зарегистрирован: 2017.06.17, 10:53

Нужно ли проверять id на numeric?

Сообщение zhwanik »

Код: Выделить всё

class ProductController extends Controller
{
    public function actionIndex($id) {
        
        if(is_numeric($id)) {
            $product = Product::findOne($id);
            if ($product != null) {
            	...
            }
            
            return $this->redirect(['index']);
        }
}
 
Здравствуйте! Прошу подсказать нужна ли проверка в данном случае функцией is_numeric? Если ввести вместо цифры какую-то фигню происходит sql ошибка. Возможно в Yii как-то предусотрен этот момент и есть альтернатива?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Нужно ли проверять id на numeric?

Сообщение zelenin »

Product::findOne((int)$id);
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Нужно ли проверять id на numeric?

Сообщение mkramer »

Не нужно, и ошибка происходить не должна. Просто запись не должна находиться, и всё. Никогда не привожу к int, поскольку yii2 сам заботится о безопасности запроса
zhwanik
Сообщения: 13
Зарегистрирован: 2017.06.17, 10:53

Re: Нужно ли проверять id на numeric?

Сообщение zhwanik »

mkramer писал(а): 2017.06.17, 14:54 Не нужно, и ошибка происходить не должна. Просто запись не должна находиться, и всё. Никогда не привожу к int, поскольку yii2 сам заботится о безопасности запроса
А у меня ошибка возникает....
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Нужно ли проверять id на numeric?

Сообщение mkramer »

Ну так покажи ошибку. И sql-запрос, который формируется

Код: Выделить всё

die(Product::findOne("Оладушки с хреном")->createCommand()->rawSql);
что выведет?

И может у тебя ActiveQuery свой для Product?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Нужно ли проверять id на numeric?

Сообщение futbolim »

mkramer писал(а): 2017.06.25, 13:06 Ну так покажи ошибку. И sql-запрос, который формируется

Код: Выделить всё

die(Product::findOne("Оладушки с хреном")->createCommand()->rawSql);
что выведет?

И может у тебя ActiveQuery свой для Product?
Так выведет ошибку. Вы имели в виду:

Код: Выделить всё

die(Product::find()->where(['field' => "Оладушки с хреном"])->createCommand()->rawSql);
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Нужно ли проверять id на numeric?

Сообщение mkramer »

Да, вы правы, ошибся :) Ну по любому, зайдите в отладчик, посмотрите, какой запрос будет.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Нужно ли проверять id на numeric?

Сообщение mkramer »

Product::findOne("Оладушки с хреном") - такой вызов просто null возвращать должен, никаких ошибок SQL не должен генерировать
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Нужно ли проверять id на numeric?

Сообщение Alexum »

mkramer писал(а): 2017.06.25, 19:27 Product::findOne("Оладушки с хреном") - такой вызов просто null возвращать должен, никаких ошибок SQL не должен генерировать
Ну, например, с MSSQL Server сразу ловится исключение "SQLSTATE[22018]: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Ошибка преобразования значения nvarchar "Оладушки с хреном" в тип данных int.". О какой защите со стороны фреймворка идёт речь?
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Нужно ли проверять id на numeric?

Сообщение mkramer »

А, надо было с этого начинать. Я не имел дела с MS SQL. Значит там остаётся только преобразовывать, как показал zelenin. Или переопределить ActiveQuery, его можно переопределить через dependency injection: http://www.yiiframework.com/doc-2.0/gui ... igurations
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Нужно ли проверять id на numeric?

Сообщение Alexum »

mkramer писал(а): 2017.06.26, 00:44 А, надо было с этого начинать. Я не имел дела с MS SQL. Значит там остаётся только преобразовывать, как показал zelenin. Или переопределить ActiveQuery, его можно переопределить через dependency injection: http://www.yiiframework.com/doc-2.0/gui ... igurations
Тему создал не я. Просто привёл пример, что всё может быть не так просто.
zhwanik
Сообщения: 13
Зарегистрирован: 2017.06.17, 10:53

Re: Нужно ли проверять id на numeric?

Сообщение zhwanik »

mkramer писал(а): 2017.06.25, 19:27 Product::findOne("Оладушки с хреном") - такой вызов просто null возвращать должен, никаких ошибок SQL не должен генерировать
http://joxi.ru/Y2LQK9qT33MjA6?d=1
http://joxi.ru/brRKQ98SwwLem1?d=1
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Нужно ли проверять id на numeric?

Сообщение mkramer »

Ок, я просто не работал с этой реализацией SQL, мне уже тут объяснили. Здесь вам уже ответили - приведите тип руками.
Ответить