PHP експерименти
Категория: Интернет
10.2.2004
Dbase
Eдва ли ви се е налагало да работите точно с тази функция на езика при наличието на много по-добри решения за работа с данни. Отворете текстовия редактор и напишете следните редове:
<?PHP
$dbname =”database.dbf”;
// database “definition”
$def = array(
array(“id”, “N”,3,0),
array(“username”, “C”,50),
array(“password”, “C”, 50,3),
class=GramE>array(“email”, “C”, 128),
class=GramE>array(“member”, “L”) );
if (!dbase_create($dbname, $def))
“<strong>Error!</strong>”;
$flag = dbase_open ($dbname,2);
$add_1 = array(“1”,”bogomil”,”pass”,”bogomil@webgate.bg”,”false”);
dbase_add_record ($flag,$add_1);
$data = dbase_get_record_with_names ($flag, 1);
while (list ($key, $val) = each ($data))
{
echo “$key => $val<br>”;
}
?>
Направихме следното:
1. Дефинирахме как ще се казва файлът който се явява мястото, където ще пазим данните си в определен формат.
2. Създадохме масив, с който ще изградим структурата на базата данни
Самата структура има следния вид:
3.Вкарваме един ред с горната структура във файла first.dbf.
Преди да видим резултата, обаче трябва да откоментираме няколко реда в php.ini. Oтворете файла и махнете символа ‘;’ пред редовете:
extension=php_dbase.dll
extension=php_sockets.dll
След това изпълняваме файла, за да видим следния резултат на екрана:
id => 1
username => bogomil
password => pass
email => bogomil@webgate.bg
member => 0
deleted => 0
Разбира се, можете да правите още тестове, но това не е най-добрият начин за работа с данни.
Сокети
За разлика от предното приложение на PHP работата със сокети е актуално и с помощта му можете да направите, да речем, сървър който да “слуша” на определен порт и да изпълнява определени задачи.
Много е изписано за това, но за съжаление не е така подробно, както ще го намерите в следващите редове.
Нека първо да кажем какво е сокет - комбинация от IP адрес и порт, който идентифицира услуга в интернет. Една двойка сокети идентифицира мрежова връзка в TCP. Може също да се нарече механизъм за връзка между TCP приложения.
Нека сега да минем към работата с PHP. Първото, което ще ви кажа сега, е революционната фраза
“Забравете за браузера”
Сега ще работим директно с PHP.exe. За целта, трябва да направим малко настройки, ако, разбира се, не сте направили предварително друг път.
1. Ако php.ini файлът ви е някъде другаде от Windows директорията ви, го копирайте и там, примерно
C:Windows
2.Откоментирайте реда в същия файл, който се отнася за работата със сокети
; extension=php_sockets.dll
да стане
extension=php_sockets.dll
3. направете .bat файл за по-лесна работа със следното съдържание
@echo off
php server/run.php
и го запишете в директорията, където сте инсталирали PHP (примерно C:PHP). След това направете една папка /server и един файл, които запишете като run.php, за да спазим инструкциите на *.bat файла. Не е задължително да е точно така, можете да ползвате собствени пътища или имена на файлове или да стартирате PHP по начин, който желаете.Започваме
Отворете файла (run.php) и пишете:
<?
error_reporting (E_ALL);
set_time_limit (0);
ob_implicit_flush ();
$address = ‘192.168.1.29’;
$port = 100;
Първо започваме с настройките на скрипта, като е важно да се отбележи:
1. Да показва всички грешки, за да можем да следим процеса.
2. Да чака “вечно” за връзка, а не да спира след време.
3. Да е възможно всичко, което “влиза”, да го виждаме.
Настройваме и IP адреса, и порта, на който нашият сървър ще “слуша”.
Продължаваме да пишем по-нататък. Тук вече влизаме в спецификата на теорията за сокетите и това как е направено това в PHP.
Първо създаваме сокета, ако не можем да го създадем, изписваме грешка:
if (($sock = socket_create(AF_INET, SOCK_STREAM, 0)) === false)
{
echo “socket_create() failed: reason: “ . socket_strerror($sock) . “
”;
}
След това “закачаме” сокета към нашия адрес и порт, посочен в началото на файла, ако не можем да направим това, отново изписваме грешка.
if (($ret = socket_bind($sock, $address, $port)) === false)
{
echo “socket_bind() failed: reason: “ . socket_strerror($ret) . “
”;
}
И последната операция, казваме на сокета да чака някой да се “върже” към него:
if (($ret = socket_listen($sock, 10)) === false)
{
echo “socket_listen() failed: reason: “ . socket_strerror($ret) . “
”;
}
Разбира се, това само по себе си няма ефект, защото, когато някой иска да ползва някаква услуга, се връзва към този сокет, а засега, когато някой се свърже към този порт, няма да можем да му предоставим нищо. Време е да напишем основната част.
do
{
if (($msgsock = socket_accept($sock)) === false)
{
echo “socket_accept() failed: reason: “ . socket_strerror($msgsock) . “
”;
break;
}
$msg = “
Добре Дощли на ТЕСТ сървъра ни .
” .
“За да излезете, напишете ‘quit’. За да спрете сървъра, напишете ‘shutdown’.
”;
socket_write($msgsock, $msg, strlen($msg));
$cmd = “”;
do {
if (false === ($buf = socket_read($msgsock, 4096)))
{
echo “socket_read() failed: reason: “ . socket_strerror($ret) . “
”;
break 2;
}
if ($buf == “
”)
{
if ($cmd == ‘quit’)
{
socket_write($msgsock, “
Closing connection ...”, strlen (“ Closing connection ...”));
break;
}
elseif ($cmd == ‘shutdown’)
{
socket_write($msgsock, “
Shutdown initiated...”, strlen (“ Shutdown initiated...”));
socket_close ($msgsock);
break 2;
}
else{
socket_write($msgsock, “Server Replies: Wrong command...$cmd
”, strlen (“Server Replies: Wrong command...$cmd “));
}
$cmd = “”;
}
else{
$cmd .= $buf;
}
}
while (true);
socket_close ($msgsock);
}
while (true);
socket_close ($sock);
?>
Тъй като не можем да делим тази част, я слагам на един път и започваме коментарите.
Идеята е следната: когато се върже някой към нашия сокет, да речем, един телнет клиент, да ми се изпише съобщение за добре дошъл или примерно за да знае каква услуга има на този порт, или информация за нещо. Преди това, разбира се, трябва да проверим, дали някой се е вързал към този адрес и порт и след това да му дадем информацията.
След като се уверим, че имаме клиент отсреща, му изпращаме приветствие и след това чакаме той да напише нещо и ние в зависимост от това, което той е написал, да направим нещо. Звучи малко объркващо, но нека да дадем един пример.
Ние: Добре дощли на ТЕСТ сървъра ни. За да излезете, напишете “quit”. За да спрете сървъра, напишете “shutdown”.
Tой: quit.
Ние: Closing connection... и прекратяваме връзката с неговия сокет, но не спираме сървъра, така че, ако той иска да се свърже пак, може да го направи.
Точно такава логика е залегнала и в самия скрипт, ако го разгледате внимателно, освен “quit” и “shutdown” имаме и съобщение, което е за всички останали думи, написани от потребителя отсреща, за да го информира, че такава команда няма. При положение, че има грешка или клиентът даде команда “shutdown”, сокетът спира да “слуша”.
Малко е странна тази теория и самото й приложение, надявам се да сте разбрали за какво става дума.
Запишете скрипта, след това стартирайте bat файла, който създадохме в началото, и на порта, който сте посочили, вече имате отворен сокет. Пуснете телнет и се вържете към него и следвайте инструкциите, които написахме.
Следващото, което ще разгледаме, е едно приложение, което е полезно за всеки сайт. Става дума за лента, в която потребителите могат да пишат съобщения и всеки да ги вижда. Погледнете изображението и сигурно ще се досетите за какво става дума. Има много безплатни такива, но сега ще направим един само за вас, който можете да сложите на сайта си.
започваме от индекс файла:
<html>
<head>
<title>Pager</title>
<meta http-equiv=”Content-Type”
content=”text/html; charset=iso-8859-1">
</head>
<frameset cols=”*,142"
frameborder=”NO” border=”0" framespacing=”0" rows=”*”>
<frame name=”mainFrame” src=”pager.html”>style=mso-spacerun:yes>
<frame name=”rightFrame” scrolling=”YES” noresize
src=”view.php”>
</frameset>
<noframes>
<body bgcolor=”#FFFFFF” text=”#000000">style=mso-spacerun:yes>
</body>
</noframes>
</html>
Основния файл, разбира се, е view.php
<!doctype html public “-//W3C//DTD HTML 4.0 //EN”>
<html>
<head>
<title>View</title>
</head>
<body>
<?php1>
class=GramE>require(“config.php”);
mysql_connect
($server, $user, $pass);
mysql_select_class=GramE>db($dbname);style=mso-tab-count:1>
$select_dataclass=GramE>=(“SELECT name,msg
FROM fmWHERE msg is NOT NULL”);
$ver=mysql_class=GramE>query($select_data);
while
($row = mysql_fetch_array ($ver))
{style=mso-spacerun:yes>
class=GramE>echo “<table width=100% border=0 background=bg1.gif
><tr><td></font><font color=black> “.$row[0].”style=mso-spacerun:yes><br><font color=blue><b>class=GramE>say:</b></font><br></font></td></tr></table>”;style=mso-spacerun:yes>
class=GramE>echo “<table width=100% border=1 bordercolor=green
background=bg2.gif ><tr><td><font color=black></b>
“.$row[1].”<br>
</font></tr></td></table>”;style=mso-spacerun:yes>
}style=mso-spacerun:yes>
?>
<p>
<table width=10% border=1 align=center
background=tblbgr.gif><tr><td>style=mso-spacerun:yes>
<form
name = pager method=post action=get2.php>
<input type=text size=10 name=namestyle=mso-spacerun:yes>maxlength=”12"
value=name><br> <input type=text size=10 name=message
maxlength=”12" value=message><br>
<input type=image src=btn.gif name=action
value=Heat><br><a href=view.php><img src=rld.gif
border=0></a>
</form>
</tr></td></table>style=mso-spacerun:yes>
</p>
</body>
</html>
Мисля, че няма нужда от коментар на горните редове, но все пак нека да видим какво направихме:
1. Вързахме се към базата данни и взехме от таблицата всички записи, които са въведени от потребителите. Тук искам да кажа, че това е един примерен дизайн на базата и на комуникацията между потребителите и базата. Можете да използвате друг сценарий или да подобрите този.
2. Изведохме резултатите.
3. В края на страницата добавихме форма, чрез която можете да добавяте записи към пейджъра.
Ето и страницата за въвеждане на данните :
<html>
<META HTTP-EQUIV=”Refresh” CONTENT=”0;URL=view.php”>
<body>
<?
require(“config.php”);
mysql_connect($server,$user,$pass);
mysql_select_db($dbname);
$insert_data=”INSERT INTO fm (name,msg) VALUES (‘$name’,’$message’)”;
mysql_query($insert_data);
?>
</html>
Ето че всичко е готово! Не е сложно, идеята е важна и самото приложение остава във въображението ви. На по-напредналите от вас в този език това ще се стори елементарно, но целта е да се обясни за начинаещите, защото всеки е тръгнал отнякъде, а материали по тази тема все още няма.