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

Навигация

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

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

Работа С Текстовыми И Графическими Данными В 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
Ответов (1 - 9)
phant0m
сообщение 25.2.2008, 13:37
Сообщение #2



Познающий
Группа: Advanced Members
Сообщений: 76
Регистрация: 29.10.2007
Поблагодарили: 14 *


1 нескромный вопрос : как вы думаете , оправдано ли хранение изображений в BD ?))
Go to the top of the page
 
+Quote Post
DeadMage
сообщение 25.2.2008, 20:15
Сообщение #3



Новичок
Группа: 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
DioNiR90
сообщение 26.2.2008, 20:43
Сообщение #4



Свой человек
Группа: Advanced Members
Сообщений: 141
Регистрация: 7.6.2007
Поблагодарили: 70 *


У меня есть много пртензий к человеку под ником: Guyri.
Перед тем как писать какие нить статьи по PHP думаю надо выучить PHP. И ещё MySQL.

Хранение изображений в БД вообще полная глупость. Время на выполнение запросов поднимается в большие разы.

$HTTP_GET_VARS - мы что в прошлом? Для ЧЕГО БЫЛ ПРИДУМАН $_GET ?????
Читаем php.net -
Цитата
$_GET
Переменные, передаваемые скрипту через HTTP GET. Аналог старого массива $HTTP_GET_VARS (который по-прежнему доступен, но не рекомендуется).
и учимся!
Странно в начале мы print используем как функцию а потом нет. Где понятие о стиле кода? Или нам это не знакомо? Если уж писать как функцию то пиши её везде так.
Критиковать можно долго. Так как писал статью человек не разберающийся в PHP.

К DeadMage особых притензий нет.
Саблюдение стиля.
Нормальное использование MySQL запросов.
Go to the top of the page
 
+Quote Post
ansa
сообщение 25.3.2008, 20:33
Сообщение #5



Свой человек
Группа: Advanced Members
Сообщений: 111
Регистрация: 17.3.2008
Поблагодарили: 25 *


хранение картинок в бд это понт и все :) теряется скорость, повышается трафик из-за глюков кеширования..
Go to the top of the page
 
+Quote Post
misterx
сообщение 27.3.2008, 13:13
Сообщение #6



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


Цитата(ansa @ 25.3.2008, 18:38) *
хранение картинок в бд это понт и все :) теряется скорость, повышается трафик из-за глюков кеширования..

Это служи для одельных случаев к примеру клан картинки в pts хранятся в БД

Цитата(DioNiR90 @ 26.2.2008, 18:48) *
У меня есть много пртензий к человеку под ником: Guyri.
Перед тем как писать какие нить статьи по PHP думаю надо выучить PHP. И ещё MySQL.

Хранение изображений в БД вообще полная глупость. Время на выполнение запросов поднимается в большие разы.

$HTTP_GET_VARS - мы что в прошлом? Для ЧЕГО БЫЛ ПРИДУМАН $_GET ?????
Читаем php.net -
и учимся!
Странно в начале мы print используем как функцию а потом нет. Где понятие о стиле кода? Или нам это не знакомо? Если уж писать как функцию то пиши её везде так.
Критиковать можно долго. Так как писал статью человек не разберающийся в PHP.

К DeadMage особых притензий нет.
Саблюдение стиля.
Нормальное использование MySQL запросов.

ты гений php програмирования начитался учебников и вставляеш цытаты и судиш людей ты подумай мозгами зачем такой метод придумали, а потом что то говори ни кто небудет дизайн сайта впихивать в дб.Человек нашол выписал сделал все чтобы было понятно а ты тут притензии выдвигаеш сначала выучи php потом чтото говори
Go to the top of the page
 
+Quote Post
ansa
сообщение 28.3.2008, 20:27
Сообщение #7



Свой человек
Группа: Advanced Members
Сообщений: 111
Регистрация: 17.3.2008
Поблагодарили: 25 *


Цитата(misterx @ 27.3.2008, 13:18) *
Это служи для одельных случаев к примеру клан картинки в pts хранятся в БД


ты гений php програмирования начитался учебников и вставляеш цытаты и судиш людей ты подумай мозгами зачем такой метод придумали, а потом что то говори ни кто небудет дизайн сайта впихивать в дб.Человек нашол выписал сделал все чтобы было понятно а ты тут притензии выдвигаеш сначала выучи php потом чтото говори

кстати замечания вполне корректны, учитывая, что выкладывает эту статью модератор - можно выдвигать требования ее правильности.
а то что птс хранит картинки в бд это еще не показатель правильности и качества.
Go to the top of the page
 
+Quote Post
DeadMage
сообщение 31.3.2008, 7:39
Сообщение #8



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


misterx, ansa ждем хороших статей от вас ;)
Go to the top of the page
 
+Quote Post
ansa
сообщение 31.3.2008, 9:54
Сообщение #9



Свой человек
Группа: Advanced Members
Сообщений: 111
Регистрация: 17.3.2008
Поблагодарили: 25 *


Цитата(DeadMage @ 31.3.2008, 8:44) *
misterx, ansa ждем хороших статей от вас ;)

написать/найти и запостить можно массу интересных для себя статей по программированию, только их актуальность тут и необходимость вызывают большие сомнения - тут надо мануал как скачать пхп с сайта, как поставить вебобвязку на хостинг и бд на свой сервер.
так же предлагаю посмотреть на группу - members или разработчик и модератор - чувствуешь разницу?
Go to the top of the page
 
+Quote Post
DeadMage
сообщение 31.3.2008, 18:42
Сообщение #10



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


Во-первых модератор вообще не обязан ничего постить и знать, он может тупо удалять флуд, раздавать баны и предупреждения, а может и помогать, выкладывая всякие полезности, так что нефиг бочку на него катить - а то вообще ничего не будет. Вам какой вариант больше нравится?
А во-вторых - Вы считаете что модератор/разработчик только потому что он в этой группе обязательно знает/умеет больше чем Вы, и может смотреть на всех свысока? Если так думать, то никогда ни первым, ни вторым не станешь:)
И в-третьих - обсуждаем только статью, а то злой модератор в моем виде будет плохие вещи делать :) А продолжение дискуссии в таком случае в личку, или во флуд.
Go to the top of the page
 
+Quote Post

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

 

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