Денис Н.
98 сообщений
#16 лет назад
Доброе время суток, уважаемые фрилансеры.
Помогите пожалуйта новичку.
Создаю у себя на локалхосте что то вроде записной книжки. В MySQl таблица, в ней name, date, telephone.
далее создаю index.php и send.php
мне нужно из формы добавить данные в базу, при этом отфильтровать их (чтоб небыло sql инекций, или пустых строк в базе)
Возможно ли это выполнять одним index.php?
Почему после определения типа перемнной $_POST = intval($_POST); - туда всё равно можно вписывать буквы, хотя вроде он должен позваолять только цифры
index.php

<?php

$_POST = intval($_POST);

print <<<HERE
<center>
Добавление человека<br><br>
<form action="send.php" method="POST">

ФИО:
<input type = "text"
name = "name"
value = "">
<br>

Дата рождения:
<input type = "text"
name = "date"
value = "">
<br>


Телефон:
<input type = "text"
name = "telephone"
value = "">
<br>


<input type= "submit" value="отправить">
</form>

HERE;
?>


в send.php у меня идёт вывод введёных данных, конект к базе и добавление в них данныех. Зарание спасибо.
Андрей М.
386 сообщений
#16 лет назад
Цитата:
Почему после определения типа перемнной $_POST = intval($_POST); - туда всё равно можно вписывать буквы, хотя вроде он должен позваолять только цифры

Браузер то не знает, что у этой переменной такой тип, т.к. получает только html-код, а в нём написано <input type = "text"
name = "name" value = "">

Цитата:
Возможно ли это выполнять одним index.php?

Возможно. Включите обработчик данных формы в этот файл.
Станислав Малкин
1410 сообщений
#16 лет назад
Цитата ("DenTal"):

Почему после определения типа перемнной $_POST = intval($_POST); - туда всё равно можно вписывать буквы, хотя вроде он должен позваолять только цифры
index.php



Не совсем понятна ситуация. У Вас после intval остаются буквы или нет?
Александр Измайлов
66 сообщений
#16 лет назад


intval не совсем подходит для фильтрации, да и странно как-то, что у Вас ФИО состоит только из цифр
Денис Н.
98 сообщений
#16 лет назад
Цитата ("ArtLab"):
Цитата ("DenTal"):

Почему после определения типа перемнной $_POST = intval($_POST); - туда всё равно можно вписывать буквы, хотя вроде он должен позваолять только цифры
index.php



Не совсем понятна ситуация. У Вас после intval остаются буквы или нет?


