|
|
|
| Всегда ленился решить, но все таки поборол себя.
Ошибся с таблицей, дамп выкладываю.
<?php
// структура таблицы
/*
CREATE TABLE `guests`
(
`id` INT( 11 ) NOT NULL AUTO_INCREMENT,
`name` TINYTEXT NOT NULL,
`visits` INT(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
*/
// уровень ошибок
Error_Reporting(E_ALL & ~E_NOTICE);
// функция восстановления испорченных входных параметров
function rec_stripslashes($mixed)
{
if(is_array($mixed))
{
$mixed=array_map("rec_stripslashes",$mixed);
foreach($mixed as $key=>$value)
{
$arr=array();
$keynew=stripslashes($key);
if($keynew!==$key)
{
$mixed[$keynew]=$mixed[$key];
unset($mixed[$key]);
}
$arr=$mixed;
}
return $mixed;
}
else
{
return stripslashes($mixed);
}
}
// если вдруг магические кавычки включены
if(get_magic_quotes_gpc())
{
$_GET=rec_stripslashes($_GET);
$_POST=rec_stripslashes($_POST);
$_COOKIE=rec_stripslashes($_COOKIE);
}
// настройки MySQL
$mshost="localhost"; // Хост mysql
$msuser="root"; // Имя пользователя mysql
$mspassword=""; // Пароль mysql
$msname=""; // Имя базы данных mysql
// подключение к базе
$msconnect=@mysql_connect($mshost,$msuser,$mspassword);
if(!$msconnect)exit("Идет перезагрузка сервера базы данных, работа сайта возобновиться через 5 - 10 минут.");
$select=@mysql_select_db($msname,$msconnect);
if(!$select)exit("Идет перезагрузка сервера базы данных, работа сайта возобновиться через 5 - 10 минут.");
mysql_query ("SET NAMES `cp1251`");
function menu($name)
{
?>
<table width="100%" align="center">
<tr>
<td width="50%" align="center">
<form action="" method="post">
<input type="text" name="reg">
<input type="submit" value="Зарегистрироваться">
</form>
</td>
<td width="50%" align="center">
<form action="" method="get">
<input type="text" name="search" value="<?php echo $name;?>">
<input type="submit" value="Найти">
</form>
</td>
</tr>
</table>
<?php
}
// функция вывода всех зарегистрированных
function guests()
{
$sql_g="SELECT * FROM guests";
$res_g=mysql_query($sql_g) or die("Error 0: ".mysql_error());
if(mysql_num_rows($res_g)>0)
{
?>
<table width="50%" align="center">
<tr><td colspan="4" align="center">Нас уже посетили:<br><br></td></tr>
<tr>
<td width="20" align="center">№</td>
<td width="50" align="center">Имя</td>
<td width="20" align="center">Визит</td>
<td width="50" align="center">?</td>
<tr>
<?php
while($str=mysql_fetch_array($res_g))
{
echo "<tr><td width=\"20\" align=\"center\">".$str['id']."</td>";
echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
echo "<td width=\"20\" align=\"center\">".$str['visits']."</td>";
echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
echo "</tr>";
}
echo "</table>";
}
}
// регистрация
if($_POST)
{
// проверка на пустое поле
$name=trim($_POST['reg']);
if(!empty($name))
{
// если слишком длинное имя
$name=substr($name, 0, 255);
$sql="SELECT * FROM guests WHERE name='".mysql_real_escape_string($name)."'";
$res=mysql_query($sql) or die("Error 1: ".mysql_error());
if(mysql_num_rows($res)==0)
{
$sql="INSERT INTO guests VALUES (0, '".mysql_real_escape_string($name)."', 1)";
$res=mysql_query($sql) or die("Error 2: ".mysql_error());
}
else
{
$sql="UPDATE guests SET visits = visits + 1 WHERE name='".mysql_real_escape_string($name)."'";
$res=mysql_query($sql) or die("Error 3: ".mysql_error());
}
header("location: ".$_SERVER['PHP_SELF']);exit;
}
else
{
header("location: ".$_SERVER['PHP_SELF']);exit;
}
}
elseif($_GET)
{
// поиск
if(isset($_GET['search']))
{
// проверка на пустое поле
$search=trim($_GET['search']);
if(!empty($search))
{
$search=substr($search, 0, 255);
$sql="SELECT * FROM guests WHERE name LIKE '%".mysql_real_escape_string($search)."%'";
$res=mysql_query($sql) or die("Error 4: ".mysql_error());
echo menu($search);
if(mysql_num_rows($res)>0)
{
echo "<hr><center>Результат поиска:<br>";
while($str=mysql_fetch_array($res))
{
echo htmlspecialchars($str['name'])."<br>";
}
echo "</center><hr>";
echo guests();
}
else
{
echo "<hr><center><b>".htmlspecialchars($search)."</b> к нам не заходил</center><hr>";
echo guests();
}
}
else
{
header("location: ".$_SERVER['PHP_SELF']);exit;
}
}
elseif(isset($_GET['delete']))
{
// проверка на пустое поле
$delete=trim($_GET['delete']);
if(!empty($delete))
{
$delete=substr($delete, 0, 255);
$sql="DELETE FROM guests WHERE name='".mysql_real_escape_string($delete)."'";
$res=mysql_query($sql) or die("Error 5: ".mysql_error());
header("location: ".$_SERVER['PHP_SELF']);exit;
}
}
}
else
{
$name="";
echo menu($name).guests();
}
?>
|
| |
|
|
|
|
|
|
|
для: Рома
(05.10.2009 в 02:46)
| | И что, никто не нашел ошибку? | |
|
|
|
|
|
|
|
для: Рома
(07.10.2009 в 23:01)
| | В предыдущих решениях описаны контрпримеры, на которых тестировалось (неудачно, к сожаленеию) большинство ответов.
Приветствие не реализовано.
Поисковая форма в строке
<input type="text" name="search" value="<?php echo $name;?>">
также будет разрушена.
Аргументы в ссылках
echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
тоже не кодируются.
Предупреждающий alert не реализован...
Как-то об ошибках речь даже и не идет... | |
|
|
|
|
|
|
|
для: Trianon
(07.10.2009 в 23:47)
| | <input type="text" name="search" value="<?php echo $name;?>">
также будет разрушена.
На этом и провалился. <a href="http://mail.ru">mail</a> сломало работу скрипта.
>Приветствие не реализовано.
Мне не пришло в голову как реализовать приветствие, с учетом защиты от F5. разве что сессии.
>Аргументы в ссылках
> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
>тоже не кодируются.
А разве это нарушает работу скрипта? или просто невыполненный пункт решения задачи.
>Предупреждающий alert не реализован...
onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\" =- это и есть оно.
Спасибо за комментарии, починю. | |
|
|
|
|
|
|
|
для: Рома
(08.10.2009 в 00:01)
| | >>Аргументы в ссылках
>> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?search=".htmlspecialchars($str['name'])."\">".htmlspecialchars($str['name'])."</a></td>";
>> echo "<td width=\"50\" align=\"center\"><a href=\"".$_SERVER['PHP_SELF']."?delete=".htmlspecialchars($str['name'])."\" onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\">Удалить</a></td>";
>>тоже не кодируются.
>
>А разве это нарушает работу скрипта?
А попробуйте имя с # внутри.
Нарушает, согласованную работу браузера и сервера. Возможны XSS и т.п. вещи.
>
>>Предупреждающий alert не реализован...
>
>onclick=\"return confirm ('Точно удалить пользователя ".htmlspecialchars($str['name'])."?')\" =- это и есть оно.
>
Да, пардон, попытка реализовать была.
(Это к вопросу о читабельности. Скроллить текст вправо мне в голову не пришло. )
Но, увы, неудачная. Тоже из-за отсутствия кодирования (при чем на двух уровнях, браузера и JS) | |
|
|
|
|
|
|
|
для: Trianon
(08.10.2009 в 00:31)
| | >А попробуйте имя с # внутри.
Вот именно поэтому я и считаю нецелесообразным ставить ссылку не на id. Но как частный случай, разобраться придется, куда ж деваться. | |
|
|
|
|
|
|
|
для: Рома
(08.10.2009 в 01:01)
| | Вы ставите проблему с ног на голову.
Ваша задача (уж коль взялись её решать) - научиться передавать через языковые слои программных интерфейсов, задействованных в скрипте, любые данные. Абсолютно любые.
А Вы говорите, считаю нецелессообразным передавать любые данные, потому что проще число.
Число проще.
Но тогда целессообразно за задачу не браться. Опять же - потому что так проще.
никто не обещал, что будет легко :)
UPD. с другой стороны, научившись писать код честно (не полагаясь, что браузер и так проглотит) потом как-то легче и спокойнее становится. :) | |
|
|
|