Pers.narod.ru. PHP. Статьи. Простейший скрипт на PHP+MySQL с базой данных и инсталлятором |
Тема уже описывалась вот в этой статье, но прошло время, изменился PHP, и нужен пример поновее, хотя задачи его остаются теми же:
К файлам проекта подключать будем только functions.php
, а он позаботится об остальных служебных файлах:
<?php require_once ("config.php"); require_once ("params.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=stripslashes($path); return $path; } ?>
Две функции в приведённом листинге заботятся о лишних пробелах и ужасах "магических кавычек".
Пожалуй,
trimall
может быть проще:
function trimall ($string) {
return preg_replace("/\s+/"," ",trim($string));
}но тогда она сольёт все строки в одну, а вдруг разрывы строк нужно сохранить и убрать только лишние из них?
Файл настроек 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 = ''; } ?>
Принцип действия такой обработки параметров обсуждался в этой статье.
Файл операций с базой данных 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 (); } ?>
Смысл такого подхода - по возможности использовать один и тот же идентификатор соединения (статическая переменная $conid
), а не "переконнективаться" к базе каждый раз. Да и имена функций работы с базой чуть короче, чем стандартные :)
Основной демо-файл 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 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
не удалён из текущей папки - это позволит нам сделать совсем простой и "небезопасный" вариант скрипта-установщика (инсталлятора).
Файл-инсталлятор 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,
так что на хосте должна быть версия не ниже.
Скачать код этого примера в архиве ZIP (могут быть мелкие изменения в коде) (4 Кб)
гостевая; E-mail |