[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Решение задачи на корректную обработку данных
Evilsoul
Условия задачи здесь.

Вот что у меня получилось:

.htaccess
AddDefaultCharset UTF-8

php_flag magic_quotes_gpc Off


form.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
Names</title>
</head>
<body>

<form
name="add" action="?" method="post">
Введите имя:<br>
<input
name="add_name" type="text" size="20"><br>
<input
type="submit" value="Добавить"><br><br>
</form>
<form
name="search" action="?" method="get">
Поиск имени:<br>
<input
name="search_name" type="text" size="20"

value="<?php if(isset($_GET['search_name'])) echo $_GET['search_name'];?>"

><br>
<input
type="submit" value="Найти">
</form>

</body>
</html>


config.php
<?php
// Проверяем ключ
if(!defined('KEY'))
{
header("HTTP/1.1 404 Not Found");
exit();
}

// Настройки подключения к БД
define ('HOST', 'localhost');

define ('LOGIN', 'root');

define ('PASSWORD', 'root');

define ('DB', 'test');
?>


index.php
<?php
// Установим кодировку
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL & ~E_NOTICE);

// Установим ключ доступа к файлам
define ('KEY', true);

// Подключаем настройки для связи с БД
include './config.php';

// Соединение с БД и установка кодировок
$db_names = mysql_connect(HOST, LOGIN, PASSWORD) or die('Не могу соедениться с БД'); [s]

mysql_select_db(DB, $db_names) or die('Не могу найти базу данных');

mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');

// Определим и фильтруем переменные
$add_name = !empty($_POST['add_name']) ? htmlspecialchars($_POST['add_name']) :null;
$search_name = !empty($_GET['search_name']) ? htmlspecialchars($_GET['search_name']) :null;
$id = !empty($_GET['id']) ? htmlspecialchars($_GET['id']) :null;


// Выводим дату регистрации имени
if(isset($id))
{
$info_name = mysql_query ('SELECT * FROM `names` WHERE `id` = "'.intval($id).'"') or die ('Неудачный запрос smile.gif');

$row = mysql_fetch_assoc($info_name);
echo '<h3>Дата регистрации имени: <font color="red">' .$row['name']. '</font></h3>' .$row['date']. '<hr size="1" width="100%">';
}

// Поиск имен
if(isset($search_name))
{
$search = mysql_query('SELECT `name` FROM `names` WHERE `name` LIKE "%'.mysql_real_escape_string($search_name).'%"') or die ('Поиск не удался');

if($num = mysql_num_rows($search))
{
$i=1;

echo '<h3>Найдено имен: <font color="red">' .$num. '</h3></font>';

while($row = mysql_fetch_assoc($search))
echo $i++. ') <font color="red">' .$row['name']. '</font><br>';

echo '<hr size="1" width="100%">';
}

else
echo '<font color="red"><h3>Имен не найдено</h3></font><hr size="1" width="100%">';
}

// Выводим список имен с БД
$output_name = mysql_query('SELECT `id`, `name` FROM `names` ORDER BY `id` DESC') or die ('Не удается вывести список имен');

$i=1;

while ($row = mysql_fetch_assoc($output_name))
echo $i++. ') <a href="index.php?id=' .$row['id']. '">' .$row['name']. '</a><br>';

// Добавление имени
if (isset($add_name))
{
mysql_query('INSERT INTO `names` VALUES (NULL, NULL, "'.mysql_real_escape_string($add_name).'")') or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['PHP_SELF']);
exit();
}

// Вставляем саму форму
include './form.html';

?>



1) twin, так и не разобрался как сделать что бы не вводились пробелы, может намекнешь немного? а пока буду сам пытаться.
2) Подскажите кто-нибудь нормальный, бесплатный хостинг.



Спустя 5 часов, 1 минута, 32 секунды (26.12.2009 - 01:05) Evilsoul написал(а):
Загрузил решение задачи на бесплатный хост, все вроди Ок, но вот такая интересная штука получается при добавлении имени
Warning: Cannot modify header information - headers already sent by (output started at /www/ax3.net/g/o/godjatsky/home/site/index.php:61) in /www/ax3.net/g/o/godjatsky/home/site/index.php on line 68
и ссылается на вот эту строчку header('location:' .$_SERVER['PHP_SELF']); может кто сталкивался, подскажите пожалуйста.

Спустя 4 минуты, 52 секунды (26.12.2009 - 01:09) ApuktaChehov написал(а):
Поищи поиском тут куча тем с этой проблемой. Скажу, что это проблема всех начинающих.

Спустя 3 минуты, 30 секунд (26.12.2009 - 01:13) Evilsoul написал(а):
Кажется я догадываюсь в чем тут проблема, хеадер нельзя выводить позже какого-либо вывода на странице.

Спустя 2 часа, 14 минут, 15 секунд (26.12.2009 - 03:27) Evilsoul написал(а):
Конечно печально что за 50 просмотров темы не было замечаний ибо я сам нашёл их кучу.

Вот новый релиз.

.htaccess
AddDefaultCharset UTF-8

php_flag magic_quotes_gpc Off
php_flag register_globals Off


form.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
Names</title>
</head>