остаюься как ни странно =(
Сергей В.
244 сообщения
#16 лет назад
DenTal, покажите пожалуйста send.php. Думаю этим все решится
Сергей В.
244 сообщения
#16 лет назад
Создается впечатление что вы пытаетесь фильтровать данные до отправки а не после.
Если я прав, то естественно так фильтровать не надо

Кстати у вам нотайса нет на 3 строчке в index.php?
Константин Т.
589 сообщений
#16 лет назад
Цитата ("CodeDreamer"):
http://www.php.net/mysql_real_escape_string

intval не совсем подходит для фильтрации, да и странно как-то, что у Вас ФИО состоит только из цифр


так это наверно скрипт для тюремной базы, там только цифры
Денис Н.
98 сообщений
#16 лет назад
Не, база не тюремная =)
Просто попытался проверить рег. выражение, почему то у меня оно правильно не заработало =(
Господа фрилансеры, дайте пример пожалуйста.
Форма - Отправляются данные - Фильтруются - Если какое-то из 3 значений не подходит(в поле даты юзер ввёл буквы к примеру )- выдаётся ошибка что именно не так заполнено и предлагается заполнить форму заново.
Я посмотрю на примере, и постараюсь сделать сам + прикручу чтоб это всё писалось в mysql.
Попытался разобраться на примере Data Life Engine (DLE), но там столько кода + AJAX. Короче погряз я во всем этом =(
Владимир Лукьяненко
124 сообщения
#16 лет назад
Вот маленький пример тока не все сразу написано, а что бы вам еще было интересно разобраться.

index.php

<?php
$error_val=array();
if(isset($_POST)) // была попытка отправки формы
{//проверим исходные данные
if(isset($_POST) && !empty($_POST) && strlen($_POST=trim($_POST))>0) // есть переменнва и не пустая
{
$_POST=intval($_POST);
}
else
{
$error_val="Имя должно содержать тока цифры 0-9";
}
//проверим были ли ошибки
if(count($error_val)>0)
{
// вывод ошибок
echo "В форме есть ошибки: <br>";
foreach($error_val as $value)
{
echo "- $value <br>";
}

require_once("form.php");// показали форму
}
else
{
echo "Запись сохранена! <br>
Имя пользователя - <b>$_POST</b>";
echo '<br><a href="index.php">Добавить еще запись</a>';
}
}
else
{// вывод формы
require_once("form.php");// показали форму
}
?>


form.php

<form action="index.php" method="post">
Имя пользователя <input type="text" name="user_name" value="">
<br><input type="submit" name="form" value="Сохранить">
</form>
Денис Н.
98 сообщений
#16 лет назад
Спасибо, но возможно у вас имеются ошибки в коде. Когда вводишь имя буквами, (судя по вашему коду), должно быть сообщение "Имя должно содержать тока цифры 0-9". А он выводит - имя пользователя - 0. И всё =(
Николай С.
710 сообщений
#16 лет назад
DenTal, ну вот, а теперь подумайте сами, как этого избежать

ЗЫ: проверка на 0 не подходит
Владимир Лукьяненко
124 сообщения
#16 лет назад
SolNikolay, да вы правы. Ведь если сразу написать все правильно, какой тогда интерес учится.
Хотя я признаю что я допустил не точность в проверке
Сергей В.
244 сообщения
#16 лет назад
DenTal, используйте регулярные выражения на проверку данных
Николай С.
710 сообщений
#16 лет назад
tigr1945, VistaSolutions, спрошу, пока можно: Как избежать SQL-иньекции, если передаётся текст?
Владимир Лукьяненко
124 сообщения
#16 лет назад
//++++++++++++++++++++++++++++++++
// Удаление лишних конструкций
//++++++++++++++++++++++++++++++++
function del_hack($text)
{
return htmlspecialchars(stripcslashes($text));
}

//++++++++++++++++++++++++++++++++
// Удаление ковычек
//++++++++++++++++++++++++++++++++
function del_kov($value)
{
if (!is_numeric($value))
{
$value=str_replace('"',"'",$value);
if (get_magic_quotes_gpc()) $value = stripslashes($value);
$value = mysql_real_escape_string($value);
}
return $value;
}

Первое поможет убрать все лишнее с переменной что может быть использовано для иньекции. проверяй все переменные что пришодят из вне
2 используй когда будешь вставлять в базу она заменяет "'" одинарную кавычку т.е экранирует ее.
Денис Н.
98 сообщений
#16 лет назад
Так. Это хорошо, когда дают самому подумать =)
Ход мыслей ламмера.
1) Прокомментирую код для себя
Цитата:
array
(PHP 3, PHP 4, PHP 5 )
array -- Создать массив
Замечание: array() - это языковая конструкция для представления массивов, а не функция.


$error_val=array(); //переменной $error_val присваевается пустой массив. (может сформулировал не верное =( )

Цитата:
isset - определяет, установлена ли переменная.

if(isset($_POST)) - условие, установленна ли переменная, если true, то переходим к проверке.

**проверка**

if(isset($_POST) && !empty($_POST) && strlen($_POST=trim($_POST))>0)
условие -> проверяет, установленна ли переменная $_POST, проверяет, не пуста ли она, и (я так понял ) длинна строки (переменной) должна быть равна длинне строки без пробелов и быть больше нуля. Тогда переменной $_POST присваевается тип целочисленной переменной.

Цитата:
intval - получает целочисленное значение переменной .Возвращает integer-значение переменной var, используя для конвертации специфицированную базу/base (по умолчанию base равна 10).


Если переменная не подошла (пустая либо 0) -> в массив вносится строка-что должна содержать var Цитата:
$error_val="Имя должно содержать тока цифры 0-9";


Цитата:
count -- Посчитать количество элементов массива или количество свойств объекта


//проверим были ли ошибки
if(count($error_val)>0)
{
// вывод ошибок
echo "В форме есть ошибки: <br>";
foreach($error_val as $value)
{
echo "- $value <br>";
}

require_once("form.php");// показали форму
}
else
{
echo "Запись сохранена! <br>
Имя пользователя - <b>$_POST</b>";
echo '<br><a href="index.php">Добавить еще запись</a>';
}
}


Считаем кол-во элементов массива $error_val, если больше 0 -> значит были ошибки, пробегаемс по массиву в поиску оных. Выводим форму.
Если ошибок нет, выводим надпись запись завершена. И предлагаем записать чего-нить ещё.
Если переменная $_POST ещё не уствновленная, выводим форму
else
{// вывод формы
require_once("form.php");// показали форму
}
?>



Спасибо за код. К сожалению, я не смог найти ошибки (логической) в нём. Но предпологаю что вот в этой строке if(isset($_POST) && !empty($_POST) && strlen($_POST=trim($_POST))>0)
Если можно, поправьте мои комментарии, чтобы я знал, где я не правильно понимаю код.
Ещё, это самый "нормальный " способ решения поставленной задачи? Просто я от обилия if и else стал путаться в коде, пусть даже он и не такой большой.
Всем, пишущим в данном топике, огромное спасибо.
Николай С.
710 сообщений
#16 лет назад
tigr1945, Спасибо, попробуем
Николай С.
710 сообщений
#16 лет назад
DenTal, подсказка. "Ошибка" в строке

$_POST=intval($_POST);
Владимир Лукьяненко
124 сообщения
#16 лет назад
Ну все элементарно нужно добавить еще одину проверку на то чтобы переменная была только числом функция is_numeric а куда ее вставить думаю ты и сам найдешь