|
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 Кб)
|
|