Jump to content
  • 0

Формы и БД


lapwing
 Share

Question

Доброго времени суток всем! Пытаюсь решить задачу занесения данных, введенных пользователем с помощью формы в БД в разные таблицы. Есть файл add.php:

<?php
$errors=array();
if(isset($_REQUEST['seen_already']))
{
validate_data();
if(count($errors)>0)
{
display_errors();
display_form();
}
else
{
process_data();
}
}
else
{
display_form();
}
function validate_data()
{
global $errors;
if($_REQUEST['p1']=='')
{
$errors[]="<font color='red'>Имя обязательно для ввода</font>";
}
if($_REQUEST['p2']=='')
{
$errors[]="<font color='red'>Телефон обязателен для ввода</font>";
}
if($_REQUEST['p3']=='')
{
$errors[]="<font color='red'>Вы не ввели текст объявления</font>";
}
}
function display_errors()
{
global $errors;
foreach($errors as $err)
{
echo $err,"<br>";
}
}
function process_data()
{
$db = mysql_connect ("localhost","buy","buy");
mysql_select_db ("board",$db);
mysql_query("SET NAMES cp1251");

$p1=htmlspecialchars(trim($_POST['p1']));
$p2=htmlspecialchars(trim($_POST['p2']));
$p3=htmlspecialchars(trim($_POST['p3']));
$added=$_POST['added'];
$result=mysql_query("INSERT INTO buy_kv(p1,p2,p3,added)
VALUES('$p1','$p2','$p3','$added')");

if(mysql_affected_rows()==1)
{
echo "<p> Данные занесены</p>";
} else
{
error_log(mysql_error());
echo "<p> Что-то пошло не так</p>";
}
}
function display_form()
{
$p1=isset($_REQUEST['p1'])?$_REQUEST['p1']:'';
$p2=isset($_REQUEST['p2'])?$_REQUEST['p2']:'';
$p3=isset($_REQUEST['p3'])?$_REQUEST['p3']:'';
$date=date("Y-m-d,H-i-s");
$thisfile=$_SERVER['PHP_SELF'];
echo "<FORM METHOD='post' ACTION='$thisfile'>";
echo "<p>Введите ваше имя</p>";
echo "<INPUT NAME='p1' TYPE='text' VALUE='".$p1."'>";
echo "<p>Введите телефон для связи</p>";
echo "<INPUT NAME='p2' TYPE='text' VALUE='".$p2."'>";
echo "<p>Введите текст объявления</p>";
echo "<TEXTAREA NAME='p3' COLS='55' ROWS='10'>$p3</TEXTAREA>";
echo "<br>";
echo "<INPUT TYPE=SUBMIT VALUE='OK'>";
echo "<INPUT TYPE=HIDDEN NAME='added' VALUE='$date'>";
echo "<INPUT TYPE=HIDDEN NAME='seen_already' VALUE='data'>";
echo "</FORM>";
}

-замечательно работает

и есть файл obj.php в котором я прописываю такие ссылки

	<a href="add.php?a=b_kv">куплю квартиру</a>
<a href="add.php?a=b_dom">куплю дом или участок</a>

если при этом я видоизменяю файл add.php следующим образом

........................
function process_data()
{
$db = mysql_connect ("localhost","buy","buy");
mysql_select_db ("board",$db);
mysql_query("SET NAMES cp1251");

$p1=htmlspecialchars(trim($_POST['p1']));
$p2=htmlspecialchars(trim($_POST['p2']));
$p3=htmlspecialchars(trim($_POST['p3']));
$added=$_POST['added'];

if(isset($_GET['a']))
{switch($_GET['a'])
{case 'b_kv':
$result=mysql_query("INSERT INTO buy_kv(p1,p2,p3,added)
VALUES('$p1','$p2','$p3','$added')");
break;
case 'b_dom':
$result=mysql_query("INSERT INTO buy_dom(p_d1,p_d2,p_d3,added)
VALUES('$p1','$p2','$p3','$added')");
break;



if(mysql_affected_rows()==1)
{
echo "<p> Данные занесены</p>";
} else
{
error_log(mysql_error());
echo "<p> Что-то пошло не так</p>";
}
}
}
}
.............................................

то выводится только форма, а данные в таблицы не заносятся. Почему? Прошу подсказки.

Link to comment
Share on other sites

16 answers to this question

Recommended Posts

  • 0

У тебя if внутри case получился. ) Чуть ниже поставь.

И надо серьёзно поработать над безопасностью. ) скрытые поля, и то что в переменных $_GET[], $_REQUEST[] надо тоже проверять, и не только через htmlspecialchars.

И по моему, проще было бы сделать проверку так:

if(isset($_GET['a']))
{
if($_GET['a'] == 'b_kv')
$query = "INSERT INTO buy_kv(p1,p2,p3,added) VALUES('$p1','$p2','$p3','$added')");
elseif($_GET['a'] == 'b_dom')
$query = "INSERT INTO buy_dom(p_d1,p_d2,p_d3,added) VALUES('$p1','$p2','$p3','$added')");

