Записи в рубрике PHP

Шифрование важных данных

Сегодня мы разберем, как шифровать важные данные на примере авторизации.
Будем использовать технологии PHP и MD5.
В качестве важных данных будет пароль для доступа к защищенной странице.

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

$login = "design-lessons.com.ua";
$password = "123456789";

Теперь нам нужно зашифровать пароль и вставить регистрационные данные (логин и зашифрованный пароль) в таблицу.

$hash = md5($password);
mysql_query ("INSERT INTO table (login, password) VALUES ('$login', '$hash')");

Внимание! Предварительно нужно создать таблицу, создать поля login и password.

Если вы все сделали правильно, то регистрационные данные успешно добавлены в базу.

Это была так называемая регистрация, в что делать когда пользователь захочет авторизироваться? Все просто, создаем с помощью MD5 хеш введенного пароля, и если он совпадает с хешем пароля которые находиться в базе, то разрешить доступ к защищенной странице.

Давайте по порядку, сначала получаем данные (логин и пароль):

$login = $_POST["login"];
$password = $_POST["password"];

Запрашиваем по указанному логину данные:

$query = mysql_query ("SELECT * FROM table WHERE login='$login'");
$row = mysql_fetch_array ($query);

Выполняем проверку, сходятся ли пароли (пароль введенный пользователем на ходу генерируем в хеш MD5):

if ($row["password"] == md5($password)) {
echo "Вход успешно выполнен";
}

Вот и все, теперь вы знаете как шифровать важные данные.

Вы зададите вопрос: Зачем это нужно, лишний геморой?
Представьте себе ситуацию, злоумышленник получил доступ к вашей базе данных, он захочет посмотреть пароли пользователей, захочет войти в аккаунт одного из пользователей и собственно войдет и сделает все что ему нужно.

А теперь представьте себе ту же ситуацию, только пароли у вас в базе защищены. Злоумышленник захочет посмотреть пароли, смотрит, а там не пароли, а какой-то непонятный набор символов. Соответственно вы защитили свою базу данных.

Умеешь собирать компьютеры? Работа сборщик ПК специально для тебя.

Оптимизация количества файлов

Сегодня мы поговорим об оптимизации, а точнее уменьшении количества файлов скрипта php.
Для примера возьмем исходные файлы из урока про Обновление данных MYSQL

Как вы видите, там 3 файла (не считая файл подключения к базу данных). Все они отвечают за выполнение одной и той же задачи, а именно, за обновление данных в базе.

В связи с большим количеством файлов, для выполнения такой простой задачи, было решено написать урок про Оптимизацию количества файлов.

Итак, давайте откроем файл update.php и удалим из него весь код.

Один большой общий код:

include ("db.php");
if (isset($_GET["id"])) {$id = $_GET["id"];}
if (isset($_GET["mode"])) {$mode = $_GET["mode"];}
 
if ($mode == '')
{
 
$query = mysql_query ("SELECT id, title FROM news");
 
while ($row = mysql_fetch_array ($query))
{
printf ("<a href=\"update.php?mode=edit&id=%s\">%s</a><br>", $row["id"], $row["title"]);
}
 
}
 
if ($mode == 'edit' and isset($id))
{ 
 
$query = mysql_query ("SELECT * FROM news WHERE id='$id'");
$row = mysql_fetch_array ($query);
 
echo "<form method=\"POST\" action=\"update.php?mode=update&id=".$row["id"]."\">
Название новости:<br>  
<input type=\"text\" name=\"title\" value=\"".$row['title']."\"><br>
Текст новости:<br>
<textarea name=\"text\" cols=\"20\" rows=\"5\">".$row['text']."</textarea><br>
<input type=\"submit\" value=\"Добавить\">
</form>";
 
}
 
if ($mode == 'update' and isset($id))
{
 
if (isset($_POST["title"])) {$title = $_POST["title"];}
if (isset($_POST["text"])) {$text = $_POST["text"];}
 
$title = htmlspecialchars($title);
$text = htmlspecialchars($text);
$title = stripslashes($title);
$text = stripslashes($text);
 
$query = mysql_query ("UPDATE news SET title='$title', text='$text' WHERE id='$id'");
 
if ($query)
{
echo "Новость успешно обновлена";
}
else
{
echo "Ошибка обновления новости";
}
 
}

Что мы сделали? Подключили базу данных. Проверили $id, $mode на существование. Если $mode пуста, вывести в цикле список всех новостей. Если $mode равная edit и $id существует, вывести форму для редактирования данных.
Если $mode равная update и существует $id, Обновить данных в базе.

Удаления данных MYSQL

Продолжаем серию уроков по Взаимодействию PHP и MYSQL. Итак, давайте начнем урок по удалению данных из базы MYSQL. По прежнему используйте файл db.php и базу которую мы создавали в первом уроке.

1. Создайте файл delete.php. Он нужен для вывода новостей которые нужно удалить.

Скопируйте код:

include ("db.php");
 
$query = mysql_query ("SELECT id, title FROM news");
 
while ($row = mysql_fetch_array ($query))
{
printf ("<a href=\"handler.php?id=%s\">%s</a><br>", $row["id"], $row["title"]);
}

Что мы сделали? Подключили файл db.php. Выполнили запрос на вывод новостей. Начали цикл, с условием, выполнять пока не закончатся записи в таблице. Вывели название новости и ссылку на файл отвечающий за удаление.

2. Создайте файл handler.php. Он нужен для удаления новости.

Скопируйте код:

include ("db.php");
 
if (isset($_GET["id"])) {$id = $_GET["id"];}
 
$query = mysql_query ("DELETE FROM news WHERE id='$id'");
 
if ($query)
{
echo "Новость успешно удалена";
}
else
{
echo "Ошибка удаления новости";
}

Что мы сделали? Подключили файл db.php. Проверили, существует ли глобальная переменная id, если существует, то занести ее значение в переменную id. Выполнили запрос на удаление новости из базы. Если запрос выполнен успешно, то вывеси соответствующие сообщение, если нет, вывести негативный ответ.

Исходные файлы

Обновление данных MYSQL

Итак, продолжаем серию уроков по Взаимодействию PHP и MYSQL. И сейчас речь пойдет об обновлении данных в базе. Тема – очень легкая, и если вы освоили предыдущие уроки, то вам не составит труда работать с этим. Вы, как и прежде можете использовать файлы и базу данных со второго урока. Скопируйте файл db.php, дабы не писать его дважды.

1. Создайте файл update.php. Он будет отвечать за вывод всех названий новостей. Это нужно для того, чтобы выбрать какую именно новость нужно обновить.

Скопируйте код:

include ("db.php");
 
$query = mysql_query ("SELECT id, title FROM news");
 
while ($row = mysql_fetch_array ($query))
{
printf ("<a href=\"form.php?id=%s\">%s</a><br>", $row["id"], $row["title"]);
}

Что мы сделали? Подключили файл db.php. Выполнили запрос на вывод идентификатора и названия новости. Начали цикл, с условием, выполнять пока не закончатся новости. Ну, и вывели название новости, с ссылкой на файл который отвечает за обновление.

2. Создайте файл form.php. Он нужен для редактирования новости.

Скопируйте код:

include ("db.php");
 
if (isset($_GET["id"])) {$id = $_GET["id"];}
 
$query = mysql_query ("SELECT * FROM news WHERE id='$id'");
$row = mysql_fetch_array ($query);
 
echo "<form method=\"POST\" action=\"handler.php\">
<input name=\"id\" type=\"hidden\" value=\"".$row["id"]."\" />
Название новости:<br>  
<input type=\"text\" name=\"title\" value=\"".$row['title']."\"><br>
Текст новости:<br>
<textarea name=\"text\" cols=\"20\" rows=\"5\">".$row['text']."</textarea><br>
<input type=\"submit\" value=\"Добавить\">
</form>";

Что мы сделали? Подключили файл db.php. Проверили, существует ли глобальная переменная id, если да, то записать ее значение в переменную id. Выполнили запрос на вывод новости которую нужно обновить. Вывели форму для обновления новости.

3. Создайте файл handler.php. Он нужен для непосредственного обновления новости в базе.

Скопируйте код:

include ("db.php");
 
if (isset($_POST["id"])) {$id = $_POST["id"];}
if (isset($_POST["title"])) {$title = $_POST["title"];}
if (isset($_POST["text"])) {$text = $_POST["text"];}
 
$title = htmlspecialchars($title);
$text = htmlspecialchars($text);
$title = stripslashes($title);
$text = stripslashes($text);
 
$query = mysql_query ("UPDATE news SET title='$title', text='$text' WHERE id='$id'");
 
if ($query)
{
echo "Новость успешно обновлена";
}
else
{
echo "Ошибка обновления новости";
}

Что мы сделали? Подключили файл db.php. Выполнили проверку, существует ли глобальные переменные id, title, text, если да, то записать их значения в соответствующие переменные. Обработали данные от посторонних кодов. Выполнили запрос на обновление новости. Если новость обновлена, вывести соответствующие сообщение, если нет, то вывести негативный ответ.

Исходные файлы

Ввод данных MYSQL

Продолжаем серию уроков по Взаимодействию PHP и MYSQL. И сегодня темой второго урока будет Ввод данных в базу mysql. Честно скажу, что, я люблю больше выводить данные из базы. Сам не знаю почему, наверное сказывается мое отвращение к работе с HTML формами, а их родимых нам и придется сейчас использовать. Вы можете для старта взять исходники из первого урока, а именно файл db.php. Также можете использовать базу, с который мы работали в первом уроке.

1. Создавать файл db.php – не нужно, он уже есть. :)

2. Создайте файл insert.php. В этом файле будет содержаться форма для добавления новости.

Добавьте в него код:

echo "<form method=\"POST\" action=\"handler.php\">
Название новости:<br>  
<input type=\"text\" name=\"title\"><br>
Текст новости:<br>
<textarea name=\"text\" cols=\"20\" rows=\"5\"></textarea><br>
<input type=\"submit\" value=\"Добавить\">
</form>";

Что мы сделали? Мы добавили форму.
Данные будут передаваться методом POST файлу handler.php.

3. Создайте файл handler.php. Этот файл будет отвечать за обработку и добавление новости непосредственно в базу.

Скопируйте в него код:

include ("db.php");
 
if (isset($_POST["title"])) {$title = $_POST["title"];}
if (isset($_POST["text"])) {$text = $_POST["text"];}
 
$title = htmlspecialchars($title);
$text = htmlspecialchars($text);
$title = stripslashes($title);
$text = stripslashes($text);
 
$query = mysql_query ("INSERT INTO news (title, text) VALUES ('$title', '$text')");
 
if ($query)
{
echo "Новость успешно добавлена";
}
else
{
echo "Ошибка добавления новости";
}

Что мы сделали? Подключили файл db.php. Выполнили проверку на существование глобальных переменных title и text, с условием, если глобальные переменные существуют, то записать значение глобальных переменных title и text в переменные title и text. Защитили переменные title, text от посторонних кодов. И наконец выполнили запрос на ввод данных в базу, с условием, если результат запроса – истина, то вывести положительный ответ, если ложь, то вывести негативный ответ.

Вот и все. Этот код конечно не идеал защиты. Я повторюсь, акцент делаем на вводе данных.

Исходные файлы урока можете скачать тут.

Взаимодействие PHP и MYSQL – Вывод новостей в цикле

Этим постом я начинаю серию уроков по Взаимодействию PHP и MYSQL
Первый урок называется Вывод новостей в цикле. Так как новости, наиболее часто используется, я решил использовать именно их, вы же можете вместо новостей делать: статьи, посты, во общем что придет в голову.
Сколько будет уроков, сказать не могу, но я думаю что будет много :) .

Для начала вам нужно будет установить DENWER (Джентльменский набор веб-разработчика). Делается это просто, достаточно следовать инструкциям в процессе установки. После того как DENWER установлен и запущен, можно приступать к заполнению базы данных.

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

Первым делом создайте новую базу с именем test_select.
Затем создайте новую таблицу с именем news.
Для создания таблицы используйте эту структуру.

Теперь нужно создать пользователя.
Вернитесь на главную страницу phpmyadmin и зайдите в ПривилегииДобавить нового пользователя. Заполните так как показано на картинке.

Осталось заполнить нашу таблицу данными. Для этого перейдите в таблицу news и выберете вкладку Вставить вверху страницы. Заполните таблицу любыми новостями.
Я написал такие новости.

Все, с phpmyadmin мы закончили. Настало время перейти к написанию программы которая будет выводить новости.

Откройте Macromedia Dreamweaver, или другой подобный редактор, я использую этот т.к. считаю его самым лучшим для разработки программ на php.

1. Создайте файл db.php. Он будет отвечать у нас за подключение базы данных.

Скопируйте этот код:

define ("HOST","localhost");
define ("USER","test_select");
define ("PASSWORD","test");
define ("DATABASE","test_select");
 
$connect = mysql_connect (HOST, USER, PASSWORD);
$db = mysql_select_db (DATABASE, $connect);

Что мы сделали? Мы сначала записали в константы значения наших данных: хоста, пользователя, пароля и базы данных. Затем мы подключились к базе данных используя значения констант и выбрали базу которую будем использовать.

2. Создайте файл news.php. Он будет отвечать за вывод всех новостей которые имеются в базе.

Скопируйте этот код:

include("db.php");
 
$query = mysql_query("SELECT * FROM news"); 
 
while($row = mysql_fetch_array($query))
{
printf ("<a href="\">
<h1>%s</h1>
</a>
%s
",
$row["id"], $row["title"], $row["text"]);
}

Что мы сделали? Подключили файл db.php. Выполнили запрос на вывод данных из базы. Начали цикл с условием, выполнять пока не будут выведены все новости. Вывели на экран название и текст новости. Вы видите что присутствует ссылка на файл view_news.php . Этот файл отвечает за вывод одной новости. Вы спросите, а как скрипт узнает какую именно новость выводить? Все просто, мы в запросе получили id новости, а в ссылке указываем этот id и передаем его методом GET файлу view_news.php.

3. Создайте файл view_news.php. Как вы уже знаете, он отвечает за вывод одной новости.

Скопируйте этот код:

include ("db.php");
 
if (isset($_GET["id"])) {$id = $_GET["id"];}
 
$query = mysql_query ("SELECT * FROM news WHERE id='$id'");
$row = mysql_fetch_array ($query);
 
printf ("
<h1>%s</h1>
%s", $row["title"], $row["text"]);

Что мы сделали? Подключили файл db.php. Выполнили проверку, существует ли глобальная переменная id. Если существует, то записать значение глобальной переменной id в переменную id. Сделали запрос вывести из базы новость. Обратите внимание, теперь мы выводим не все новость, а только ту, у которой поле id совпадает с переменной id. Вывели на экран название и текст новости.

Вот и все готово. Как вы заметили здесь отсутствует оформление страницы. Я специально этого не делал, ведь целью урока было научится выводить данные из базы. Надеюсь вы эту цель достигли. Если что-то не понятно, спрашивайте, с удовольствием отвечу.

P.S. Кому нужны исходные файлы урока, качаем тут.

Шифрование ссылок

Изучив эту запись вы научитесь зашифровывать любую (внешнюю, внутреннюю) ссылку.

Принцип работы данного метода заключается в том что вы видите зашифрованную ссылку, при нажатии на которую вы попадаете на реально существующий URL (тот который вам нужно).

Писать скрипт будем традиционно на PHP, с использованием функции md5;

Сначала код, потом пояснения.

$link = "http://design-lessons.com.ua";
$md5_link = md5($link);
 
echo "<a href='redirect.php?id=".$md5_link."'>Перейти на сайт</a>";
 
if (isset($_GET["id"]))
{
$id = $_GET["id"];
echo ('<meta http-equiv="refresh" content="0;url='.$link.'">');
}

Что мы сделали?

Сначала мы занесли в переменную $link адрес на который нам нужно перейти.

Далее, с помощью функции md5 мы зашифровали наш адрес.

Следующим шагом будет создание ссылки с уже зашифрованым адресом, который будет передаваться методом GET в переменой $id.

Далее мы осуществляем проверку, существует ли переменная $id, если существует, то выполниться редирект на нужный нам адрес в не зашифрованном виде.