<body>
<form
name="add" action="?" method="post">
Введите имя:<br>
<input
name="add_name" type="text" size="20"><br>
<input
type="submit" name="but_add" value="Добавить"><br><br>
</form>
<form
name="search" action="?" method="get">
Поиск имени:<br>
<input
name="search_name" type="text" size="20"

value="<?php echo $_GET['search_name']; ?>"

><br>
<input
type="submit" name="but_search" value="Найти">
</form>


</body>
</html>


config.php
<?php
// Проверяем ключ
if(!defined('KEY'))
{
header("HTTP/1.1 404 Not Found");
exit();
}

// Настройки подключения к БД
define ('HOST', 'localhost');

define ('LOGIN', 'root');

define ('PASSWORD', 'root');

define ('DB', 'test');
?>


index.php
<?php
// Установим кодировку
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL & ~E_NOTICE);

// Установим ключ доступа к файлам
define ('KEY', true);

// Подключаем настройки для связи с БД
include './config.php';

// Соединение с БД и установка кодировок
$db_names = mysql_connect(HOST, LOGIN, PASSWORD) or die('Не могу соедениться с БД');

mysql_select_db(DB, $db_names) or die('Не могу найти базу данных');

mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');

// Определим переменные
$search_name = $_GET['search_name'];
$add_name = $_POST['add_name'];
$id = $_GET['id'];

// Фильтр переменных
function filtr($var)
{
$var = trim($var);
$var = htmlspecialchars($var);
$var = mysql_real_escape_string($var);

return $var;
}

// Добавление имени
if(isset($_POST['but_add']))
{
if (isset($add_name))
{
$add_name = filtr($add_name);

mysql_query('INSERT INTO `names` VALUES (NULL, NULL, "'.$add_name.'")') or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['PHP_SELF']);
exit();
}
}


// Выводим дату регистрации имени
if(isset($id))
{
$info_name = mysql_query ('SELECT * FROM `names` WHERE `id` = "'.intval($id).'"') or die ('Неудачный запрос smile.gif');

$row = mysql_fetch_assoc($info_name);
echo '<h3>Дата регистрации имени: <font color="red">' .$row['name']. '</font></h3>' .$row['date']. '<hr size="1" width="100%">';
}

// Поиск имен
if(isset($_GET['but_search']))
{

if(isset($search_name))
{
$search_name = str_replace('\\', '\\\\', $search_name);
$search_name = filtr($search_name);

$search = mysql_query('SELECT `name` FROM `names` WHERE `name` LIKE "%'.$search_name.'%"') or die ('Поиск не удался');

if($num = mysql_num_rows($search))
{
$i=1;

echo '<h3>Найдено имен: <font color="red">' .$num. '</h3></font>';

while($row = mysql_fetch_assoc($search))
echo $i++. ') <font color="red">' .$row['name']. '</font><br>';

echo '<hr size="1" width="100%">';
}
else
echo '<font color="red"><h3>Имен не найдено</h3></font><hr size="1" width="100%">';
}
}


// Выводим список имен из БД
$output_name = mysql_query('SELECT `id`, `name` FROM `names` ORDER BY `id` DESC') or die ('Не удается вывести список имен');

$i=1;

while ($row = mysql_fetch_assoc($output_name))
echo $i++. ') <a href="index.php?id=' .$row['id']. '">' .$row['name']. '</a><br>';

// Вставляем саму форму
include './form.html';
?>


2 вопроса при создании топа так и остаются открытыми.

Спустя 3 дня, 19 часов, 24 минуты, 38 секунд (29.12.2009 - 22:52) Evilsoul написал(а):
Twin, где твой ответ делся huh.gif хорошо что хоть один раз прочесть успел немного замечаний запомнил.

Вообщем ВОТ:

.htaccess
AddDefaultCharset UTF-8

php_flag magic_quotes_gpc On
php_flag register_globals Off


config.php - без изменений

index.php
<?php
// Установим кодировку
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

// Установим ключ доступа к файлам
define ('KEY', true);

// Подключаем настройки для связи с БД
include './config.php';

// Соединение с БД и установка кодировок
$db_names = mysql_connect(HOST, LOGIN, PASSWORD) or die('Не могу соедениться с БД');

mysql_select_db(DB, $db_names) or die('Не могу найти базу данных');

mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');

// Спасаемся от магических кавычек
function mq($val)
{
if (is_array($val))
$val = array_map('mq', $val);
else
return
stripslashes($val);
}

if(isset($_GET['search_name']))
if(get_magic_quotes_gpc())
$search_name = mq($_GET['search_name']);

if(isset($_POST['add_name']))
if(get_magic_quotes_gpc())
$add_name = mq($_POST['add_name']);

// Добавление имени
if(isset($_POST['but_add']))
{
if (isset($add_name))
{
$add_name = trim($add_name);
$add_name = mysql_real_escape_string($add_name);

mysql_query('INSERT INTO `names` VALUES (NULL, NULL, "'.$add_name.'")') or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['PHP_SELF']);
exit();
}
}


// Выводим дату регистрации имени
if(isset($_GET['id']))
{
$query = mysql_query ('SELECT * FROM `names` WHERE `id` = "'.intval($_GET['id']).'"') or die ('Неудачный запрос smile.gif');
$row = mysql_fetch_assoc($query);
$name = htmlspecialchars($row['name']);

echo '<h3>Дата регистрации имени: <font color="red">' .$name. '</font></h3>' .$row['date']. '<hr size="1" width="100%">';
}

