Здравствуйте, гость ( Вход | Регистрация )

Навигация

Ссылки форума

Навигация по форуму

Работа С Текстовыми И Графическими Данными В Php И Mysql, PHP - Работа с графикой
Guyri
сообщение 24.2.2008, 23:32
Сообщение #1



В отпуске
Группа: Advanced Members
Сообщений: 13
Регистрация: 22.9.2007
Поблагодарили: 773 *


Итак, постановка задачи:

Требуется хранить в базе данных такую информацию:
Фамилия, имя, отчество email, фотографию и краткое описание (или биографию) человека.

Для достижения поставленной цели выбран вполне распространенный комплект веб-сервера: Apache 1.3.20, PHP 4.1.0, MySQL 4.0.0. или более выше

Для начала создаем БД:

Цитата
mysqladmin -p create testdb


затем делаем ее текущей:

Цитата
use testdb.


Дальше создаем таблицу для хранения информации:

Цитата
CREATE TABLE infouser (
id_infouser int(7) unsigned NOT NULL auto_increment,
lastname varchar(255) NOT NULL default '',
firstname varchar(255) NOT NULL default '',
patronym varchar(255) NOT NULL default '',
imageinfouser mediumblob,
filename1 varchar(50) default NULL,
filesize1 varchar(50) default NULL,
filetype1 varchar(50) default NULL,
infoinfouser varchar(255) default NULL,
emailinfouser varchar(100) default NULL,
PRIMARY KEY (id_infouser))


Сначала создадим файл для хранения функций, таких как, соединение с БД, и шаблонов, чтобы десять раз не переписывать одно и то же:

Цитата
<?php
// tags for open html-docs
function html_begin($header)
{
print("<html>\n");
print("<head>\n");
print("<META HTTP-EQUIV=\"Content-Type\"
Content=\"text/html">");
print("<title>Тестовая БД</title>\n");
print("</head>\n");
print("<body text = \"#000000\" bgcolor
= \"#52FA90\">\n");
print("<br><center><table width = \"90%\"
border = \"1\" bgcolor = \"green\" cols = \"1\">");
print("<tr><td><p style = \"text-align:
justify; margin-left: 50 px; margin-right: 50 px\">");
if ($header)
print("<h3>$header</h3>\n");
print("</p><hr width = \"100%\"
size = \"1\" color = \"#c0c0c0\"><p>");
}
//
// tags for close html-docs
function html_end()
{
print("</td></tr></table></center>");
print("</body></html>");
}
//
// function for connect mysql and select database
function connect_mysql()
{
define("DBName","testdb");
define("HostName","localhost");
define("UserName","valery");
define("Password","");
if(!mysql_connect(HostName,UserName,Password))
{ echo "Сервер временно не работает, заходите позже.".DBName."!<br>";
echo mysql_error();
exit;
}
mysql_select_db(DBName);
}
?>
Делаем форму для ввода информации.
Файл с именем insert.php
<?php
include("function.inc");
$header = ("ввести нового человека");
html_begin ($header);
?>
<form action = "insert2.php" method = "post"
enctype = "multipart/form-data">
Фамилия: <input type = "text" name = "lastname"
size = "30" maxlenght = "30"><br>
Имя: <input type = "text" name = "firstname"
size = "30" maxlenght = "30"><br>
Отчество: <input type = "text" name = "patronym"
size = "30" maxlenght = "30"><br>
Email: <input type = "text" name = "email"
size = "30" maxlenght = "30"><br>
Фотография: <input type = "file" name = "userfile"><br>
Информация о человеке:<br>
<textarea name = "infoinfouser" cols = "40"
rows = "5"></textarea>
<br>
<input type = "submit" value = "Ввести нового человека"><br>
</form>
<?php
html_end();
?>


затем идет страница принимающая информацию имя файла достаточно очевидно insert2.php:

Цитата
<?php
include("function.inc");
$header = ("ввод информации");
html_begin ($header);
//
//read file image
$fd = fopen ($userfile, "rb");
$userfile2 = fread ($fd, filesize ($userfile));
fclose ($fd);
$userfile2 = addslashes($userfile2);
//
// insert in db
//
connect_mysql();
mysql_query("SELECT * FROM infouser");
mysql_query("INSERT INTO infouser(id_infouser, lastname, firstname, patronym,
imageinfouser, filename1, filesize1, filetype1, infoinfouser, email_infouser)
VALUES('','$lastname', '$firstname', '$patronym', '$userfile2', '$userfile_name',
'$userfile_size', '$userfile_type', '$infoinfouser', '$email')");
echo "<br>";
print "Новый пользователь успешно введен";
mysql_close();
html_end();
?>


вот и все мы ввели данные, теперь их надо как-то прочитать.
Для этого используем еще три файла.
Первый файл выдает список пользователей.
prev.php

Цитата
<?php
include("function.inc");
//
$header = ("просмотр записей");
html_begin ($header);
//
connect_mysql();
//
print ("<table cols =\"1\">");
// Выводим все записи
$r=mysql_query("SELECT * FROM infouser");
for($i=0; $i<mysql_num_rows($r); $i++)
{ $f=mysql_fetch_array($r);
print "<tr>";
print "<td align = \"center\">";
print "<a target = \"_new\" href = \"sample.php?id=$f[id_infouser]\">$f[lastname]
$f[firstname] $f[patronym] </a>";
print "<p>";
//
print "</td>";
print "</tr>";
}
print "</table>";
mysql_close();
html_end();
?>


второй файл используется для выдачи данных по одному пользователю: sample.php

Цитата
<?php
//
include("function.inc");
$header = ("просмотр записей");
html_begin ($header);
//
connect_mysql();
//
reset ($HTTP_GET_VARS);
while (list ($key, $val) = each ($HTTP_GET_VARS)) {
//
$sql = "SELECT * FROM infouser WHERE id_infouser = '$val'";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
echo "<table border = \"0\" width = \"70%\">\n";
for ($i = 0; $i < $rows; $i++) {
$data = mysql_fetch_object($result);
echo " <tr>\n";
echo " <td><font color = \"red\" size
= \"+1\">$data->lastname<br> $data->firstname<br>
$data->patronym<br></font></td>\n";
echo " <td rowspan = \"2\"><center><img
src = 'download.php?id=$data->id_infouser' border =
'2' bgcolor = '#01cccc'></center></td>\n";
echo " </tr>\n";
echo " <tr>\n";
echo " <td><font color = \"green\">$data->emailinfouser</font></td>\n";
echo " </tr>\n";
echo " <tr>\n";
echo " <td colspan = \"2\">$data->infoinfouser</td>\n";
echo " </tr>\n";
}
mysql_free_result($result);
}
mysql_close();
//
html_end();
?>


следующий файл реализует обработку фотографий и выдачу их: download.php

Цитата
<?php
//
reset ($HTTP_GET_VARS);
while (list ($key, $val) = each ($HTTP_GET_VARS)) {
//
//
define("DBName","testdb");
define("HostName","localhost");
define("UserName","valery");
define("Password","");
if(!mysql_connect(HostName,UserName,Password))
{ echo "Сервер временно не работает, заходите
позже.".DBName."!<br>";
echo mysql_error();
exit;
}
mysql_select_db(DBName);
//
//
$sql = "SELECT imageinfouser, filename1, filetype1 FROM
infouser WHERE id_infouser='$val'";
$result = @mysql_query($sql);
$data = @mysql_result($result, 0, "imageinfouser");
$name = @mysql_result($result, 0, "filename1");
$type = @mysql_result($result, 0, "filetype1");
header("Content-type: $type");
echo $data;
}
mysql_close();
?>
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DeadMage
сообщение 25.2.2008, 20:15
Сообщение #2



Новичок
Группа: Newbies
Сообщений: 20
Регистрация: 22.2.2008
Поблагодарили: 28 *


Цитата
1 нескромный вопрос : как вы думаете , оправдано ли хранение изображений в BD ?))

Я бы сказал что нет. Это на мой взгляд не очень удобно. Лучше хранить в файлах, это ведь не сложно. Тогда предлагаю такую схему:
Код
id int(7) unsigned NOT NULL auto_increment,
lastname varchar(255) NOT NULL default '',
firstname varchar(255) NOT NULL default '',
patronym varchar(255) NOT NULL default '',
filename varchar(50) default NULL,
infoinfouser varchar(255) default NULL,
emailinfouser varchar(100) default NULL,
PRIMARY KEY (id))

Файл конфиг+дополнительные фени(utils.php):
Код
<?php
define("DBName","test");
define("HostName","localhost");
define("UserName","root");
define("Password","");

function ConnectDb()//Коннект к дб
{
   mysql_connect(HostName,UserName,Password) or die ("Can't connect");
   mysql_select_db(DBName);
}

function tmpl_replace($tmpl,$res)//заменить в шаблоне $tmpl все строки вида <!--коюч--> на значение где ключ и значение берутся из хеша $res
  {
   $tmp=$tmpl;
   foreach($res as $k=>$v)
    @$tmp=str_replace("<!--$k-->",$v,$tmp);
   return $tmp;    
  }
function PrintTemplate($params)//функция для вывода основного шаблона
  {
   $tmpl=file_get_contents('main.tmpl');
   print tmpl_replace($tmpl,$params);
  }
?>

