Jump to content
  • 0

$_POST vs $_REQUEST


ozzon91
 Share

Question

Доброго всем времени суток, вот у меня такая дилема написал я скриптик

<?php 
$db = mysql_connect("localhost", "ozzon91", "32503250");
mysql_select_db("user_list", $db);
if (isset($_POST['email'])) {$email = $_POST['email']}
if (isset($_POST['pass'])) {$pass = $_POST['pass']}
?>
<html>
<title>Готово</title>
</head>

<body>
<?php
$result = mysql_query("INSERT INTO user (email,pass) VALUES ('$email','$pass')", $db);
if($result == true) {echo "info add all ok!";}
else {echo "Информация не добавлена!";};
?>
</body>
</html>[/i]

Как видете там стоит защита от registr_global = on но страница почемута из-за этого стала грузиться вечно и в конце концов выдавала что страница или сервер не найдены, я решил эту проблему таким способом заменил
[i]if (isset($_POST['email'])) {$email = $_POST['email']}
if (isset($_POST['pass'])) {$pass = $_POST['pass']}[/i]
на это
[i]$email = $_REQUEST["email"];
$pass = $_REQUEST["pass"];

и все заработало как часы но почему не работал первый способ я так и не разобрался может вы подскажите и еще в чем разница между этими двумя способами.

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0

Здесь вы говорите программе: если есть глобальная переменная $email...

if (isset($_POST['email']))

то: присвоей ей значение глобальной переменной...

{$email = $_POST['email']}

Вопрос, а как она может быть глобальной, если вы в начале программы не указали этого?

$email = $_POST['email'];

И вовсе не обязательно так:

$email = $_REQUEST["email"];

Когда можно и так:

$email = $_POST['email'];

Как видете там стоит защита от registr_global = on

Это не защита.

Link to comment
Share on other sites

  • 0

А если $_POST не задан, что запишется в базу? Кто об этом должен подумать?

И почему сообщение об ошибке и успешном добавлении написаны одно на русском, а другое на деревенском английском?

Link to comment
Share on other sites

  • 0

Итак, для начала

$db = mysql_connect("localhost", "ozzon91", "32503250");
mysql_select_db("user_list", $db);

$email = isset($_POST['email']) ? $_POST['email'] : false;
$pass = isset($_POST['email']) ? $_POST['pass'] : false;

if (!$email || !$pass)
{
echo 'Не введен email или пароль.';
}
elseif ( $result = mysql_query('INSERT INTO user (email,pass) VALUES ("'. mysql_real_escape_string($email) .'","'. mysql_real_escape_string($pass) .'")', $db) )
{
echo 'Инфо в базе.';
}
else
{
echo 'Ошибка добавления в БД.';
}

В суперглобальной переменной $_REQUEST хранятся данные переданные, как из адреса (file.php?email=test@test.ru&pass=ok), так и из формы через POST-запрос.

rus, $email - это не глобальная переменная. $_POST['email'] - переменная, переданная методом POST, т.е. из формы с атрибутом method="post", т.е. информация переда в заголовке обращения к скрипту.

Проблема не в этих суперглобальных переменных $_POST и $_REQUEST. Эта проблема носила систематический характер? Возможно просто сервер подвис и не обработал запрос?

И учтите еще один момент - всегда пользуйтесь функцией mysql_real_escape_string($email) для экранирования данных, заносимых в базу, да и просто переменных, которые используются в запросах.

Edited by Ялекс
Link to comment
Share on other sites

  • 0

Этот скрипт так сказать "сырой" вот почему одно сообщение на русском другое на безграматном английском, нет экранирования. Вобщем я разобрался что к чему проблема была в простой синтаксической ошибке (не поставил точку с запятой). Всем спасибо за помощь.

Link to comment
Share on other sites

  • 0
rus, $email - это не глобальная переменная. $_POST['email'] - переменная, переданная методом POST, т.е. из формы с атрибутом method="post", т.е. информация переда в заголовке обращения к скрипту.

Ну, я имел ввиду приравнивание переменной к суперглобальному массиву $_POST.

Link to comment
Share on other sites

  • 0

Замена $_POST на $_REQUEST в плане "защиты" - с чем боролись, на то и напоролись. Опасность register_globals в том, что подсунуть данные можно любым путем (хоть постом, хоть гетом, хоть куками), $_REQUEST - та же ерунда в профиль.

Но вообще у этого скрипта странная логика. Я бы делал всё последовательно. Сначала проверил, пришли ли нужные пост-данные. Если не пришли - вывел бы форму с требованием их ввести, дергать базу в этом случае вообще бессмысленно. А вот если пришли - тогда есть смысл коннектиться к базе, делать запрос и выводить сообщение об успехе или ошибке в зависимости от его результата (наподобие примера Ялекса)...