// Поиск имен
if(isset($_GET['but_search']))
{
if(isset($search_name))
{
$search_name = trim($search_name);
$search_name = mysql_real_escape_string($search_name);

$query = mysql_query('SELECT `name` FROM `names` WHERE `name` LIKE "%'.$search_name.'%"') or die ('Поиск не удался');

if($num = mysql_num_rows($query))
{
echo '<h3>Найдено имен: <font color="red">' .$num. '</h3></font>';

$i=1;

while($row = mysql_fetch_assoc($query))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <font color="red">' .$name. '</font><br>';
}

echo '<hr size="1" width="100%">';
}

else
echo '<font color="red"><h3>Имен не найдено</h3></font><hr size="1" width="100%">';
}
}


// Выводим список имен из БД
$output_name = mysql_query('SELECT `id`, `name` FROM `names` ORDER BY `id` DESC') or die ('Не удается вывести список имен');
$i=1;

while ($row = mysql_fetch_assoc($output_name))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <a href="index.php?id=' .intval($row['id']). '">' .$name. '</a><br>';
}

// Вставляем саму форму
include './form.html';
?>


form.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
Names</title>
</head>

<body>
<form
name="add" action="?" method="post">
Введите имя: <br>
<input
name="add_name" type="text" size="20">
<input
type="submit" name="but_add" value="Добавить">
</form>
<form
name="search" action="?" method="get">
Поиск имени: <br>
<input
name="search_name" type="text" size="20"

value="<?php if (isset($_GET['search_name'])) echo htmlspecialchars(stripslashes($_GET['search_name'])); ?>"

>
<input
type="submit" name="but_search" value="Найти" size="10">
</form><br>


</body>
</html>

Спустя 19 минут, 18 секунд (29.12.2009 - 23:11) twin написал(а):
Видимо были проблемы... Я не только этого ответа не нахожу.
Ну да ладно.
1. Вот это что за конструкшен:
   if(isset($_GET['search_name']))
if(get_magic_quotes_gpc())
$search_name = mq($_GET['search_name']);

а если будет
php_flag magic_quotes_gpc Off
?

2. Не решил проблему со знаками % и _
3. Вот тут:
$query = mysql_query('......

query по английски "запрос". А ты получаешь результат. Оно конечно без разницы, но слух режет. Принято как то уже $res или $result.

Ну а в целом прогресс. smile.gif Ищё маленько и эта пять.

Спустя 39 минут, 6 секунд (29.12.2009 - 23:50) Evilsoul написал(а):
Точно! smile.gif вчера корпоратив был, мозги туговато работают unsure.gif

1) Вот так (для $add_name аналогично):
   if(isset($_GET['search_name']))
{
if(get_magic_quotes_gpc())
$search_name = mq($_GET['search_name']);
else
$search_name = ($_GET['search_name']);
}


2) Подскажи, не могу сообразить.

3) Выбрал вариант $res rolleyes.gif

Спустя 4 минуты, 35 секунд (29.12.2009 - 23:55) twin написал(а):
Evilsoul
Цитата
2) Подскажи, не могу сообразить.

Ну их отдельно нужно заэкранировать для поиска.

Спустя 30 минут, 25 секунд (30.12.2009 - 00:25) Evilsoul написал(а):
Выходит нужно сделать что-то вроди этого:

