Вот что у меня получилось:
.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 ('Неудачный запрос');
$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
form.html
config.php
index.php
2 вопроса при создании топа так и остаются открытыми.
Вот новый релиз.
.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 ('Неудачный запрос');
$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, где твой ответ делся
хорошо что хоть один раз прочесть успел немного замечаний запомнил.
Вообщем ВОТ:
.htaccess
config.php - без изменений
index.php
form.html

Вообщем ВОТ:
.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 ('Неудачный запрос');
$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. Вот это что за конструкшен:
а если будет
2. Не решил проблему со знаками % и _
3. Вот тут:
query по английски "запрос". А ты получаешь результат. Оно конечно без разницы, но слух режет. Принято как то уже $res или $result.
Ну а в целом прогресс.
Ищё маленько и эта пять.
Ну да ладно.
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.
Ну а в целом прогресс.

Спустя 39 минут, 6 секунд (29.12.2009 - 23:50) Evilsoul написал(а):
Точно!
вчера корпоратив был, мозги туговато работают
1) Вот так (для $add_name аналогично):
2) Подскажи, не могу сообразить.
3) Выбрал вариант $res


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

Спустя 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 написал(а):
Точно.

Спустя 1 минута, 44 секунды (30.12.2009 - 00:28) Evilsoul написал(а):
И так? мы закончили? 
А как же быть с пробелами все равно не могу сообразить, ведь они добавляются в БД

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

Спустя 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 написал(а):
Ага, спасибо. а с пробелами что делать?

Спустя 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 != ' ' так можно спастись только от одного пробела, не выходит

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

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 написал(а):
ап, виноват

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

А меня добавишь в список студентов?

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

Спустя 16 минут, 3 секунды (30.12.2009 - 02:23) Evilsoul написал(а):
Вот живой пример
Код:
.htaccess
config.php
index.php
form.html

Код:
.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);
}
// Заодно определим переменные (чтобы проще было) и уберём пробелы
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 ('Неудачный запрос');
$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 написал(а):
Побурчу немного:
А если запрос не выполнится? (сервер упадёт, или просто нет кодировки utf8)
Note: А в последнее время вообще использую mysql_set_charset
В мануале по PHP есть пример:
По-моему, куда читабельнее
И если насчёт условного оператора можно поспорить, то имя функции говорит само за себя, в отличии от mq. Хотя тут она вообще не нужна, add_name не может быть массивом
Вот этот кусок:
Замечания:
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. Не уверен, что редирект будет работать (вернее, уверен, что не будет
) в случае использования реврайта, лучше использовать REQUEST_URI, а не PHP_SELF - универсальней
Это блок переписал бы так:
Ну и так далее - продолжать?
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;
}
По-моему, куда читабельнее

Вот этот кусок:
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. Не уверен, что редирект будет работать (вернее, уверен, что не будет

Это блок переписал бы так:
// Добавление имени
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();
}
Ну и так далее - продолжать?

Спустя 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. Спасибо за науку, новичкам она как раз нужна

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%">';
}
Поддерживаю Твина, продолжай

Спустя 2 часа, 51 минута (30.12.2009 - 09:24) twin написал(а):
Теперь я бурчать буду.
Не совсем тут верно. Для того и функция, что бы не писать таких длинных портянок. А если 50 переменных? Вообще самым оптимальным является решение уничтожить последствия этой директивы раз и навсегда, что бы и не вспоминать больше нигде:
Я в своем курсе еще не дошел до этого момента.
Проверка на тип:
тут явное излишество. Откуда там взяться массиву? А проверка будет гоняться всегда. Ну даже если и сунет какой нибудь изобретатель туда массив, ошибка слогируется и все. Ничего страшного не произойдет.
По запросу. Уж если заморачиваться читабельностью, то нужно использовать SET:

Не совсем тут верно. Для того и функция, что бы не писать таких длинных портянок. А если 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);
}
Я в своем курсе еще не дошел до этого момента.

Проверка на тип:
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, исключение, своя ошибка, другая логика (никак не обрабатывать - грех

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


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


Цитата |
По запросу. Уж если заморачиваться читабельностью, то нужно использовать SET: |
Вот не нравится мне INSERT ... SET ..., уж больно на UPDATE ... SET ... похоже, хотя для кого-то это и плюс.
Спустя 4 часа, 37 минут, 5 секунд (30.12.2009 - 14:50) Evilsoul написал(а):
Цитата (VolCh @ 30.12.2009 - 07:13) |
а, во-вторых, повышает безопасность - при критических ошибках потенциальный злоумышленник не получит данных о структуре приложения и/или БД, да и вообще как-то спится спокойней, зная, что не один байт без твоего позволения к пользователю не уйдет) хотя для кого-то это и плюс. |
А если случайно пропустил проверку где нибудть (вот как у меня с кодировкой)? В этом случаи Твин рекомендует логировать ошибки в файл в дерективе с правами ни для кого.
Ну не нравится мне stripslashesDeep уж больно длинно, предлагаю kill_mq
Вот так теперь:
Чисто "косметика"
:
Ну не нравится мне 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);
}
// Заодно определим переменные (чтобы проще было) и уберём пробелы
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 = '';
Чисто "косметика"

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
config.php
index.php
form.html
.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);
}
// Заодно определим переменные (чтобы проще было) и уберём пробелы
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 ('Неудачный запрос');
$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
Всегда проверяй, что возвращают функции, особенно при чтении БД
При выводе списка, имхо, должна быть сортировка по дате, но это twin'у решать
И раз уж ты "заодно" определяешь переменные, то уж используй их, а не определяй второй раз в форме.
Ещё у тебя повторяются блоки
можно вынести в функцию, плюс можно переписать более читаемо:
цикл for именно для этого и предназначен

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

При выводе списка, имхо, должна быть сортировка по дате, но это 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) |
Всегда проверяй, что возвращают функции, особенно при чтении БД ![]() |
Типа того?:
// Выводим дату регистрации имени
if(isset($_GET['id']))
{
$res = mysql_query ("SELECT *
FROM `names`
WHERE `id` = '".intval($_GET['id'])."'")
or die ('Неудачный запрос');
$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 написал(а):
У нас подСВЕТку отключили ?

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

Спустя 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 - дата, в задании сказано "последнего", а не "с наибольшим идентификатором", хотя это твину решать

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