Link to comment
Share on other sites

  • 0
И учтите еще один момент - всегда пользуйтесь функцией mysql_real_escape_string($email) для экранирования данных, заносимых в базу, да и просто переменных, которые используются в запросах.

Стоит добавить, что mysql_real_escape_string() требует предварительного соединения с БД :)

Поэтому, если обработку нужно производить до того, как установлено соединение, то стоит воспользоваться mysql_escape_string()

Link to comment
Share on other sites

  • 0
Стоит добавить, что mysql_real_escape_string() требует предварительного соединения с БД :)

Поэтому, если обработку нужно производить до того, как установлено соединение, то стоит воспользоваться mysql_escape_string()

То есть, если соединение не установлено, то функция mysql_real_escape_string() не сработает?

Link to comment
Share on other sites

  • 0
То есть, если соединение не установлено, то функция mysql_real_escape_string() не сработает?

Если соединение не установлено, то вызов mysql_real_escape_string() приведет к тому, что будет осуществлен вызов mysql_connect() c параметрами по умолчанию:

сервер: localhost

имя пользователя: root

пароль: пустая строка

Если соединиться не удастся, то myql_real_escape_string() вернет FALSE. Если же удастся - то вернет обработанную строку.

На счет работы myql_real_escape_string() и myql_escape_string():

myql_real_escape_string() считается улучшенной версией myql_escape_string() в плане экранирования спецсимволов. myql_escape_string() не поддерживает работу с некоторыми восточными кодировками. Но если вы пользуетесь cp1251 или юникодом, то никакой разницы не будет. Обе функции будут одинаково хорошо экранировать все спецсимволы в строке.

Поэтому я предпочитаю использовать myql_escape_string() :)

Edited by alex_tihonko
Link to comment
Share on other sites

  • 0

Вот так будет работать:

<?php
//Данные для соединения c базой
$db_location = "localhost";
$db_user = "test";
$db_user_pass = "test";
$db_name = "test";

//Соединяемся с базой
$db_connection = mysql_connect($db_location, $db_user, $db_user_pass);
mysql_select_db($db_name, $db_connection);


$id = mysql_real_escape_string($_GET['id']);
if (isset($_GET['id']))
{
//Запрос
$query = "SELECT * FROM test WHERE id = $id LIMIT 1";
$tst = mysql_query($query);

//вывод результатов
$test = mysql_fetch_array($tst);
echo $test['name'];
}
?>

В окне браузера:

Piter

А вот так не будет:

<?php
//Данные для соединения c базой
$db_location = "localhost";
$db_user = "test";
$db_user_pass = "test";
$db_name = "test";

$id = mysql_real_escape_string($_GET['id']);
if (isset($_GET['id']))
{
//Соединяемся с базой
$db_connection = mysql_connect($db_location, $db_user, $db_user_pass);
mysql_select_db($db_name, $db_connection);

//Запрос
$query = "SELECT * FROM test WHERE id = $id LIMIT 1";
$tst = mysql_query($query);

//вывод результатов
$test = mysql_fetch_array($tst);
echo $test['name'];
}
?>

В окне браузера:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in Z:\home\localhost\www\test\index.php on line 11

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in Z:\home\localhost\www\test\index.php on line 11

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\test\index.php on line 23

Link to comment
Share on other sites

  • 0

А, ну так не думаю что кто-то так делает, как у тебя во втором примере, ибо:

1) как узнать существует ли айди, если соединение с базой идет после проверки на существование оной? Это же глупо и никогда работать не будет!

2) все нормальные люди выносят подключение к бд в отдельный конфиг файл и подключают его в верху страницы. :)

З.Ы. я то думал мож че новое услышу... ;)

Link to comment
Share on other sites

  • 0
2) все нормальные люди выносят подключение к бд в отдельный конфиг файл и подключают его в верху страницы. :)

Да, я тоже считаю, что так лучше всего делать. Если так делать, то разницы между, mysql_real_escape_string() и mysql_escape_string() никакой нет.

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

З.Ы. я то думал мож че новое услышу... ;)

Вот анекдотец, может быть он будет новым :) :

- Вчера снеговик H. покончил жизнь самоубийством, прыгнув на теплотрассу. Психологи считают, что виноваты комплексы, мучавшие снеговика в связи с маленькой морковкой

Link to comment
Share on other sites

  • 0
Вот анекдотец, может быть он будет новым :) :

- Вчера снеговик H. покончил жизнь самоубийством, прыгнув на теплотрассу. Психологи считают, что виноваты комплексы, мучавшие снеговика в связи с маленькой морковкой

Да, новый (для меня) ;)

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