Теперь шаблон основной страницы(здесь и далее взято у Guyri) main.tmpl:
Код
<html>
<head>
<META HTTP-EQUIV="Content-Type" Content="text/html">
<title><!--Title--></title>
</head>
<body text = "#000000" bgcolor= "#52FA90">
<center><table width = "90%" border = "1" bgcolor = "green" cols = "1">
<tr><td><p style = "text-align:justify; margin-left: 50 px; margin-right: 50 px">
<h3><!--header--></h3>
</p><hr width = "100%" size = "1" color = "#c0c0c0">
<p>
<!--content-->
</p>
</body>
</html>

Теперь шаблон для ввода(insert.tmpl):
Код
<form action = "insert.php" method = "post"
enctype = "multipart/form-data">
Фамилия: <input type = "text" name = "lastname"
size = "30" maxlenght = "30"><br>
Имя: <input type = "text" name = "firstname"
size = "30" maxlenght = "30"><br>
Отчество: <input type = "text" name = "patronym"
size = "30" maxlenght = "30"><br>
Email: <input type = "text" name = "email"
size = "30" maxlenght = "30"><br>
Фотография: <input type = "file" name = "userfile"><br>
Информация о человеке:<br>
<textarea name = "infoinfouser" cols = "40"
rows = "5"></textarea>
<br>
<input type = "submit" value = "Ввести нового человека" name=subm><br>
</form>

Теперь собственно сам insert.php:
Код
<?php
include_once('utils.php');//подключаем наш модуль
if(!$subm)//показываем форму
  {
    $params['content']=file_get_contents('insert.tmpl');//загружаем шаблон формы
    $params['header']='Ввести нового человека';//ставим заголовок
    PrintTemplate($params);//выводим шаблон
    exit;//на выход
  }
$dir='imgs\'
@mkdir($dir,666);
if ($userfile)
  {
   copy($userfile,$dir.basename($userfile_name));
   $userfile=$dir.basename($userfile_name);
  }
@ConnectDb();//коннектимся к бд
mysql_query("INSERT INTO infouser(`id`, `lastname`, `firstname`, `patronym`,`filename`,`infoinfouser`, `email_infouser`)
VALUES('','$lastname', '$firstname', '$patronym', '$userfile', '$infoinfouser', '$email')");
Header('Location: view.php');//отправляем юзера на страницу просмотра, ну тут можно и подругому сделать, на ваш вкус
?>

Теперь нужно сделать view.php:
Код
<?php
include_once('utils.php');
@ConnectDb();
if (!$id)//если не указан id то выводим все
  {
   $q=mysql_query('SELECT * FROM `infouser`');
   $persontmpl=file_get_contents('person.tmpl');   //Грузим шаблон
   $str='';  
   while($res=mysql_fetch_array($q)
    $str.=tmpl_replace($persontmpl,$res);//это должно быть вам знакомо
   $alltmpl=file_get_contents('persall.tmpl');//а здесь немного пришлось потерять из-за шаблонной модели - т.к. у нас кроме основного шаблона есть еще отдельный шаблон под персон, приходится так делать
   $ar['content']=$str;
   $params['content']=tmpl_replace($alltmpl,$ar);
   $params['header']='Персоны';
  }
else//иначе выводим только об одном человеке
  {
   $res=mysql_fetch_array(mysql_query("SELECT * FROM `infouser` WHERE `id`='$id'"));
   $tmpl=file_get_contents('singleperson.tmpl');
   $params['content']=tmpl_replace($tmpl,$res);
   $params['header']='Просмотр персоны';
  }
PrintTemplate($params);
?>

Вот и все с кодом, осались только шаблоны:
person.tmpl
Код
<tr>
<td align = "center">
<a target = "_new" href = "view.php?id=<!--id-->"><!--lastname-->
<!--firstname--> <!--patronym--> </a>
</td>
</tr>

singleperson.tmpl
Код
<tr>
<td><font color = "red" size
= "+1"><!--lastname--><br> <!--firstname--><br>
<!--patronym--><br></font></td>
<td rowspan = "2"><center><img
src = "<!--filename-->" border ="2" bgcolor = "#01cccc"></center></td>
</tr>
<tr>
<td><font color = "green"><!--emailinfouser--></font></td>
</tr>
<tr>
<td colspan = "2"><!--infoinfouser--></td>
</tr>

persall.tmpl
Код
<table cols ="1"><!--content--></table>


С одной стороны такой "шаблонный" подход позволяет легко менять вывод страницы, и отделить код от вывода(я надеюсь мы еще поговорим про MVC) но приходится создавать кучу побочных файлов. Например у меня сейчас в среднем по величине проекте уже 31 шаблон. Вобщем изучайте, читайте, задавайте вопросы.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 14.6.2026, 2:59