if(!@mysql_query($query)) echo "<p> Что-то пошло не так</p>";
else echo "<p> Данные занесены</p>";
}

Edited by demous
Link to comment
Share on other sites

  • 0

Теперь другая заморочка. If в switch-case я увидел и переставил скобки

function process_data()
{
$db = mysql_connect ("localhost","buy","buy");
mysql_select_db ("board",$db);
mysql_query("SET NAMES cp1251");

$p1=htmlspecialchars(trim($_POST['p1']));
$p2=htmlspecialchars(trim($_POST['p2']));
$p3=htmlspecialchars(trim($_POST['p3']));
$added=$_POST['added'];
$a=$_POST['a'];
if(isset($_POST['a']))
{ switch($_POST['a'])
{ case 'b_kv' :
$result=mysql_query("INSERT INTO buy_kv(p1,p2,p3,added)
VALUES('$p1','$p2','$p3','$added')");
break;
case 'b_dom' :
$result=mysql_query("INSERT INTO buy_dom(p_d1,p_d2,p_d3,added)
VALUES('$p1','$p2','$p3','$added')");
break;
}}
if(mysql_affected_rows()==1)
{
echo "<p> Данные занесены</p>";
} else
{
error_log(mysql_error());
echo "<p> Что-то пошло не так</p>";
}
}

и теперь выводится сообщение "Что-то пошло не так" (раньше не выводилось) и данные все равно не вводятся в БД,

я попробовал определить существование $a , и похоже, что её нет, т.е. по идее $a присваивается значение по ссылке

<a href="add.php?a=b_kv">квартиру</a>

в файле obj.php, а в add.php она не видится. Пробовал объединить оба файла-то же самое. Получается, что те переменные, кот. были определены в функции видны вне ее - в файле, а те кот. определялись вовне(т.е. в самом файле) внутри функции не видны?Или я вообще не в том направлении думаю?Подскажите пожалуйста.

Link to comment
Share on other sites

  • 0

Я уже так пробовал

function process_data()
{
$db = mysql_connect ("localhost","buy","buy");
mysql_select_db ("board",$db);
mysql_query("SET NAMES cp1251");

$p1=htmlspecialchars(trim($_POST['p1']));
$p2=htmlspecialchars(trim($_POST['p2']));
$p3=htmlspecialchars(trim($_POST['p3']));
$added=$_POST['added'];

$a = $_GET['a'];

if(isset($_GET['a']))
{ switch($_GET['a'])
{ case 'b_kv' :
$result=mysql_query("INSERT INTO buy_kv(p1,p2,p3,added)
VALUES('$p1','$p2','$p3','$added')");
break;
case 'b_dom' :
$result=mysql_query("INSERT INTO buy_dom(p_d1,p_d2,p_d3,added)
VALUES('$p1','$p2','$p3','$added')");
break;}}


if(mysql_affected_rows()==1)
{
echo "<p> Данные занесены</p>";
} else
{
error_log(mysql_error());
echo "<p> Что-то пошло не так</p>";
}
}

я уже думаю, может эту строчку - $a = $_GET['a']; - надо где-то в другом месте прописать?

Link to comment
Share on other sites

  • 0

Попробуй убери action из формы. Если я правильно понял структуру, ты по ссылке вызываешь форму, заполняешь и потом её отправляешь. Вот и получается, что переменная теряется. Либо надо чтоб на туже страницу, с тими же параметрами ссылался ($_SERVER['PHP_SELF'], по моему параметры не передает, а если ты уберешь action, то в любом случае он загрузит тот же url, который показывается на момент вызова формы), либо в форме указывать дополнительное hidden поле, в которое ты будешь записывать $_GET['a'].

Edited by demous
Link to comment
Share on other sites

  • 0

{ switch($_GET['a'])

{ case 'b_kv' :

$result=mysql_query("INSERT INTO buy_kv(p1,p2,p3,added)

VALUES('$p1','$p2','$p3','$added')");

break;

case 'b_dom' :

$result=mysql_query("INSERT INTO buy_dom(p_d1,p_d2,p_d3,added)

VALUES('$p1','$p2','$p3','$added')");

break;

}

}

Эти скобки здесь лишние.

Edited by rus
Link to comment
Share on other sites

  • 0

Убрал action - все получилось! Ура! Про скобки не очень понял, если я их убираю, пишет ошибку синтаксиса, ну и в учебнике пишут(читаю Хольцнера "PHP в примерах"), что составной оператор должен быть в фигурных скобках.

Спасибо всем за участие.

Небольшая просьба к demous - ты упоминал про безопасность. Где можно найти толковую книжку или ссылку на эту тему? Еще раз спасибо.

Link to comment
Share on other sites

  • 0

не давно наткнулся на статью. http://www.xakep.ru/post/40398/default.asp

а вообще, копай в сторону sql-injection, обработку получаемых данных (GET, POST). это далеко не все и есть еще много тонкостей. я, например, постоянно что то новое нахожу в сети по безопасности. Такая вещь как CAPTCHA, в любой форме просто необходима.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy