PDA

Просмотр полной версии : Создаем простой сайт на php


Isis
20.03.2007, 16:11
Как создать простой сайт на php с использованием MySql базы данных?!
Я расскажу вам :)

Итак начнем...........

Начало

Для начала найдем хостинг с php и mysql (Лучше локалхост:) )

Двигаемся дальше...........

Создание БД

Заходим в mysql...............Создаем бд с именем 'site'
Пишем sql код:

CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(30) collate utf8_unicode_ci NOT NULL,
`pass` tinytext collate utf8_unicode_ci NOT NULL,
`email` tinytext collate utf8_unicode_ci NOT NULL,
`icq` int(9) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


config.php

Создаём файл config.php - здесь поместим код соединения к бд, логин, таблицу, пасс и прочее

Например:

<?php
// Адрес сервера MySQL
$dbhost = "localhost";
// Имя пользователя базы данных
$dbuser = "root";
// и его пароль
$dbpass = "password";
// Имя базы данных, на хостинге или локальной машине
$dbname = "site";

$db = @mysql_connect($dbhost, $dbuser, $dbpass);
if (!$db) {
exit ("<P>Сервер базы данных не доступен</P>" );
}
if (!@mysql_select_db($dbname, $db)) {
exit( "<P>База данных $dbname не доступна</P>" );
}
?>

Isis
20.03.2007, 16:13
index.php

Теперь создаём главную страницу сайта, а именно index.php.....


<?php
//Начинаем сессию
session_start();
?>
<html>
<head><title>Главная страница</title></head>
<body>
<?php
if(!session_is_registered('name')) {
echo "<a href='./register.php' title='Регистрация'>Регистрация</a><br /><hr />
<a href='./enter.php' title='Войти'>Войти</a><br /><hr />";
} else {
echo "Привет $_SESSION['name'] <br /><br /><a href='./enter.php?do=logout' title='Выход'>Выход</a><br /><hr />";
}
<a href='./users.php' title='Зарегистрированные пользователи'>Зарегистрированные пользователи</a><br />
</body>
</html>



register.php

Создаем страницу регистрации.....

Давайте сделаем обязательные поля :
name, pass, email
и простое поле icq .......


<html>
<head><title>Регистрация</title></head>
<body>
<form method="post">
<table>
<tr><td>Имя*:</td></tr>
<tr><td><input type="text" name="name" /></td></tr>
<tr><td>Пароль*:<br /><input type="password" name="pass" /></td><td style="width: 20;">&nbsp;</td>
<td>Повторите пароль*:<br /><input type="password" name="repass" /></td></tr>
<tr><td>E-mail*:</td></tr>
<tr><td><input type="text" name="email" /></td></tr>
<tr><td>Icq:</td></tr>
<tr><td><input type=text name="icq" maxlength="9" /></td></tr>
<tr><td><input type="submit" title="Регистрация" name="reg" value="Регистрация" /></td></tr>
</table>
</form>
<?php
if($reg) {
//Защищаемся от скули
if (!get_magic_quotes_gpc()) {
$_POST['name'] = mysql_escape_string($_POST['name']);
$_POST['pass'] = mysql_escape_string($_POST['pass']);
$_POST['repass'] = mysql_escape_string($_POST['repass']);
$_POST['email'] = mysql_escape_string($_POST['email']);
$_POST['icq'] = mysql_escape_string($_POST['icq']);
}
// Проверяем, правильно ли заполнены обязательные поля
if(empty($_POST['name']) && !isset($_POST['name']))
exit ("Заполните поле 'Имя' ");
if(empty($_POST['pass']) && !isset($_POST['pass']))
exit("Заполните поле 'Пароль' ");
if(empty($_POST['repass']) && !isset($_POST['repass']))
exit("Заполните поле 'Повторите пароль' ");
if($_POST['pass'] != $_POST['repass'])
exit("Пароли не совпадают");
//Проверяем введеные данные в форму
if($_POST['icq']) {
if(!is_numeric($_POST['icq']))
exit("ICQ состоит из цифр :)");
if( strlen($_POST['icq']) < 5 || strlen($_POST['icq']) > 9)
exit("Поле 'ICQ' должно содержать от 5 до 9 символов");
}
// Проверяем email на соответствие
if($_POST['email']) {
if(!preg_match("|^[-0-9a-z_]+@[-0-9a-z_]+\.[a-z]{2,6}$|i", $_POST['email']))
exit("E-mail должен быть в формате 'billy@micrsoft.com' ");
}
//================================================== ========================//
// Устанавливаем соединение с базой данных
require_once("config.php");
// Проверяем, не было ли переданное имя зарегистрировано ранее
$query = "SELECT COUNT(*) FROM `users` WHERE name = '$_POST[name]'";
$result = mysql_query($query);
if(!$result) exit("Ошибка - ".mysql_error());
if(mysql_num_rows($result) > 0) exit("Такое имя уже есть");
//Выполняем sql запрос на регистрацию юзера
$_POST['pass'] = md5($_POST['pass']);
$query = "INSERT INTO users VALUES(NULL, '$_POST[name]', '$_POST[pass]', '$_POST[email]', '$_POST[icq]')";
//Если регистрация прошла успешно, то перенаправляем на главную страницу
if(mysql_query($query)) {
echo "Регистрация успешно завершена";
header("Location: index.php");
} else {
exit("Ошибка при добавлении данных - ".mysql_error());
}
}