if(isset($search_name))
{
$search_name = addcslashes($search_name, '\\%_');

Спустя 1 минута, 26 секунд (30.12.2009 - 00:27) twin написал(а):
Точно. smile.gif

Спустя 1 минута, 44 секунды (30.12.2009 - 00:28) Evilsoul написал(а):
И так? мы закончили? smile.gif

А как же быть с пробелами все равно не могу сообразить, ведь они добавляются в БД sad.gif

Спустя 17 минут, 20 секунд (30.12.2009 - 00:46) twin написал(а):
Функция кстати некорректная
 // Спасаемся от магических кавычек
function mq($val)
{
if (is_array($val))
$val = array_map('mq', $val);
else
return
stripslashes($val);
}

так нодо:
 // Спасаемся от магических кавычек
function mq($val)
{
if (is_array($val))
$val = array_map('mq', $val);
else
$val = stripslashes($val);

return $val;
}

Спустя 7 минут, 40 секунд (30.12.2009 - 00:53) Evilsoul написал(а):
Ага, спасибо. а с пробелами что делать? smile.gif

Спустя 13 минут, 41 секунда (30.12.2009 - 01:07) twin написал(а):
Немного логику изменить:
// Добавление имени
if(isset($_POST['but_add']))
{

$add_name = trim($add_name);

if (isset($add_name) && $add_name != '')
{

Спустя 1 минута, 30 секунд (30.12.2009 - 01:09) twin написал(а):
хотя это все равно криво. Нужно инициализировать правильно переменные.

Спустя 3 минуты, 46 секунд (30.12.2009 - 01:12) twin написал(а):
Я бы вот так наверно сделал на твоем месте
   if(isset($_POST['add_name']))
if(get_magic_quotes_gpc())
$add_name = mq(trim($_POST['add_name']));
else
$add_name = trim($_POST['add_name']);
else
$add_name = '';

// Добавление имени
if(isset($_POST['but_add']))
{
if($add_name != '')
{

Спустя 30 минут, 41 секунда (30.12.2009 - 01:43) Evilsoul написал(а):
Так тоже немного не так, ибо значением if будет true то else не будет выполнятся нужно использовать elseif. И кстати я попробовал и пробелы все равно лезут. А $add_name != ' ' так можно спастись только от одного пробела, не выходит unsure.gif

Спустя 3 минуты, 7 секунд (30.12.2009 - 01:46) twin написал(а):
Всё работает нормально. Разбирись внимательно.

Спустя 8 минут, 26 секунд (30.12.2009 - 01:55) Evilsoul написал(а):
Не получается sad.gif в чем проблема?
   if(isset($_POST['add_name']))
{
if(get_magic_quotes_gpc())
$add_name = mq($_POST['add_name']);
else
$add_name = ($_GET['add_name']);
}
else
$add_name = '';

// Добавление имени
if(isset($_POST['but_add']))
{
if ($add_name != '')
{
$add_name = trim($add_name);
$add_name = mysql_real_escape_string($add_name);

mysql_query('INSERT INTO `names` VALUES (NULL, NULL, "'.$add_name.'")') or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['PHP_SELF']);
exit();
}
}




Спустя 39 секунд (30.12.2009 - 01:55) Evilsoul написал(а):
ап, виноват smile.gif

Спустя 3 минуты, 49 секунд (30.12.2009 - 01:59) Evilsoul написал(а):
Все гут smile.gif ну что, можно теперь выложить полный скрипт и УРЛ?
А меня добавишь в список студентов? smile.gif

Спустя 8 минут, 10 секунд (30.12.2009 - 02:07) twin написал(а):
Я добавлял уже... Видно вместе с ответом потерли. Скрипт конечно выкладывай. smile.gif

Спустя 16 минут, 3 секунды (30.12.2009 - 02:23) Evilsoul написал(а):
Вот живой пример cool.gif

Код:

.htaccess
AddDefaultCharset UTF-8

php_flag magic_quotes_gpc On
php_flag register_globals Off


config.php
<?php
// Проверяем ключ
if(!defined('KEY'))
{
header("HTTP/1.1 404 Not Found");
exit();
}

// Настройки подключения к БД
define ('HOST', 'localhost');

define ('LOGIN', 'root');

define ('PASSWORD', 'root');

define ('DB', 'test');
?>


index.php
<?php
// Установим кодировку
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

// Установим ключ доступа к файлам
define ('KEY', true);

// Подключаем настройки для связи с БД
include './config.php';

// Соединение с БД и установка кодировок
$db_names = mysql_connect(HOST, LOGIN, PASSWORD) or die('Не могу соедениться с БД');

mysql_select_db(DB, $db_names) or die('Не могу найти базу данных');

mysql_query('SET NAMES utf8');
mysql_query('SET CHARACTER SET utf8');

// Спасаемся от магических кавычек
function mq($val)
{
if (is_array($val))
$val = array_map('mq', $val);
else
$val = stripslashes($val);

return ($val);
}

// Заодно определим переменные (чтобы проще было smile.gif) и уберём пробелы
if(isset($_GET['search_name']))
{
if(get_magic_quotes_gpc())
$search_name = mq(trim($_GET['search_name']));
else
$search_name = trim($_GET['search_name']);
}
else
$search_name = '';

if(isset($_POST['add_name']))
{
if(get_magic_quotes_gpc())
$add_name = mq(trim($_POST['add_name']));
else
$add_name = trim($_GET['add_name']);
}
else
$add_name = '';

// Добавление имени
if(isset($_POST['but_add']))
{
if($add_name != '')
{
$add_name = trim($add_name);
$add_name = mysql_real_escape_string($add_name);

mysql_query('INSERT INTO `names` VALUES (NULL, NULL, "'.$add_name.'")') or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['PHP_SELF']);
exit();
}
}


// Выводим дату регистрации имени
if(isset($_GET['id']))
{
$res = mysql_query ('SELECT * FROM `names` WHERE `id` = "'.intval($_GET['id']).'"') or die ('Неудачный запрос smile.gif');
$row = mysql_fetch_assoc($res);
$name = htmlspecialchars($row['name']);

echo '<h3>Дата регистрации имени: <font color="red">' .$name. '</font></h3>' .$row['date']. '<hr size="1" width="100%">';
}

// Поиск имен
if(isset($_GET['but_search']))
{
if(isset($search_name))
{
$search_name = addcslashes($search_name, '\\%_');
$search_name = trim($search_name);
$search_name = mysql_real_escape_string($search_name);

$res = mysql_query('SELECT `name` FROM `names` WHERE `name` LIKE "%'.$search_name.'%"') or die ('Поиск не удался');

if($num = mysql_num_rows($res))
{
echo '<h3>Найдено имен: <font color="red">' .$num. '</h3></font>';

$i=1;

while($row = mysql_fetch_assoc($res))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <font color="red">' .$name. '</font><br>';
}

echo '<hr size="1" width="100%">';
}

else
echo '<font color="red"><h3>Имен не найдено</h3></font><hr size="1" width="100%">';
}
}


// Выводим список имен из БД
$output_name = mysql_query('SELECT `id`, `name` FROM `names` ORDER BY `id` DESC') or die ('Не удается вывести список имен');
$i=1;

while ($row = mysql_fetch_assoc($output_name))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <a href="index.php?id=' .intval($row['id']). '">' .$name. '</a><br>';
}

// Вставляем саму форму
include './form.html';
?>


form.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
Names</title>
</head>

<body>
<form
name="add" action="?" method="post">
Введите имя: <br>
<input
name="add_name" type="text" size="20">
<input
type="submit" name="but_add" value="Добавить">
</form>
<form
name="search" action="?" method="get">
Поиск имени: <br>
<input
name="search_name" type="text" size="20"

value="<?php if (isset($_GET['search_name'])) echo htmlspecialchars(stripslashes($_GET['search_name'])); ?>"

>
<input
type="submit" name="but_search" value="Найти" size="10">
</form><br>


</body>
</html>

Спустя 6 минут, 43 секунды (30.12.2009 - 02:30) twin написал(а):
Неверно немного... Нельзя опираться на
php_flag magic_quotes_gpc On

Отключи её и посмотри, как вернется бэкслэш в поле поиска.

Спустя 22 минуты, 38 секунд (30.12.2009 - 02:53) Evilsoul написал(а):
Значит вот такой вариант:
<input name="search_name" type="text" size="20" 
value="<?php
if(isset($_GET['search_name']))
{
if(get_magic_quotes_gpc())
$search_name = mq(trim($_GET['search_name']));
else
$search_name = trim($_GET['search_name']);
}
else
$search_name = '';

echo htmlspecialchars($search_name);
?>"
>

Спустя 56 минут, 7 секунд (30.12.2009 - 03:49) VolCh написал(а):
Побурчу немного:

   mysql_query('SET NAMES utf8');         
mysql_query('SET CHARACTER SET utf8');

А если запрос не выполнится? (сервер упадёт, или просто нет кодировки utf8)

Note: А в последнее время вообще использую mysql_set_charset



// Спасаемся от магических кавычек
function mq($val)
{
if (is_array($val))
$val = array_map('mq', $val);
else
$val = stripslashes($val);

return ($val);
}

В мануале по PHP есть пример:
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);

