Простейший скрипт на PHP+MySQL с базой данных и инсталлятором
Тема уже описывалась вот в этой статье, но прошло время, изменился PHP, и нужен пример поновее, хотя задачи примера остаются теми же:
- корректная обработка параметров, переданных по GET и POST с удалением специальных символов и лишних пробелов (переводов строк);
- корректная обработка кавычек;
- отдельный файл настроек, в котором будут прописаны параметры соединения с MySQL;
- файл-инсталлятор, который создаст базу данных и потом удалится (для простоты не будем удалять его программно);
- файл операций с БД, по возможности не делающий лишних переподключений к базе;
- файл-пример заполнения БД с простейшим контролем (например, не разрешать добавлять ту же самую запись по обновлению страницы после отправки данных).
Возможно, попозже сделаю их этого статейку.
К файлам проекта подключать будем только functions.php
, а он позаботится об остальных служебных файлах:
<?php require_once ("params.php"); require_once ("config.php"); require_once ("db.php"); function trimall ($string) { $string=preg_replace("/\r/","",trim($string)); $string=preg_replace("/ +/"," ",$string); $string=preg_replace("/ \n/","\n",$string); $string=preg_replace("/\n\n+/","\n",$string); return $string; } function magic ($path) { ini_set('magic_quotes_runtime', '0'); ini_set('magic_quotes_sybase', '0'); //В php.ini magic_quotes_gpc=1. Она не меняется программно - см. доки if (@get_magic_quotes_gpc()=='1'){ $path=str_replace('\\"','"',$path); $path=str_replace("\\'","'",$path); $path=str_replace("\\\\","\\",$path); } return $path; } ?>
Файл настроек config.php
:
<?php define ('DB_HOST','localhost'); //хост define ('DB_LOGIN','root'); //логин define ('DB_PASS','root'); //пароль define ('DB_NAME','test'); //имя БД define ('DB_TABLE','data'); //имя таблицы в БД define ('DB_CODEPAGE','cp1251'); //кодовая страница БД ?>
Файл обработки параметров params.php
:
<?php if (isset($params)) while (list($num,$var) = each($params)) { if (!empty($_POST[$var])) $$var = trimall(htmlspecialchars(magic($_POST[$var]))); else if (!empty($_GET[$var])) $$var = trimall(htmlspecialchars(magic($_GET[$var]))); else $$var = ''; } ?>
Что исправить в модуле для PHP 5.5 и выше?
Файл операций с базой данных db.php
:
<?php if (!isset($conid)) { function dbconnect() { $mysql=mysql_connect(DB_HOST, DB_LOGIN, DB_PASS); //хост, логин, пароль mysql_select_db(DB_NAME); //имя базы данных return $mysql; } function dbquery ($sql){ $result=mysql_query($sql,get_conid()); return $result; } function dbfetcha ($result){ if ($row=mysql_fetch_assoc ($result)) return $row; else return false; } function dbfetch ($result){ if ($row=mysql_fetch_array($result)) return $row; else return false; } function dbrows ($result){ $num=mysql_num_rows($result); return $num; } function dbfree ($result){ mysql_free_result($result); } function dbclose ($conid) { mysql_close(get_conid()); } function get_conid () { static $conid=0; if ($conid==0) { $conid=dbconnect(); mysql_set_charset (DB_CODEPAGE,$conid); } return $conid; } get_conid (); } ?>
Более новая версия этого файла,основанная на расширении MySQLi вместо MySQL есть в этой заметке.
Основной демо-файл index.php
:
<?php //Список допустимых параметров - имена из форм и переменные скрипта: $params = array('title','message'); require_once ("functions.php"); //Формирование верхней части страницы: print '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Демо</title></head> <body bgcolor="#E5E5E5" text="#000000" link="#006699" vlink="#5493B4"> '; if (file_exists('install.php')) { print '<p>Пожалуйста, выполните файл install.php из папки скрипта или удалите его, если Вы уже выполнили его ранее. <a href="'.$_SERVER['PHP_SELF'].'">Обновить эту страницу</a>'; exit; } if (!empty($title) and !empty($message)) { //Нужные параметры непусты? $sql = 'select title,message from '.DB_TABLE.' where title="'.$title.'" and message="'.$message.'"'; $result = dbquery($sql) or die (mysql_error()); if (dbrows($result)<1) { //Добавить сообщение в базу: $sql = 'insert into '.DB_TABLE.' (title,message) values ("'.$title. '", "'.$message.'")'; $result = dbquery($sql) or die (mysql_error()); } else { echo '<p>Такое сообщение уже было добавлено ранее</p>'; } } //Вывод формы для добавления сообщений: print ' <form action="index.php" method="post" action="'.$_SERVER['PHP_SELF'].'"> <p>Заголовок: <input type="text" size="40" maxlength="80" name="title" value="'. $title.'"></p> <p>Сообщение: <textarea name="message" rows="4" cols="72">'. $message.'</textarea></p> <p><input type="submit" value="Добавить"> </form> '; //Получить и показать все имеющиеся записи БД: $sql = 'select * from '.DB_TABLE.' order by id desc'; //Сортируем по номеру записи в обратном порядке $result = dbquery($sql) or die (mysql_error()); if ($result and dbrows($result)) { //Если есть непустой результат, while ($data = dbfetcha($result)) { //то пока есть записи, print '<p><b>'.$data['title'].'</b>: '; //вывести заголовок print $data['message'].'</p>'."\n"; //и сообщение с переводом строки } } print '</body></html>'; ?>
Файл-инсталлятор install.php
создаст базу данных и таблицу в ней
(если база уже существовала, она удалится).
<?php $params = array('action'); require_once ("functions.php"); $sqls = array ( 'DROP DATABASE IF EXISTS '.DB_NAME.';', 'CREATE DATABASE '.DB_NAME.';', 'USE '.DB_NAME.';', 'DROP TABLE IF EXISTS '.DB_TABLE.';', 'CREATE TABLE '.DB_TABLE.' (id int PRIMARY KEY auto_increment, title varchar(80), message text);' ); print '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <title>Формирование базы данных</title></head> <body bgcolor="#E5E5E5" text="#000000" link="#006699" vlink="#5493B4">'; if (empty($action)) { print '<p>Нажмите кнопку для создания базы данных демо-скрипта... после успешного завершения, удалите файл install.php <form method="post" action="'.$_SERVER['PHP_SELF'].'"><input type="hidden" name="action" value="1"> <input type="submit" value="OK"> </form>'; } else { $error=''; for ($i=0; $i<count($sqls); $i++) { $result = dbquery($sqls[$i]) or exit (mysql_error()); if (!$result) { $error.='<br>Не удалось выполнить запрос: <font color="red">'.$sqls[$i].'</font>'; } } if (!empty($error)) { print '<p>Возникли ошибки!'.$error.'</p>'; } else { print '<p>База данных успешно создана! <a href="index.php">Перейти к скрипту</a></p>'; } } print '</body></html>'; ?>
Предполагается, что все файлы "лежат" в одной папке на сервере.
Требования к версии PHP: функция mysql_set_charset
появилась в PHP 5.0.7,
так что на хосте должна быть версия не ниже.
Более полная версия статьи и закачка архива с примером - на сайте
P.S. Примерно то же самое, но для простоты без инсталлятора и проверенное в PHP 8 + MySQLi вместо MySQL.
Скачать архив .zip, развернуть файлы в нужную папку на локальном хосте (4 Кб)
11.06.2011, 11:57 [18735 просмотров]