Isis
20.03.2007, 16:14
enter.php

В этом файле разместим код авторизации пользователя

<?php
session_start();
?>
<form method='post'>
Имя : <br /><input type='text' name='name' value='$_SESSION[name]' /><br /><br />
Пароль : <br /><input type='password' name='password' value='$_SESSION[password]' /><br /><br />
<input type='submit' value='Войти' title='Войти' />
</form>
<?php
//Если поля не пустые, производим попытку входа
if($_POST['name'] && $_POST['password']) {
// Устанавливаем соединение с базой данных
require_once("config.php");
//Защищаемся от скули )
if (!get_magic_quotes_gpc()) {
$_POST['name'] = mysql_escape_string($_POST['name']);
$_POST['password'] = mysql_escape_string($_POST['password']);
} else {
$_POST['name'] = addslashes($_POST['name']);
$_POST['password'] = addslashes($_POST['password']);
}
//Заходим
$_POST['password'] = md5($_POST['password']);
$query = "SELECT COUNT(*) FROM users WHERE name = '$_POST[name]' AND pass = '$_POST[password]'";
$autnme = mysql_query($query);
if(!$autnme) exit("Ошибка");
// Получаем число записей
if(mysql_result($autnme, 0) > 0)
define("TOTAL", 1);
}
if(defined("TOTAL")) {
$_SESSION['name'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
}
// Если посетитель "вошел" - перенаправляем его
if(isset($_SESSION['name']) && isset($_SESSION['password'])) {
header("Location: ../index.php");
} else {
echo("Неверный пароль");
header("Location: ../index.php");
}
//Если юзер выходит - удаляем сессию
if($_GET['do'] == 'logout'){
session_destroy();
header("Location: ../index.php");
}


users.php

Создаем файл users.php, где будут выводиться уже зарегистрированные пользователи...

<html>
<head><title>Пользователи</title></head>
<body>
// Устанавливаем соединение с базой данных
require_once("config.php");
$query = "SELECT * FROM `users` ORDER BY `id` ASC";
$result = mysql_query($query);
echo "<table style='border: 0px;'><tr>
<td style='width: 100px; text-align: center;' class='td'>Имя</td>
<td style='width: 100px; text-align: center;' class='td'>ICQ</td>
<td style='width: 150px; text-align: center;' class='td'>E-mail</td></tr>";

while($row = mysql_fetch_assoc($result)) {
echo "<tr><td class='td' style='width: 100px;'>&nbsp;<font style='font-weight: bold;'>$row[name]</font></td>";
if($row['icq'] != '0'){
echo "<td style='text-align: center;' class='td'><a href='http://www.icq.com/$row[icq]' target='_blank' title='Icq $row[name] $row[icq]'><font style='color: green; font-weight: bold;'>$row[icq]</font></a></td>";
} else {
echo "<td style='text-align: center;' class='td'><font style='color: red; font-weight: bold;'>---</font></td>";
}
echo "<td style='text-align: left;' class='td'><a href='mailto:$row[email]' title='Отправить e-mail $row[name]'>$row[email]</a></td>";
}
echo "</table>";


Ну что же.......To be continued

Talisman
20.03.2007, 16:26
$query = "SELECT COUNT(*) FROM users WHERE name = '$_POST[name]' AND pass = '$_POST[password]'"; инъекция

Talisman
20.03.2007, 16:27
ЗЫ код до боли знаком.. щас посмотрю....

Isis
20.03.2007, 16:28
Если есть дырки, пишите сразу как заковырять...
Спасибо)