return $value;
}

По-моему, куда читабельнее smile.gif И если насчёт условного оператора можно поспорить, то имя функции говорит само за себя, в отличии от mq. Хотя тут она вообще не нужна, add_name не может быть массивом

Вот этот кусок:
   if(isset($_POST['add_name']))
{
if(get_magic_quotes_gpc())
$add_name = mq(trim($_POST['add_name']));
else
$add_name = trim($_GET['add_name']);
}
else
$add_name = '';

// Добавление имени
if(isset($_POST['but_add']))
{
if($add_name != '')
{
$add_name = trim($add_name);
$add_name = mysql_real_escape_string($add_name);

mysql_query('INSERT INTO `names` VALUES (NULL, NULL, "'.$add_name.'")') or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['PHP_SELF']);
exit();
}
}

Замечания:
0. $add_name = trim($_GET['add_name']); - ошибка, должен быть _POST
1. Сначала иницилизируем $add_name (да еще иной раз и в рекурсивной функции), а потом смотрим нужна ли она вообще.
2. два раза зачем-то убираем пробелы, причем при включенных кавычках и массиве в качестве $_POST['add_name'] получим ошибку (trim не принмает массивы)
3. Зачем передавать нуллы? Не проще ли (и читабельней, и экономней) INSERT INTO `names` (name) VALUE ("'$add_name'")
4. Не уверен, что редирект будет работать (вернее, уверен, что не будет smile.gif ) в случае использования реврайта, лучше использовать REQUEST_URI, а не PHP_SELF - универсальней

Это блок переписал бы так:


// Добавление имени
if(isset($_POST['but_add']) && isset($_POST['add_name']) && is_scalar($_POST['add_name']))
{
$add_name = get_magic_quotes_gpc() ?
stripslashes(trim($_POST['add_name'])) :
trim($_POST['add_name']);
$add_name = mysql_real_escape_string($add_name);
mysql_query("INSERT INTO `names` (`name`) VALUE ('$add_name')") or die ('Ну не получается у меня добавить имя!');
header('location:' .$_SERVER['REQUEST_URI']);
exit();
}


Ну и так далее - продолжать? smile.gif

Спустя 27 минут, 33 секунды (30.12.2009 - 04:16) twin написал(а):
Продолжай, полезно будет.

Хотя целью этой задачи не была оптимальность кода, я придавал этому минимальное значение, что бы не отвлекать от главного. А главный упор на корректную работу с данными.


Спустя 2 часа, 16 минут, 17 секунд (30.12.2009 - 06:33) Evilsoul написал(а):
Цитата (VolCh @ 30.12.2009 - 00:49)
А если запрос не выполнится? (сервер упадёт, или просто нет кодировки utf8)

Что в таком случаи делать?

Исправил, так действительно проще:
mysql_set_charset('utf8', db_names);

0. Было исправлено сразу после публикации самого топа (с ошибкой).
1 - 4. Спасибо за науку, новичкам она как раз нужна smile.gif, ну а как по мне так лучше сначала инициализировать переменные ну а потом работать с ними, заодно и читабельнее вот так:
   if(isset($_GET['search_name']))
