Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Несколько вопросов для повышения квалификации


Автор: nepster 2.8.2013, 15:54
Всем привет, возникли несколько вопросов, отелось бы узнать мнения и советы коллег. За ранее большое спасибо! 

1) Как лучше хранить денежное значение в базе, какой тип данных ?



2) Собственно вопрос про 0 и false

Ситуация когда нужно проверить есть ли значение в переменно и оно равно 0

Мой вариант решения: 
Код

    $result = 0;
    if($result || (string)$result == '0')

А как Вы решаете данную задачу? 



3) достаточно ли принудительно указать тип данных для предотвращения sql инъекции для числа и htmlspecialchars для строки ? 

Код

$id; // получили идентификатор записи к примеру
 
варианты валидации:
 
1) $id = (int)$id;
 
2) $id = (is_numeric($id)) ? (int)$id : 0;
 
// для строки
$string = htmlspecialchars($string);

Автор: Fortop 2.8.2013, 16:08
Цитата(nepster @  2.8.2013,  15:54 Найти цитируемый пост)
Как лучше хранить денежное значение в базе, какой тип данных ?

decimal/numeric

Цитата(nepster @  2.8.2013,  15:54 Найти цитируемый пост)
итуация когда нужно проверить есть ли значение в переменно и оно равно 0

откройте для себя 
===

Цитата(nepster @  2.8.2013,  15:54 Найти цитируемый пост)
 достаточно ли принудительно указать тип данных для предотвращения sql инъекции для числа и htmlspecialchars для строки ? 

нет

Автор: Arantir 2.8.2013, 16:35
И от себя добавлю...

Цитата(nepster @  2.8.2013,  14:54 Найти цитируемый пост)
1) Как лучше хранить денежное значение в базе, какой тип данных ?
decimal, как и сказали, с нужной точностью (2 знака для рублей, долларов и т.п.). Это тип для точных расчетов. В нем нет каверз, как во float.
Хранить целым числом в виде значения копеек, центов и т.п. настоятельно не рекомендую. Округление тысячных долей до сотых - очень частая ситуация (посмотрите на цифры обмена валют), а с целыми числами это невозможно.

Цитата(nepster @  2.8.2013,  14:54 Найти цитируемый пост)
2) Собственно вопрос про 0 и false

Fortop +++
Странно вообще возникновение такого вопроса, если честно =)


Цитата(nepster @  2.8.2013,  14:54 Найти цитируемый пост)
3) достаточно ли принудительно указать тип данных для предотвращения sql инъекции для числа и htmlspecialchars для строки ? 
Prepared statements были придуманы еще 10 лет назад. С небольшой форой для их популяризации и реализации разными СУБД можно сказать, что последние 5 лет ими не пользоваться - это даже не странно, а уже глупо.

htmlspecialchars предназначен для вывода текста в браузер, а не для его ввода в базу. Эта функция предназначена для таких строк, как, например:
<script>alert("Этот сайт не фильтрует посты юзеров!");</script>
Как можно заметить, этот форум вывел просто текст, а не злобный html-код.

Причем к sql-инъекциям эта функция не имеет абсолютно никакого отношения.

Автор: Sanchezzz 2.8.2013, 19:22
Я Prepared statements  пользуюсь только через драйвер PDO напрямую в СУБД  их не взываю, нету надобности когда PDO делает тоже самое.
У себя в фм реализовал  в методах контролера 
$this->post(<имя ключа>, возможное значение по умолчанию null,  тип проверки null  int str num empty можно использовать знак отрицания в начале ! 
использую так 
Код

if($id = $this->get('id',false,'int') && $id > 0 ){

}
if(0===($id = $this->get('id',false))){

}

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

ID всегда проверяю через is_int + > 0 но не через numeric

Автор: nepster 3.8.2013, 22:45
Подскажите пожалуйста как безопасно орабатывать получнные данные на сервере.

Я используюю Yii, собственно там работаю с актив рекорд. Я в подробности работы класса не мокался, но знаю, что он тоже проверяет данные. 

Но хотельсь бы знать более подробно как защиться от злоумышлеников и как правильно валидировать данные. Особенно числовые! 

Автор: georgiy11 3.8.2013, 23:01
Метод rules()

Автор: nepster 4.8.2013, 00:06
а если на чистом php. 

Мне не опнравился данный метод, так как я использую мультиязычность и обрабатываю каждую ошибку. Поэтому мне проще возвращать  в качестве ответ от сервера код ошибки или success в формате json 

Автор: georgiy11 4.8.2013, 13:06
Все ошибки будут хранится в модели AR. getErrors и можно обрабатывать smile. Можно в самом правиле прописывать свой обработчик для ошибки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)