Nickolay.info. 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 Кб)

Рейтинг@Mail.ru

вверх гостевая; E-mail