$search_name = get_magic_quotes_gpc() ? stripslashes(trim($_GET['search_name'])) : trim($_GET['search_name']);

if(isset($_POST['add_name']))
$add_name = get_magic_quotes_gpc() ? stripslashes(trim($_POST['add_name'])) : trim($_POST['add_name']);

// Добавление имени
if(isset($_POST['but_add']) && is_scalar($add_name))
{
if($add_name != '')
{
$add_name = mysql_real_escape_string($add_name);

mysql_query("INSERT INTO `names` (`name`) VALUE ('$add_name')") or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['REQUEST_URI']);
exit();
}
}

// Поиск имен
if(isset($_GET['but_search']) && is_scalar($search_name))
{
$search_name = addcslashes($search_name, '\\%_');
$search_name = mysql_real_escape_string($search_name);

$res = mysql_query('SELECT `name` FROM `names` WHERE `name` LIKE "%'.$search_name.'%"') or die ('Поиск не удался');

if($num = mysql_num_rows($res))
{
echo '<h3>Найдено имен: <font color="red">' .$num. '</h3></font>';

$i=1;

while($row = mysql_fetch_assoc($res))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <font color="red">' .$name. '</font><br>';
}

echo '<hr size="1" width="100%">';
}

else
echo '<font color="red"><h3>Имен не найдено</h3></font><hr size="1" width="100%">';
}

Поддерживаю Твина, продолжай rolleyes.gif

Спустя 2 часа, 51 минута (30.12.2009 - 09:24) twin написал(а):
Теперь я бурчать буду. biggrin.gif

Не совсем тут верно. Для того и функция, что бы не писать таких длинных портянок. А если 50 переменных? Вообще самым оптимальным является решение уничтожить последствия этой директивы раз и навсегда, что бы и не вспоминать больше нигде:
/**
* We kill magic inverted commas
* Убиваем магические кавычки
*/

function stripslashesDeep($data)
{
if(is_array($data))
$data = array_map("stripslashesDeep", $data);
else
$data = stripslashes($data);
return $data;
}

if(get_magic_quotes_gpc())
{
$_GET = stripslashesDeep($_GET);
$_POST = stripslashesDeep($_POST);
$_COOKIE = stripslashesDeep($_COOKIE);
}

Я в своем курсе еще не дошел до этого момента. smile.gif

Проверка на тип:
is_scalar($add_name)

тут явное излишество. Откуда там взяться массиву? А проверка будет гоняться всегда. Ну даже если и сунет какой нибудь изобретатель туда массив, ошибка слогируется и все. Ничего страшного не произойдет.

По запросу. Уж если заморачиваться читабельностью, то нужно использовать SET:

mysql_query("INSERT INTO `names`
SET `name` = '"
. mysql_real_escape_string($add_name) ."'")
or die ('Ну не получается у меня добавить имя!');



Спустя 49 минут, 4 секунды (30.12.2009 - 10:13) VolCh написал(а):
Цитата
Что в таком случаи делать?

mysql_set_charset('utf8', db_names) or die("Упс, что-то с кодировками базы")

практически все функции mysql_... возвращают false в случае ошибки, и практически никогда последствия в скрипте "на лету" не исправить. Вопрос только в том, как обрабатывать эти ошибки - die, исключение, своя ошибка, другая логика (никак не обрабатывать - грех mad.gif , вообще, не только в mysql_..., да и не только в PHP, хорошим тоном является не проверять возвращаемое значение, только если функция его не возвращает, во всех остальных проверять, это даёт, во-первых, информацию пользователю, что что-то пошло не так именно на нашей стороне, а не просто пустой экран, например, а, во-вторых, повышает безопасность - при критических ошибках потенциальный злоумышленник не получит данных о структуре приложения и/или БД, да и вообще как-то спится спокойней, зная, что не один байт без твоего позволения к пользователю не уйдет)

Цитата
Вообще самым оптимальным является решение уничтожить последствия этой директивы раз и навсегда, что бы и не вспоминать больше нигде:

Действительно smile.gif Занёс в свои сниппеты rolleyes.gif

Цитата
Проверка на тип:
is_scalar($add_name)
тут явное излишество

это моя паранойя ph34r.gif В реальном проекте было бы ещё круче wink.gif
Цитата
По запросу. Уж если заморачиваться читабельностью, то нужно использовать SET:

Вот не нравится мне INSERT ... SET ..., уж больно на UPDATE ... SET ... похоже, хотя для кого-то это и плюс.

Спустя 4 часа, 37 минут, 5 секунд (30.12.2009 - 14:50) Evilsoul написал(а):
Цитата (VolCh @ 30.12.2009 - 07:13)
а, во-вторых, повышает безопасность - при критических ошибках потенциальный злоумышленник не получит данных о структуре приложения и/или БД, да и вообще как-то спится спокойней, зная, что не один байт без твоего позволения к пользователю не уйдет)
хотя для кого-то это и плюс.
А если случайно пропустил проверку где нибудть (вот как у меня с кодировкой)? В этом случаи Твин рекомендует логировать ошибки в файл в дерективе с правами ни для кого.

Ну не нравится мне stripslashesDeep уж больно длинно, предлагаю kill_mq