GreenBear
20.03.2007, 16:28
if (!$db)
{
exit ("<P>Сервер базы данных не доступен</P>" );
}
if (!@mysql_select_db($dbname, $db))
{
exit( "<P>База данных не доступна</P>" );
}


хм, не проще ли or die("<P>Сервер базы данных не доступен</P>")?


if(!empty($_POST['name']) && !empty($_POST['password']))

не понимаю зачем использовать empty, когда можно и без него.

if($_POST['name'] && $_POST['password'])



if(isset($_SESSION['name']) && isset($_SESSION['password'])) {
echo "<html><head>
<meta HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</head><body>";
}

зачем? header("Location: ..") быстрее и проще.


if(mysql_result($autnme, 0) > 0)
define("TOTAL", 1);
}
if(defined("TOTAL")) {
$_SESSION['name'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
}

боже... а mysql_num_rows на что?

if(mysql_num_rows($result){
//
}



$numrows = mysql_num_rows($result);

хм... а не проще ли

while($row = mysql_fetch_assoc($result)){
//
}



а вообще я не вижу в статье смысла.. если кто знает пхп, для него это сделать не проблема. а те, кто его недостаточно знает и с этой статьей мало что сможет сделать)
+8

GreenBear
20.03.2007, 16:29
Если есть дырки, пишите сразу как заковырять...
просто это автоматом надо делать, все данные которые идут в БД делать в mysql_escape_string()

Talisman
20.03.2007, 16:32
да) нашол сорец) ISBN 5-94157-837-7
"Головоломк на пшп для хакера", Максим Кузнецов, Игорь Симдянов.
2 nerezus у них бред пожестче, чем у фленова))) учат уходить от инъекций, и в своем коде дают их 10-20 :)))
ЗЫ плюс заработал, т.к. хотябы переработал их сорец)

GreenBear
20.03.2007, 16:34
Вообще, я хоть и не профи в пхп, но даже для меня код извращенский.

Isis
20.03.2007, 16:34
GreenBear, спасибо, приду домой, исправлю и приму к сердцу ваши советы))

Sn@k3
20.03.2007, 17:55
" Создаем простой сайт на php " и тут же в глаза бросается код мускуля))

x-treem
20.03.2007, 19:36
боян... зачем учить делать сайт если есть много учебников по php.

так - же море цмс-ок, в которых по шагам расписано как их установить.

сугубо мое личное мнение

gormet
20.03.2007, 21:54
боян... зачем учить делать сайт если есть много учебников по php.

так - же море цмс-ок, в которых по шагам расписано как их установить.

сугубо мое личное мнение
хоть я тоже только учусь кодингу на ПХП но знаю - самая лучшая ЦМС-ка - это самописная! :p

GreenBear
20.03.2007, 22:08
так - же море цмс-ок, в которых по шагам расписано как их установить.
а те из ниоткуда взялись ? статья нормальная для общего ознакомления как, но код идет скорее во вред =\

Isis
21.03.2007, 01:18
Первый пост обновлен, исправлены баги и переделан код пкрасивее )))
Спасибо зеленому медвежонку :)

KPOT_f!nd
21.03.2007, 04:12
насчет кодов =\ Каждый пишит сам и сам делает ошибки =\ тебе не надо было расписывать php-код, а так поверхностоно описать скрипт, а не полность выкладывать =\

