Ваш код не выполняет никакой проверки, он просто die
s при возникновении ошибки.
Это не будет делать в производственном коде.
Что касается проверки, у вас есть 2 варианта:
A - Проверить ввод в php и запретить любые недопустимые значения.
B - Использовать ограничения SQL и отслеживать вывод там.
Или комбинация двух.
Проблема с опцией B заключается в том, что вы просто получите ошибку от MySQL, которую вам придется обработать в php.
По этой причине я бы выбрал вариант А.
Первый шаг: экранирование ввода
Лучший способ сделать это - использовать PDO .
Если вы используете mysql_
lib, вам придется использовать mysql_real_escape_string
на каждом входе, чтобы экранировать его и заключить в кавычки $vars
; вот так:
$a = mysql_real_escape_string($_GET['param1']);
examplequery = "SELECT * FROM table1 WHERE field1 = '$a' ";
Для целочисленных значений вы можете преобразовать переменную в целое, а затем вставить ее без кавычек.
$a = intval($_GET['param1']);
$b = intval($_GET['param2']);
if $a > $b { list($a,$b) = array($b,$a); } //Exchange the two vars if needed.
examplequery = "SELECT * FROM table1 WHERE field1 BETWEEN $a AND $b";
Проверка ваших данных
Здесь снова у вас есть два варианта: вы можете жестко закодировать проверку в php или использовать SQL для проверки ввода.
Мне нравится второй подход, потому что он позволяет вам поместить всю информацию в действительный ввод в базу данных.
Проверка ваших данных с использованием таблицы проверки
Один из вариантов - создать таблицу примерно так:
table Checks (
fieldname varchar(50) not null,
tablename varchar(50) not null,
fieldtype enum('int','varchar','enum','decimal'.....) not null,
min_value double default -1000000;
max_value double default 1000000;
validation_query varchar(1000) default null,
primary key (tablename, fieldname)) ENGINE = InnoDB;
Теперь вы можете проверить параметр следующим образом (используя PDO):
$stmt = $dbh->prepare("SELECT fieldtype, min_value, max_value, validation_query
FROM checks WHERE fieldname = ? AND tablename = ?");
$stmt->execute(array('field1', 'table1'));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
switch ($result['type']) {
case 'int':
$allOK = isnumeric($inputvalue_to_check);
$allOK = $allOK AND ($intval($inputvalue_to_check) >= $result['min_value']
AND $intval($inputvalue_to_check) <= $result['max_value']);
if is_null($result['validation_query']) {
$sql = $result['validation_query'];
$check = $dbh-?prepare($sql);
$check_result = $check->execute(array($inputvalue_to_check));
$check_result->fetch(PDO::FETCH_ASSOC);
if is_null($check_result['result']) { //value is not OK}
break;
case .......
Подтверждение в php
Если вы знаете свои данные и они не подлежат изменению, вы можете выполнить проверку, используя операторы if
и switch
.
Этот код очень похож на приведенный выше код, за исключением того, что он не извлекает данные из базы данных, вместо этого логика жестко запрограммирована или хранится в структурах данных php.