Вот так теперь:
// Спасаемся от магических кавычек
function kill_mq($val)
{
if (is_array($val))
$val = array_map('kill_mq', $val);
else
$val = stripslashes($val);

return ($val);
}

if(get_magic_quotes_gpc())
{
$_GET = kill_mq($_GET);
$_POST = kill_mq($_POST);
$_COOKIE = kill_mq($_COOKIE);
}

// Заодно определим переменные (чтобы проще было smile.gif) и уберём пробелы
if(isset($_GET['search_name']))
$search_name = trim($_GET['search_name']);
else
$search_name = '';

if(isset($_POST['add_name']))
$add_name = trim($_POST['add_name']);
else
$add_name = '';

Чисто "косметика" smile.gif :
mysql_query("INSERT INTO `names`
SET `name` = '"
.$add_name."'")
or die ('Ну не получается у меня добавить имя!');

Спустя 2 часа, 42 минуты, 29 секунд (30.12.2009 - 17:32) twin написал(а):
Цитата
Ну не нравится мне stripslashesDeep уж больно длинно, предлагаю kill_mq

тут дело в стиле. Пользовательские функции лучше писать иначе, не через черточку. Чтоб не путать со штатными. Хотя бы так:
killMq()

Спустя 7 часов, 1 минута, 48 секунд (31.12.2009 - 00:34) Evilsoul написал(а):
Всем спасибо за науку, ВОТ пример работы

.htaccess
AddDefaultCharset UTF-8

php_flag magic_quotes_gpc On
php_flag register_globals Off


config.php
<?php
// Проверяем ключ
if(!defined('KEY'))
{
header("HTTP/1.1 404 Not Found");
exit();
}

// Настройки подключения к БД
define ('HOST', 'localhost');

define ('LOGIN', 'root');

define ('PASSWORD', 'root');

define ('DB', 'test');
?>


index.php
<?php
// Установим кодировку
header("Content-Type: text/html; charset=utf-8");
error_reporting(E_ALL);

// Установим ключ доступа к файлам
define ('KEY', true);

// Подключаем настройки для связи с БД
include './config.php';

// Соединение с БД и установка кодировок
$db_names = mysql_connect(HOST, LOGIN, PASSWORD) or die('Не могу соедениться с БД');

mysql_select_db(DB, $db_names) or die('Не могу найти базу данных');
mysql_set_charset('utf8', $db_names) or die('Не могу установить кодировку БД');

// Спасаемся от магических кавычек
function killMq($val)
{
if (is_array($val))
$val = array_map('killMq', $val);
else
$val = stripslashes($val);

return ($val);
}

if(get_magic_quotes_gpc())
{
$_GET = killMq($_GET);
$_POST = killMq($_POST);
$_COOKIE = killMq($_COOKIE);
}

// Заодно определим переменные (чтобы проще было smile.gif) и уберём пробелы
if(isset($_GET['search_name']))
$search_name = trim($_GET['search_name']);
else
$search_name = '';

if(isset($_POST['add_name']))
$add_name = trim($_POST['add_name']);
else
$add_name = '';

// Добавление имени
if(isset($_POST['but_add']))
{
if($add_name != '')
{
$add_name = mysql_real_escape_string($add_name);
mysql_query("INSERT INTO `names`
SET `name` = '"
.$add_name."'")
or die ('Ну не получается у меня добавить имя!');

header('location:' .$_SERVER['REQUEST_URI']);
exit();
}
}


// Выводим дату регистрации имени
if(isset($_GET['id']))
{
$res = mysql_query ("SELECT *
FROM `names`
WHERE `id` = '"
.intval($_GET['id'])."'")
or die ('Неудачный запрос smile.gif');

$row = mysql_fetch_assoc($res);
$name = htmlspecialchars($row['name']);

echo '<h3>Дата регистрации имени: <font color="red">' .$name. '</font></h3>' .$row['date']. '<hr size="1" width="100%">';
}

// Поиск имен
if(isset($_GET['but_search']))
{
$search_name = addcslashes($search_name, '\\%_');
$search_name = mysql_real_escape_string($search_name);
$res = mysql_query('SELECT `name`
FROM `names`
WHERE `name`
LIKE "%'
.$search_name.'%"')
or die ('Поиск не удался');

if($num = mysql_num_rows($res))
{
echo '<h3>Найдено имен: <font color="red">' .$num. '</h3></font>';

$i=1;
while($row = mysql_fetch_assoc($res))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <font color="red">' .$name. '</font><br>';
}

echo '<hr size="1" width="100%">';
}

else
echo '<font color="red"><h3>Имен не найдено</h3></font><hr size="1" width="100%">';
}

// Выводим список имен из БД
$output_name = mysql_query('SELECT `id`, `name`
FROM `names`
ORDER BY `id` DESC'
)
or die ('Не удается вывести список имен');

$i=1;
while ($row = mysql_fetch_assoc($output_name))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <a href="index.php?id=' .intval($row['id']). '">' .$name. '</a><br>';
}

// Вставляем саму форму
include './form.html';
?>


form.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
Names</title>
</head>