Isis
21.03.2007, 04:19
насчет кодов =\ Каждый пишит сам и сам делает ошибки =\ тебе не надо было расписывать php-код, а так поверхностоно описать скрипт, а не полность выкладывать =\
Когда я учил пхп, я очень хотел найти хорошее объяснение тому что пишут....
Вот для таких как я был , я и написал))

blaga
21.03.2007, 09:21
я что то не понял, а сайт то твой только и умеет что зарегать пользователя, а потом вывести список их? А где новости? статьи? Гостевая? На сайт тут явно НЕ тянет.
И еще, у тебя поначалу совсем нет никакого плана, ничего нет. Чтобы понять что твой сайт умеет пришлось всю статью читать. А был бы план сразу все видно было бы... Короче, не очень твоя статья. Не понравилось.

Isis
21.03.2007, 09:27
Вроде как написано "To be continued" .........
И вроде тема "простой сайт"...
Посже напишу как сделать новости и комментарии.....

Darkweider
21.03.2007, 10:43
Да ладно нормальная тема... Молодец. Только вот дыры залатать надо... А след. статья будет , когда допишешь "Латаем дыры на собственно написанном сайте на рнр" . Помоему актуально=) И показать можно наглядно на одном примере все уязвимости и ошибки=)

p-range
21.03.2007, 12:40
статья не понравилась. имхо, это можно вычитать в любом учебнике php. тем более если пишешь статью, заботься о том чтобы код был правильный и не содержал уязвимостей.
имхо, ты показываешь "дурной" стиль программирования на php. тоесть писал по принципу "лишь бы было", а о том что многие учатся на таких скриптах, ты видимо, не подумал. Отсюда и появляются горе-кодеры, не способные правильно защищать скрипты.

З.Ы. понравилась подпись у автора :D

Isis
21.03.2007, 14:31
статья не понравилась. имхо, это можно вычитать в любом учебнике php. тем более если пишешь статью, заботься о том чтобы код был правильный и не содержал уязвимостей.
имхо, ты показываешь "дурной" стиль программирования на php. тоесть писал по принципу "лишь бы было", а о том что многие учатся на таких скриптах, ты видимо, не подумал. Отсюда и появляются горе-кодеры, не способные правильно защищать скрипты.

З.Ы. понравилась подпись у автора :D

Мдее...мне кажеться ты прочитал посты и все, а сам код не смотрел....Все дыры залатал еще вчера....всмотрись в код))

Зы: я знаю что подпись рулит)

p-range
21.03.2007, 14:53
Мдее...мне кажеться ты прочитал посты и все, а сам код не смотрел....Все дыры залатал еще вчера....всмотрись в код))
вот именно что код сначала был бажным. я смотрел его.

guest3297
21.03.2007, 14:54
Залей куда нить установленный движок.
Выложи архив со скриптами.

Darkweider
21.03.2007, 15:06
Зря залатал дыры=) Могбы продолжить и показать наглядно для нуубов какие дыры существуют сделать большой обзор уязвимостей... Да ксати залей куда нибудь свой движок, а мы потренируемся=)

Isis
21.03.2007, 15:29
Как хостинг сделают так залью....ща сайт не пашет)

