|
|
|
| чем отличаются функции mysql_real_escape_string() и mysql_escape_string() что предпочтительнее к использованию | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 03:07)
| | тут ссылочка доходчиво описано | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 03:07)
| | А еще mysql_escape_string() в php 5.3.0 помечена на удаление, что как бэ намекает, какую именно надо использовать функцию. | |
|
|
|
|
|
|
|
для: neadekvat
(11.04.2010 в 09:50)
| | а как правильно пользоваться, так?
if(!get_magic_quotes_gpc())
{
$name = trim(mysql_real_escape_string($_POST['name']));
}
else
{
$name = trim($_POST['name']);
}
|
| |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 11:12)
| | нет.
правильно пользоваться - так как изображено в мануале по этой функции - в примере №1 | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 11:37)
| | не совсем понятно, можете разъяснить? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 11:54)
| | цитируйте пример - поясню.
Или Вы не в курсе, как искать вывести мануал по имени функции?
php.net/имя_функции | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 12:18)
| |
<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
|
| |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 12:30)
| | да. именно он. А что непонятно-то?
можно обойтись и без sprintf
<?
$query = "SELECT * FROM users"
." WHERE user='".mysql_real_escape_string($user)."'"
." AND password='".mysql_real_escape_string($password)."'",
|
но, как видите, текст получается более неуклюжим. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 12:33)
| | ну а например если поступают данные через форму как ее обрабатывать? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 12:38)
| | так в приме же всё показано. или Вы думаете, что $password может как то взяться не из формы? | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.04.2010 в 12:51)
| | А может и не из формы, че | |
|
|
|
|
|
|
|
для: Тень*
(11.04.2010 в 12:53)
| | я о другом, я правильно понял, что эту функцию надо использовать при составлении sql запроса, а не с данными, которые поступают в бд
т.е.
if(!get_magic_quotes_gpc())
{
$name = trim(mysql_real_escape_string($_POST['name']));
}
else
{
$name = trim($_POST['name']);
}
|
делать необязательно
достаточно
$name = trim($_POST['name']);
|
| |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 13:00)
| | > ....а не с данными, которые поступают в бд
это тоже sql запрос | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.04.2010 в 13:04)
| | не понятно, поясните | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 13:07)
| | >я о другом, я правильно понял, что эту функцию надо использовать при составлении sql запроса, а не с данными, которые поступают в бд
sql запрос это на выборку данных, на изменение данных, на удаление данных, на запись данных в базу....
если данные поступают в бд, значит выполняется sql запрос | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 13:00)
| | с данными, поступающими из формы надо делать так.
$name = get_magic_quotes_gpc() ? stripslashes($_POST['name']) : $_POST['name'];
|
но это надо делать а) с любыми данными формы.
и б) вне всякой связи как с обращениями к БД, так и с выводом в браузер
Хотя лучше бы magic quotes отключить с гарантией. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 13:29)
| | а как их отключить?
а с числовыми значениями достаточно intval? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 15:48)
| | если на локальном компьютере, то достаточно в php.ini magic_quotes_gpc = Off
если это на хосте, то через файл .htaccess, если он разрешён к использованию хостером, в файле написать строку php_flag magic_quotes_gpc Off | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 13:29)
| | я вот так делаю, поправте пожайлуста как правильнее и безопаснее
<?php
//обрабатываем получанные данные
$id = intval($_GET['id']);
if (!isset($id))
{
echo "Вы не ввели данные!";
exit();
}
//выбираем данные
$aquery = mysql_query("SELECT * FROM `category` WHERE `id`=$id");
$a = mysql_fetch_assoc($aquery);
?>
<form method="post" name="category" action="edit_category.php?id=<?php echo $id; ?>">
<b><small>Название категории:</small></b><br />
<input <?php if($id==2) echo " readonly "; ?> type="text" name="name" value="<?php echo $a['name']; ?>" size="50" maxlength="50" /><br /><br />
<b><small>Описание категории:</small></b><br />
<textarea name="description" rows="20" style="width:100%"><?php echo $a['description']; ?></textarea><br /><br />
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="submit" name="submit" value="Сохранить" />
</form>
<?php
//обрабатываем получанные данные
$id = intval($_POST['id']);
if (!isset($id))
{
echo "Вы не ввели данные! ";
exit();
}
if(!get_magic_quotes_gpc())
{
$name = trim(mysql_escape_string($_POST['name']));
$description = trim(mysql_escape_string($_POST['description']));
}
else
{
$name = trim($_POST['name']);
$description = trim($_POST['description']);
}
//обновляем данные
$aupdate = "UPDATE `category` SET name='$name', description='$description', WHERE `id`=$id";
if (mysql_query($aupdate))
{
echo "Данные успешно обновлены!<br />";
exit();
}
else
{
exit (mysql_error());
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 16:20)
| | в каком плане - поправить?
Я показал, как правильнее. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 17:14)
| | ну в плане как подправить сей код с вашей точки зрения? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 17:26)
| | я показал, как подправить.
Именно этот код я подправлять буду лишь при наличии весьма убедительных доводов.
Потому что Вы можете сделать это сами. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 17:28)
| | так?
<?php
//обрабатываем получанные данные
$id = intval($_POST['id']);
if (!isset($id))
{
echo "Вы не ввели данные! ";
exit();
}
if(get_magic_quotes_gpc())
{
$name = trim(stripslashes($_POST['name']));
$description = trim(stripslashes($_POST['description']));
}
else
{
$name = trim($_POST['name']);
$description = trim($_POST['description']);
}
//обновляем данные
$aupdate = "UPDATE `category` SET name='$name', description='$description', WHERE `id`=$id";
if (mysql_query($aupdate))
{
echo "Данные успешно обновлены!<br />";
exit();
}
else
{
exit (mysql_error());
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 17:56)
| | почему trim в обработке magic quotes?
куда делась mysql_real_escape_string при формировании запроса? | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 18:02)
| | trim - для удаления пробелов в конце и начале строки, там текстовые данные, а mysql_real_escape_string() не использовал, т.к. $id число, или я не совсем правильно понял | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 18:05)
| | удаление пробелов не имеет отношения к magic quotes.
Не пытайтесь оптимизировать скрипт раньше чем его напишете.
А если оптимизируете, не нарушайте при этом логику - почему trim упоминается два раза?
В контексте оператора $aupdate = ... не заметно , что $id именно число.
но я спрашивал даже не об этой переменной, а о name и о description .
Сейчас у Вас SQL-инъекция чистоганом. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 18:08)
| |
<?php
//обрабатываем получанные данные
$id = intval($_POST['id']);
if (!isset($id))
{
echo "Вы не ввели данные! ";
exit();
}
if(get_magic_quotes_gpc())
{
$name = stripslashes($_POST['name']);
$description = stripslashes($_POST['description']);
}
else
{
$name = $_POST['name']);
$description = $_POST['description'];
}
$name = trim($name);
$description = trim($description);
//обновляем данные
$aupdate = "UPDATE `category` SET name='".mysql_real_escape_string($name)."', description='".mysql_real_escape_string($description}."', WHERE `id`='."mysql_real_escape_string($id)."'";
if (mysql_query($aupdate))
{
echo "Данные успешно обновлены!<br />";
exit();
}
else
{
exit (mysql_error());
}
}
?>
|
но $id - число оно вначале обрабатывается как intval, как его в запрос добавлять? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 18:16)
| | Теперь нужно исправить синтаксические ошибки,
а также сделать так, чтобы листинг по ширине влезал в печатный лист.
Мне до кнопки "ответить" не добраться. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 18:30)
| | я правда не вижу ошибок, подскажите?
а как уменьшить листинг по ширине?
вот нашел такое решение
<?php
// функция для экранировки спецсимволов
function escape_string($str) {
if( get_magic_quotes_gpc() ) // если режим магических кавычек включен
$str = stripslashes($str); // очищаем строку от обратных слешей, которые добавили магические ковычки
return mysql_real_escape_string($str); // возвращаем экранированную строку
}
// и где-то её использование
$id = intval($_POST['id']);
$name = escape_string($_POST['name']);
$description = escape_string($_POST['description']);
$name = trim($name);
$description = trim($description);
//обновляем данные
$sql = "UPDATE `category` SET name='{$name}', description='{$description}' WHERE id={$id}";
mysql_query($sql) or die(mysql_error());
?>
|
| |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 18:46)
| | понятно.
не в коня корм.
Что я могу сказать?
В разделе "задачи" 21-я - Ваша..
Решите - поймете. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 19:41)
| | в вашем решении этой задачи есть такая функция
function unmq($arg)
{
return $arg === null ? null :
(get_magic_quotes_gpc()? stripslashes($arg): $arg);
}
|
а сам sql запрос формируется так
$add = unmq(@$_POST['name']);
$name = $add;
$esc_name = "'".mysql_escape_string($name)."'";
$sql = "SELECT id FROM guests WHERE guestname = $esc_name";
|
но сейчас вы предлагаете так делать
$add = unmq(@$_POST['name']);
$name = $add;
$sql = "SELECT id FROM guests WHERE guestname = '".mysql_escape_string($name)."'";
|
я вас правильно понял?
а почему в функцию unmq нельзя добавить mysql_escape_string? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 20:35)
| | наверное потому что противоположные задачи у этих функций? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 20:35)
| | >в вашем решении этой задачи есть такая функция
>
>
>function unmq($arg)
>{
> return $arg === null ? null :
> (get_magic_quotes_gpc()? stripslashes($arg): $arg);
>}
>
|
>
>а сам sql запрос формируется так
>
>
>$add = unmq(@$_POST['name']);
>$name = $add;
> $esc_name = "'".mysql_escape_string($name)."'";
> $sql = "SELECT id FROM guests WHERE guestname = $esc_name";
>
|
>
>но сейчас вы предлагаете так делать
>
>$add = unmq(@$_POST['name']);
>$name = $add;
> $sql = "SELECT id FROM guests WHERE guestname = '".mysql_escape_string($name)."'";
>
|
>я вас правильно понял?
Если Вы уже ловите настолько тонкие различия как сейчас процитировали, то тогда скажу, что верхний вариант идеологически более корректен. И ему я бы отдал предпочтение.
>а почему в функцию unmq нельзя добавить mysql_escape_string?
А вот этот вопрос показывает, что нихрена подобного не происходит, и до ловли тонких различий - как до Шанхая пешком.
Почему нельзя? Можно. Только скрипт работать перестанет. Вернее, начнет работать с ошибками. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 21:53)
| | спасибище!!! оставлю пока так (пока полностью не догоню как все это работает)
>function unmq($arg)
>{
> return $arg === null ? null :
> (get_magic_quotes_gpc()? stripslashes($arg): $arg);
>}
>$add = unmq(@$_POST['name']);
>$name = $add;
> $esc_name = "'".mysql_escape_string($name)."'";
> $sql = "SELECT id FROM guests WHERE guestname = $esc_name";
>
|
а какие ошибки могут возникать?
а с числовыми значениями как поступать?
и когда можно trim использовать?
и что брать mysql_escape_string или mysql_real_escape_string? | |
|
|
|
|
|
|
|
для: Bvz
(11.04.2010 в 17:56)
| | ну а где же обработка данных функцией mysql_real_escape_string()? ведь Вас же интересовало именно это.
если "магические кавычки" включены, Вы убираете экранирующие слеши и..... дальше что? данные идут в запрос не обработаные....
если "магические кавычки" отключены, то данные так же не обрабатываются перед подстановкой в запрос.
Вам же показали пример из мануала, как обрабатывать данные...
Вы спрашивали как отключить "магические кавычки", вот и отключайте, и данные обрабатывайте с учётом этого. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 13:29)
| | Стоит учесть, что $_POST['name'] может быть массивом. | |
|
|
|
|
|
|
|
для: Тень*
(11.04.2010 в 21:58)
| | В смысле можно некрасиво получить диагностик на экран? Да, конечно.
Это Cheops мой ляп проглядел :) | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 22:04)
| | Причём тут он? | |
|
|
|
|
|
|
|
для: Тень*
(11.04.2010 в 22:07)
| | Он же мой ответ в 21 задаче оценивал? | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.04.2010 в 12:51)
| | пуркуа бы и не па? | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 12:33)
| | а мне вот интересно:
Если включены магические кавычки, то как лучше:
почистить переменную от слешей которые поставили магические кавычки а затем применить mysql_real_escape_string()
<?
if (get_magic_quotes_gpc()) {
$name = stripslashes($_POST['name']);
}
// Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем
if (!is_numeric($name)) {
$name = "'" . mysql_real_escape_string($_POST['name']) . "'";
}
|
или
Положиться на магические кавычки и пропустить обработку функцией mysql_real_escape_string()
<?
if(!get_magic_quotes_gpc())
{
$name = mysql_real_escape_string($_POST['name']);
}
|
??????????????? | |
|
|
|
|
|
|
|
для: tvv123456
(11.04.2010 в 13:19)
| | марш решать 21 задачу. | |
|
|
|
|
|
|
|
для: Trianon
(11.04.2010 в 13:30)
| | Да все понял из вашего ответа: автор: Trianon (11.04.2010 в 13:29)
Хотел затереть сообщение но не успел | |
|
|
|
|
|
|
|
для: tvv123456
(11.04.2010 в 13:31)
| | нет. Вы не поняли. Вы поверили :)
Вот решите задачу в полноте объема - тогда поймете. | |
|
|
|