<body>
<form
name="add" action="./index.php" method="post">
Введите имя: <br>
<input
name="add_name" type="text" size="20">
<input
type="submit" name="but_add" value="Добавить">
</form>
<form
name="search" action="./index.php" method="get">
Поиск имени: <br>
<input
name="search_name" type="text" size="20"
value="<?php
if(isset($_GET['search_name']))
$search_name = trim($_GET['search_name']);
else
$search_name = '';

echo htmlspecialchars($search_name);
?>"
>
<input
type="submit" name="but_search" value="Найти" size="10">
</form><br>


</body>
</html>

Спустя 43 минуты, 20 секунд (31.12.2009 - 01:17) VolCh написал(а):
http://godjatsky.ax3.net/index.php?id=111111111 rolleyes.gif

Всегда проверяй, что возвращают функции, особенно при чтении БД wink.gif

При выводе списка, имхо, должна быть сортировка по дате, но это twin'у решать

И раз уж ты "заодно" определяешь переменные, то уж используй их, а не определяй второй раз в форме.

Ещё у тебя повторяются блоки


         $i=1;			
while($row = mysql_fetch_assoc($res))
{
$name = htmlspecialchars($row['name']);

echo $i++. ') <font color="red">' .$name. '</font><br>';
}

можно вынести в функцию, плюс можно переписать более читаемо:

for ($i = 1; $row = mysql_fetch_assoc($res); $i++)
{
$name = htmlspecialchars($row['name']);

echo $i. ') <font color="red">' .$name. '</font><br>';
}

цикл for именно для этого и предназначен

Спустя 1 час, 6 минут, 23 секунды (31.12.2009 - 02:24) Evilsoul написал(а):
Цитата (VolCh @ 30.12.2009 - 22:17)
Всегда проверяй, что возвращают функции, особенно при чтении  БД wink.gif

Типа того?:
// Выводим дату регистрации имени
if(isset($_GET['id']))
{
$res = mysql_query ("SELECT *
FROM `names`
WHERE `id` = '"
.intval($_GET['id'])."'")
or die ('Неудачный запрос smile.gif');

$row = mysql_fetch_assoc($res);

if($_GET['id'] != $row['id'])
echo '<h3>Не много ли вам хочется?</h3><hr size="1" width="100%">';

else
{
$name = htmlspecialchars($row['name']);

echo '<h3>Дата регистрации имени: <font color="red">' .$name. '</font></h3>' .$row['date']. '<hr size="1" width="100%">';
}
}

Цитата
При выводе списка, имхо, должна быть сортировка по дате, но это twin'у решать

Немного не согласен, мы используем TIMESTAMP и не изменяем его а он будет равен своему АЙДИ

Цитата
И раз уж ты "заодно" определяешь переменные, то уж используй их, а не определяй второй раз в форме.

Не корректно работает, добавляются слэши и нотисы ругаются. Подскажешь как корректно вывести без определения?

Цитата
Ещё у тебя повторяются блоки

Так и знал что кто-то забракует этот вариант, спасибо.

Спустя 47 секунд (31.12.2009 - 02:25) Evilsoul написал(а):
У нас подСВЕТку отключили ? dry.gif

Спустя 2 минуты, 3 секунды (31.12.2009 - 02:27) Evilsoul написал(а):
Боже мой, нажал редактировать а там меня заСПАНели blink.gif , лучше трогать не буду.

Спустя 48 минут, 10 секунд (31.12.2009 - 03:15) VolCh написал(а):
Цитата
Типа того?:

Типа этого
    if(isset($_GET['id']))
{
$res = mysql_query ("SELECT *
FROM `names`
WHERE `id` = '"
.intval($_GET['id'])."'")
or die ('Неудачный запрос smile.gif');

$row = mysql_fetch_assoc($res) or die ("Немного ли вы хотите?");
$name = htmlspecialchars($row['name']);
$date = htmlspecialchars($row['date']);

echo '<h3>Дата регистрации имени: <font color="red">' .$name. '</font></h3>' .$date. '<hr size="1" width="100%">';
}

Нужно проверять не пустой ли результат (в принципе в запрос еще можно добавить LIMIT 1, на случай изменения в структуре БД) и где дату выводишь тоже нужно htmlspecialchars использовать, БД доверять нельзя, если хакер с твоего ли, с чужого ли скрипта сделает SQL-injection из запишет в date (изменив его тип на varchar или text), скажем, JS код, то получим классический XSS.
Цитата
Немного не согласен, мы используем TIMESTAMP и не изменяем его а он будет равен своему АЙДИ

Во-первых, он не будет равен, поскольку это совершенно разные поля с разным типом и разными значениями по дефолту, во-вторых, id - это идентификатор, date - дата, в задании сказано "последнего", а не "с наибольшим идентификатором", хотя это твину решать smile.gif
Цитата
Не корректно работает, добавляются слэши и нотисы ругаются. Подскажешь как корректно вывести без определения?

При экранировании для запроса используй еще одну переменную, например, $search_name_escaped


_____________
Кто хочет, ищет возможности, кто не хочет - причины. /_ К. Маркс
Истенно велик тот человек который сумел овладеть своим временем. /_Гесиод VIII-VII вв. до Р. Х.
Медлительный непрерывно борится с бедами всю жизнь. /_Гесиод VIII-VII вв. до Р. Х.
Для того что бы увидеть радугу нужно пережить дождь.
Женщины: Хочется чего-то красного но синего.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.