dUklUs
21.03.2007, 16:17
ПаМаГиТе, такой вопросег, вот допустим я зарегал сайт на халявном хостинге,жино и т.д. как мне этот движок пихнуть на такой сайт, а точне как сделть таблицу, объясните плиз, допустим я файлы кину на хост а дальше че делать ненаю(((
т.е. как создать мускуль этот самый, про ктороый в начел говориться?(

ice1k
21.03.2007, 16:32
ПаМаГиТе, такой вопросег, вот допустим я зарегал сайт на халявном хостинге,жино и т.д. как мне этот движок пихнуть на такой сайт, а точне как сделть таблицу, объясните плиз, допустим я файлы кину на хост а дальше че делать ненаю(((
т.е. как создать мускуль этот самый, про ктороый в начел говориться?(
раз уж ты говоришь про JINO, то там в админке твоей будет что-то типа - "Управление MySQL" - вот там и создашь таблицы...

bxN5
21.03.2007, 19:08
Там вроде пхпмайадмин,вот создаеш базу->создаеш таблицу->делаеш в таблице мусукль запрос

Ponchik
21.03.2007, 19:16
...
echo("Неверный пароль");
header("Location: ../index.php");
...
echo "Регистрация успешно завершена";
header("Location: index.php");
...
Мде...
1)header нельзя юзать после вывода инфы!
2)если ты и надеялся на то, что это булет работать, то юзверь никогда непоймёт чем он ошибся, он никак не увидит надпись "Неверный пароль" или "Регистрация успешно завершена" его просто перекинет (так былобы по твоей логики)
И вобще header возмущает, это делает невозможным использование дизайна, а просто белый сайт это не тема... И exit тоже, половина дизайна загрузится, потом exit и сё, приехали... ИМХО не катит

GreenBear
21.03.2007, 19:19
И вобще header возмущает, это делает невозможным использование дизайна, а просто белый сайт это не тема... И exit тоже, половина
мне проще с хедером, т.к заимел привычку выводить все только после полной обработки скрипта ) тут уже у кого какой стиль.

Talisman
21.03.2007, 19:31
мне проще с хедером, т.к заимел привычку выводить все только после полной обработки скрипта ) тут уже у кого какой стиль.
Правильный стиль) т.к. очень много сайтов и инъекций дохнут после вывода интересной инфы (3-4 раза видел).
ЗЫ создается впечатление, что чем дибильнее статья, тем больше на нее комментариев )

Ponchik
21.03.2007, 22:37
Ради интереса решил запустить index.php
1)Не знакрыт РНР код ?>
2)Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in index.php on line 13

Убрал 13 строку...

3)Parse error: syntax error, unexpected '<' in index.php on line 15

Неможет HTML код выполнить :) Ну это я не там PHP закрыл
to topicstarter ты ваще скрипты испытовал?

register.php
1)Ты проверяешь if($reg) надо if($_POST[reg]) :)
2)Форма для реги всёвремя выводится, надо добавить else
3)Какой ник не напиши пишет Такое имя уже есть - вместо COUNT(*) надо юзать просто * :rolleyes:
4)Как я уже говорил ошибка с header'ом Warning: Cannot modify header information - headers already sent...
enter.php
1)Закрыл PHP, забыл об этом и попёр в HTML :D
...
?>
<form method='post'>
Имя : <br /><input type='text' name='name' value='$_SESSION[name]' /><br /><br />
Пароль : <br /><input type='password' name='password' value='$_SESSION[password]' /><br /><br />
<input type='submit' value='Войти' title='Войти' />
</form>
<?php
...
2)Сразу при входе на страницу выдаёт ошибку Warning: Cannot modify header information - headers already sent...
3)Даже если юзверь зологинен выдаёт форуму для логина...
4)Код вобще поломан, лишняя } а в конце не хватает } :rolleyes:
users.php
Не закрыт... Да и не открыт РНР код :D

Вот всё что нащёл, есть тама ешё COUNT(*)...
Вобще незнаю как могло прийти в голову юзать count! Он возвращает одну строку с кол-вом записей в таблице... Тоесть если 0 записей, он вернёт 1 строку с значением 0 если их 9999 count вернёт 1 строку с значением 9999... А mysql_num_rows считает чколько в ответе строк, их всегда будет 1 :p
Надо юзать * или mysql_result

p-range
21.03.2007, 23:24
мде... собственно о чем я и говорил... \=
чем дибильнее статья, тем больше на нее комментариев )
эт точно ;)

Isis
22.03.2007, 17:20
Гы, посже исправлю скрипты и скину ссылку на мой сайт с двигом соответственно :)
Не таким легким конечно, но.....

Isis
23.03.2007, 01:03
Как обещал....
Вот мой сайт с почти такими же скриптами Cyber.Projec.FlIsis (http://damagelab.org/flisis/)
=)

p-range
23.03.2007, 12:57
http://www.damagelab.org/flisis/downloads.php
с кодировкой что-то не то

Isis
23.03.2007, 13:18
Албаниш :)
Сейчас исправлю и чуть посже напишу статью о том как сделать новости и комментарии

Talisman
23.03.2007, 18:27
мля, убери мыла с сайта) тупо!

Isis
23.03.2007, 18:46
Многие говорят убрать...ладно посже чуть уберу