Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > As3 изучение и немного As2

Оценить эту запись

FSD - учим php/sql

Запись от in4core размещена 28.06.2012 в 18:23

Предисловие :

FSD ( flash->server->dataBase) Так решил я озаглавить данную статейку. Речь пойдет о взаимодействии флеша с сервером, а сервера с БД , получение данных, отправка POST , работа с сессиями и т.п.

Что нужно знать, чтобы понять статью :
1. As3 / PHP - хотя бы на уровне любителя. ( но php буду объяснять, но мало )
2. Форматы xml / json , понятие, что такое БД.

По скольку php я не знал до сего дня вообще, часть кода ПОНИМАЮЩИМ людям может показаться быдло кодерством, поэтому сразу правим меня. Но думаю , документации, уроков и знания клиентских языков мне хватило, чтобы написать следующую либу


Немного рассуждения :

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

Код AS3:
public function getExternalData(url:String , var1:String , var2:String , var3:String ):void
{
_variables = new URLVariables();
_variables["var1"] = var1;
_variables["var2"] = var2;
_variables["var3"] = var3;
 
const req:URLRequest = new URLRequest(url);
req.method = URLRequestMethod.POST;
req.data = _variables;
 
_dbLoader.dataFormat = URLLoaderDataFormat.TEXT;
_dbLoader.addEventListener(Event.COMPLETE, onGetExternalData);
_dbLoader.load(req);
}
Тоесть мы задаем ссылку ( Url) откуда будем брать данные, и отсылаем методом POST некие свои данные.
Эта процедура нам ясна с детских лет, поэтому разговаривать о ней не будем, а сразу перейдем к серверу.
Из флеша будем делать вот такой запрос :
Код AS3:
_connector.getExternalData('someUrl.php' , 1 , 'hello' , 'world');
Далее создадим файл someUrl.php и сохраним его на сервере.

Код:
<?php
$var1 = $_POST['var1'];
$var2 = $_POST['var2'];
$var3 = $_POST['var3'];
echo $var1 . "/" . $var2 . "/" . $var3 ;
?>
И так пара определений для тех кто не в теме. В php переменные создаются как $varname и не имеют строгой типизации. Некоторые методы , кое какой синтаксис и т.п. похожи даже на as3 )))) В php есть так же глобальные переменные* ( наверно можно так назвать ) , например как $_POST .
Метод echo выводит нам на экран , то что мы хотим увидеть. В нашем примере во флеш нам вернется
Код:
1/hello/world
Стоит обратить внимание , что объединение строк производится не через + , а через . (точку).
Как мы видим все довольно просто.
Попробуем усложить наш первый php код , таким вот образом

Код:
<?php
if( isset($_POST['var1'] , $_POST['var2'] , $_POST['var3'])) {
$var1 = $_POST['var1'];
$var2 = $_POST['var2'];
$var3 = $_POST['var3'];
echo $var1 . "/" . $var2 . "/" . $var3 ;
}
else echo 'PHP : no post params';
?>
Появился какой то хитрый метод isset. Смысл в том, что он проверяет - установлено ли значение для переменной ( кол-во переменных не ограничено ). Тоесть если мы не передадим ХОТЬ 1 параметр из 3х, то выполним else .

Кое какая, но безопасность :

Тут мы поговорим о сессиях в пхп. Сессия это очень полезная вещь смысл приблизительно такой :

1. открываем сессию
2. записываем какую то секретную переменную
3. переменная хранится до тех пор, пока мы не очистим переменную и не закроем сессию.

Для минимальной безопасности , я предлагаю такой вариант :
index.html в котором во flashVars встраиваем php код ( тут откроется сессия), создающий 20значный код ( любой неважно) . И передаем его во флеш . Флеш при запуске отправит код на сервер, мы его проверим, если код верен - отправим данные и сразу удалим наш код и закроем сессию.
Чтобы не быть голословным покажу, как работают сессии
Код:
session1.php
<?php
start_session(); // открыли сессию
$_SESSION['key'] = 123456789;
?>

session2.php
<?php
start_session();
echo $_SESSION['key']; // 123456789;
unset($_SESSION["key"]); // убили переменную
session_destroy();  //убили сессию
?>
Ну вот , запустим первый файл ( прям из броузера ) , а затем второй, увидим на экране 123456789 , запустим еще раз второй - фигу видим, запустим снова первый, а потом второй - опять 123456789. Надеюсь более менее понятно.

Разбираем БД , первый php класс :

Ну вот и добрались мы до работы с БД. Все охватить невозможно, поэтому предположим, что создать базу данных вы смогли сами ( например через какой нибудь мастер на вашем хостинге ( cPanel как вариант ) ) , и уже через phpMyAdmin сумели создать пару таблиц для данной БД (собственно так я и делал ).

Сразу подумаем о том, что к базам данных в будущих проектах нам придется возвращаться , работать с ними и т.п. поэтому возникает мысль написать заготовку( минимальный класс для работы с БД ) . Лезем в документацию по php читаем про классы, - ага все прям как в AS3 ))) приятно .
Вот, что я набросал :

Код:
<?php
	  
                # author : in4core lab
	
                final class DBConnector {
		
		private $link;
		private $results;
		
		public function DBConnector() { }
		
		public function connect_once( $db, $user, $password )
		{
			$this->link = mysql_connect( "localhost", $user , $password );
			
			if (!$this->link) echo "Could not connect: " . mysql_error();
			
			mysql_select_db( $db , $this->link);
		}
		
		public function selectAllFromTable($tableName)
		{
			$query = "SELECT * FROM $tableName";
	
			$this->results = mysql_query($query);
	
			if (!$this->results) echo 'no results : ' . mysql_error();
			
			return $this->results;
		}
		
		public function getEchoFromSelectedTable()
		{
			if ($this->results)
			{	
				echo "Table results\n";
				
				while ($line = mysql_fetch_assoc($this->results) ) 
				{
					print_r ($line);
				}
			}
			else 
			{
				echo "Operation not available";
			}
		}
		
		public function close()
		{
			if($this->link) mysql_close($this->link);
		}
		
		public function insertIntoTable($tableName , $values , $names = NULL )
		{
			if ($names) 
			{
				mysql_query("INSERT INTO $tableName ($names) VALUES ($values)") or die( mysql_error() );
			}
			else 
			{	
				mysql_query("INSERT INTO $tableName VALUES ($values)") or die( mysql_error() );
			}
		}
		
		public function findThis( $arr , $table ) 
		{
			$this->results = $this->selectAllFromTable( $table );
			$good = false;
			
			while ($line = mysql_fetch_assoc($this->results))
			{
				$t = 0;
				
				for ( $i = 0 ; $i < count($arr) ; $i++ )
				{
					$m = $arr[$i];
					
					foreach($line as $value) 
					{	
						if ($value == $m) 
						{
							$t++; 
							break;
						}
					}
				}
				
				if ($t === count($arr) ) $good = true;
			}
			
			return $good ? 1 : -1;
		}
	}

?>
Объяснять все , что я тут набросал уйдет пол дня, поэтому , если что то непонятно советаю читать документацию или спрашивать лично. Но некоторые моменты все же поясню.
1. $this->varname означает что мы работаем с полем класса, а не локальной переменной
2. метод connect_once нужен для соединения с БД , передаем название БД, пользователя и пароль. Следующим шагом , чтобы захватить ВСЕ поля некой таблицы из БД запускаем selectAllFromTable передавая имя таблицы.
Давай те напишем минимальный пример для работы с моим классом

Код:
<?php
include_once("DBConnector.php'); // подцепим наш класс
$o = new DBConnector();
$o->connect_once('dbName' , 'user' , 'password');
$results = $o->selectAllFromTable('tableName');
while($line = mysql_fetch_assoc($results)) 
{
   print_r $line; // показываем массив элементов строки
}
?>
Работать будет )

Усовершенствуем этот скрипт и назовем его логично getData.php
Смотрим листинг
Код:
<?php
    
	if ( isset( $_POST['db'] , $_POST['table'] ) )
	{
		include_once('DBConnector.php');
		
		$dbConnector = new DBConnector();
		
		$USER = 'user'; // db user name
		$PASSWORD = 'pass'; // db password
		$DB = $_POST['db']; // db_name
		$TABLE = $_POST['table'];
		$FORMAT = $_POST['format'] ? $_POST['format'] : "json";
		
		$dbConnector->connect_once( $DB , $USER , $PASSWORD );
		$results = $dbConnector->selectAllFromTable( $TABLE );
		
		if ($FORMAT == "json")
		{
			$arr = array();
			
			while ($line = mysql_fetch_assoc($results) )
			{
				$str = json_encode($line);
				array_push($arr , $str);
			}
		
			$final = implode("," , $arr);
			echo "{" . $final . "}";
		}
		
		else
		{
			echo "<?xml version=\"1.0\"?>\n";
			echo "<data>\n";
			
			while ($line = mysql_fetch_assoc($results) )
			{
				echo "<" . $TABLE . ">\n";
				
				foreach($line as $k => $v)
				{
					echo "<" . $k . ">" . $v . "</" . $k . ">\n";
				}
				
				echo "</" . $TABLE . ">\n";
			}	
			
			echo "</data>";
		}
		
		$dbConnector->close();
	}
    
	else 
	{
		echo "PHP: no post params";
	}
?>
Вот как то так, теперь если мы передаем еще и формат ( хотя можно и не передавать ) , мы сразу получим ответ от базы в стиле либо хмл либо json , что очень круто.

Login / Register :

Продолжим работать с моим классом на примере входа и регистрации.

login.php

Код:
<?php
	if (isset($_POST['name'] , $_POST['password']))
	{
		include_once ('DBConnector.php');
		
		$con = new DBConnector();
		$con->connect_once("db" , "user" , "pass");	
		
		$isOk = $con->findThis( array($_POST['name'] , $_POST['password']) , "tableName");
		
		$con->close();
		
		echo $isOk;
	}
	else echo "PHP : no post params";
?>
Поясняю суть. Мы соединяемся с БД пользователей сайта, и методом findThis ищем совпадения имя = пароль , если прокатывает получаем в ответ 1, если нет то -1. Довольно просто, немного сложнее работать с регистрацией

register.php

Код:
<?php
	if (isset($_POST['name'] , $_POST['password']))
	{
		include_once ('DBConnector.php');
		
		$con = new DBConnector();
		$con->connect_once("db" , "user" , "pass");	
		
		$counts = mysql_query('SELECT COUNT(1) FROM tableName');
		$results = mysql_fetch_array($counts);
		$length = $results[0] + 1; // получили кол-во строк в таблице + 1 для нового id
		
		$name = $_POST['name'];
		$pass = $_POST['password'];
		
		try
		{	
			if ( $con->findThis( array($name) , "tableName") === -1) // проверим есть ли такое же имя в базе
			{
				$con->insertIntoTable("login" , "$length , '$name' , '$pass' , 'no'"); // вставляем новую строку в таблицу ( тоесть нового пользователя). Кол-во элементов = кол-ву столбцов. В момем случае это Id, имя, пароль, привилегии 
				echo  "New user registered : " . "$length , '$name' , '$pass' , 'no'";
			}
			else
			{
				echo "User not registered : this name is occupied";
			}
			
			$con->close();
		}
		catch (Exeption $e)
		{
			echo $e;
			$con->close();
		}
	}
	else echo "PHP : no post params";
?>
Я объясню почему я использовал обертку try/catch . Суть вот в чем, что добавление записей в таблицу очень хитрый процесс , если вы передаете int - то он обязан быть числом, но никак не строкой, а если varchar то обязательно строкой, часто можно ошибиться при этой писанине, поэтому я лучше увижу ошибку, чем буду думать почему данные не возвращаются, хотя or die ( error ) было бы и так достаточно , но на всяк быдло-случай)
Конечно , для людей не знакомых с php много пользы от этого не будет, если тока не брать просто мои либы и использовать их не думая, но уж извините объяснять новый язык с нуля, тяжко) С другой стороны, я сам php не знал тоже, как написал выше, и всю вот эту баланду я написал за 2 дня изучения и тестов, а значит и Вы сможете.
Всем удачи!!!
Всего комментариев 24

Комментарии

Старый 28.06.2012 19:14 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
... :/ Для тех кто в курсе нет ничего нового, для тех кто не трогал php/sql - даже и не знаю... Как минимум нужно больше теории и листинги попроще
Старый 28.06.2012 19:32 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Как минимум нужно больше теории и листинги попроще
Так вот я про себя и говорю, что не трогал раньше, но написать то смог, значит и не так все и сложно собственно
Старый 28.06.2012 19:46 Aloran вне форума
Aloran
Я себе флешевскую часть сделал в виде статического класса:

Код AS3:
package common.managers {
import al.managers.Pool;
import common.URLUtils;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
 
/**
 * ...
 * @author Stepan Ermilov
 */
public class RequestManager extends EventDispatcher
{
    private static var _loaders:Object;
    private static var _onCompleteHash:Object;
    private static var _onErrorHash:Object;
    private static var _keyValue:int = 0;
    private static var _isNonInited:Boolean = true;
 
    private static function init():void
    {
        if (_isNonInited)
        {
            _isNonInited = false;
 
            _loaders = [];
            _onCompleteHash = [];
            _onErrorHash = [];
        }
    }
 
    public static function request(url:String, params:Object = null, needPost:Boolean = true, onComplate:Function = null, onError:Function = null):String
    {
        init();
 
        var key:String = String(++_keyValue);
        var urlRequest:URLRequest = getURLRequest(url, params, needPost);
        var loader:URLLoader = Pool.getItem(URLLoader);
 
        addLoaderEventHeaders(loader);
 
        if (onComplate)
            _onCompleteHash[key] = onComplate;
 
        if (onError)
            _onErrorHash[key] = onError;
 
        _loaders[key] = loader;
        loader.load(urlRequest);
 
        return key;
    }
 
    public static function stopRequest(key:String):void
    {
        init();
 
        removeLoader(key);
    }
 
    public static function sendDebugMail(params:Array, onComplete:Function = null, onError:Function = null):void
    {
        request(URLUtils.getDebugReportToEMailUrl(), params, true, onComplete, onError);
    }
 
    private static function getURLRequest(url:String, params:Object, needPost:Boolean):URLRequest
    {
        var data:URLVariables = new URLVariables();
 
        for (var key:String in params)
        {
            data[key] = params[key];
        }
 
        var result:URLRequest = new URLRequest(url);
        result.method = needPost ? URLRequestMethod.POST : URLRequestMethod.GET;
        result.data = data;
 
        return result;
    }
 
    private static function addLoaderEventHeaders(loader:URLLoader):void
    {
        loader.addEventListener(Event.COMPLETE, onLoaderHeader);
        loader.addEventListener(IOErrorEvent.IO_ERROR, onLoaderHeader);
        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoaderHeader);
    }
 
    private static function onLoaderHeader(event:Event):void
    {
        var loader:URLLoader = event.target as URLLoader;
        var eventName:String = event.type;
        var key:String = getKey(loader);
 
        if (eventName == Event.COMPLETE && key in _onCompleteHash)
            _onCompleteHash[key](event);
        if (eventName != Event.COMPLETE && key in _onErrorHash)
            _onErrorHash[key](event);
 
        removeLoader(key);
    }
 
    private static function getKey(loader:URLLoader):String
    {
        var result:String;
 
        for (var name:String in _loaders)
        {
            if (loader == _loaders[name])
            {
                result = name;
                break;
            }
        }
 
        return result;
    }
 
    private static function removeLoader(key:String):void
    {
        var loader:URLLoader = _loaders[key];
 
        if (loader)
        {
            removeLoaderEventHeaders(loader);
            loader.close();
            loader.data = null;
 
            delete _loaders[key];
            delete _onCompleteHash[key];
            delete _onErrorHash[key];
 
            Pool.returnItem(loader);
        }
    }
 
    private static function removeLoaderEventHeaders(loader:URLLoader):void
    {
        loader.removeEventListener(Event.COMPLETE, onLoaderHeader);
        loader.removeEventListener(IOErrorEvent.IO_ERROR, onLoaderHeader);
        loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onLoaderHeader);
    }
}
}
Pool - еще один статический класс, пулл объектов
Старый 28.06.2012 19:50 in4core вне форума
in4core
 
Аватар для in4core
Ну флешовскую часть можно любую написать в принципе, она тут как посредник только выступает - дайте данные и все тут Поэтому на ней не стал заострять внимание
Старый 28.06.2012 22:50 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Очень печален код php. Нужно, как минимум, во избежании инъекций обрабатывать приходящие данные.

PHP код:
$name mysql_real_escape_string($_POST['name']);
$pass mysql_real_escape_string($_POST['password']);
# для чисел - intval()
$id intval($_POST['id']); 
Но лучше не городить свои велосипеды, а использовать php-фреймворки. Например, Kohana, который задает архитектуру приложения (вид отделен от логики). И все механизмы работы с базой уже продуманы. Можно использовать ORM/ActiveRecord. В этом случае не придется беспокоиться об инъекциях и безопасности и даже думать, какая используется СУБД.

Просто в таком виде php выглядит очень печально, и мне на таком примере Котяре не доказать, что на php можно писать хорошие вещи. Здесь он на самом деле является "быдло кодерством".
Старый 29.06.2012 00:53 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Скоро комикс можно будет сделать.
Написал гипер-умную-статью, которая поможет в разработке и раскрывает тонкости своей темы. Пару дней нет комментов.
Статью написал in4core. За первый час в ночь - дофига комментариев.
FUUUUUUU.


По теме: всегда умиляет, как пример в 3 строчки разбирается в 2 абзацах, а здоровенные блоки кода - "Ой, ну тут что-то сложно, не буду объяснять, вы уж как нибудь сами".
Старый 29.06.2012 02:07 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
Цитата:
Сообщение от Psycho Tiger
Статью написал in4core. За первый час в ночь - дофига комментариев.
Вот он, НАСТОЯЩИЙ ПиАр
Старый 29.06.2012 03:16 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Написал гипер-умную-статью
Едрить какое самомнение. Давай до свидания!


Цитата:
Вот он, НАСТОЯЩИЙ ПиАр
lol

carrotoff. Вот такого коммента я и ждал. Давайте рассказывайте, где быдло кодерство и как оно лечится. Потому что для меня язык новый, но позновать его собираюсь, как минимум полезно.

И так первая тема :
Цитата:
Нужно, как минимум, во избежании инъекций обрабатывать приходящие данные.
Что значит инъекция? что это дает и т.п
Старый 29.06.2012 10:43 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Инъекции
Старый 29.06.2012 11:38 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
SQL-инъекции

Я уже привел в пример Кохану. Можно посмотреть организацию приложения, стиль написания кода. Это отличный пример хорошего программирования на php
Старый 29.06.2012 12:31 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
..и мне на таком примере Котяре не доказать, что на php можно писать хорошие вещи.
А что сразу Котяра
Просто тут как и с AS2, 90% кода написанного на "как-бы AS2", ад и пламень, то же самое можно сказать и про php.
Пост товарища Инфокора тому яркое доказательство.
Старый 29.06.2012 12:48 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Едрить какое самомнение. Давай до свидания!
Вообще то Тигра не про себя, а вообще..
2Тигра
Просто флудить народ любит больше, чем обсуждать серьёзные проблемы. Тем более, что чем ниже уровень статьи, тем больше появляется "знатоков" готовых указать на ошибки, да и просто потроллить.
Соответственно, чем лучше и более специализирована статья, тем выше порог участия в обсуждении.
Заметка о новых сиськах Анджелины Джоли наберёт на много порядков больше комментариев, чем статья об открытии нового мю-мезона в опытах на БАК.
Это шоу-бизнес, детка!
Старый 29.06.2012 18:32 artcraft вне форума
artcraft
 
Аватар для artcraft
кстати, я недавно узнал, из достоверного источника, что скоро будут хорошие новости касающиеся экспериментов на БАК, у них там всё сходится и скоро они нам скажут что-то вроде: "мир устроен именно так мы, физики, предполагали!"
Обновил(-а) artcraft 29.06.2012 в 18:34
Старый 29.06.2012 20:04 DaFive вне форума
DaFive
 
Аватар для DaFive
Я считаю, что в текущей реализации - класс PHP как таковой нафиг не нужен. Он не решает и никак не облегчает те задачи, которые должен. Класс для работы с БД должен выполнять все, что от него потребуется: делать инсерты, выполнять запросы, складывать сложные условия, возвращать количество затронутых строк (в т.ч. и по id запроса), делать апдейты, удалять, ставить кавычки и т.д. и т.п., причем я не должен задумываться как он это делает и нельзя на каждый чих писать свой метод и не должен задумываться, что я передам int, а там text, потому что в базе все равно текст, а в запросе к ней - не все равно.

Сейчас чтобы выбрать данные по какому-то айди, мне нужно написать метод getDataById. Вместо того чтобы написать connector->select(array('id'=>мой_айдишник)); и получить результат в виде ассоциативного массива.

А еще круче, когда класс всё умеет и есть класс сущностей БД, который расширяет connector с своими блекджеками и распутными девицами. Потому что у меня есть 100 таблиц в базе и каждая сущность должна обращаться к своей. И что мне прикажете делать в этом случае? 100 методов в коннекторе создавать?

Для начинающих - не смотрите на реализацию класса, возьмите только взаимодействие с AS (и то пока не вникал в него), и начните с азов PHP, потому что так тут написано - нельзя.
Старый 30.06.2012 12:28 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Цитата:
Но лучше не городить свои велосипеды, а использовать php-фреймворки.
Кому-то лучше пользоваться тем, что создали другие. Кому-то лучше создавать. Зависит.
Старый 30.06.2012 12:31 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
in4core, не хватает методичности и разметки. Попробуй четко выстроить пост в разделы/подразделы и визуально выделить/пронумеровать заголовки.
Старый 30.06.2012 12:53 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Не совсем связываются некоторые комментарии. Их потёрли?
Старый 30.06.2012 13:36 udaaff вне форума
udaaff
На данный момент, нет
Старый 30.06.2012 16:18 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
..и мне на таком примере Котяре не доказать, что на php можно писать хорошие вещи.
Вот непонятно, откуда цитата эта, например
Старый 01.07.2012 00:00 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Psycho Tiger, Ctrl+F рулит — 5-й камент.
Старый 01.07.2012 12:00 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Ах, точно. Честно - искал, но что-то меня подвело. Спасибо )
Старый 01.07.2012 13:25 carrotoff вне форума
carrotoff
 
Аватар для carrotoff
Цитата:
Вот непонятно, откуда цитата эта, например
Эта ссылка на разговор в чате, где я пытался убедить Котяру, что на php можно писать хорошие вещи при недилетантском подходе. Просто напрягает сложившийся стереотип, что php - печальный язык. Всё-таки дело в программисте.

Цитата:
Кому-то лучше пользоваться тем, что создали другие. Кому-то лучше создавать. Зависит.
Ключевое слово - городить.

Вообще, немного истории. Работаю с php давно. Около 2х лет назад собирались слезать с php на RoR или Django, но попался простенький проект, решили попробовать php-фреймворк Kohana. Фреймворк очень простенький, но из-за него мы решили отложить данный переезд.

Сейчас мое мнение такое: сам ЯП php как средство web-программирования полностью спасают фреймворки. Они, как минимум, исправляют много его косяков на своем уровне абстракции. У них задана четкая структура приложения (как RoR/Django, подозреваю они слизаны оттуда), они берут на себя громадный объем рутинной работы. Да и самое главное: у них достаточно высокий порог вхождения, чем страдает сам язык, потому печального кода там несравнимо меньше.

Сейчас мы используем Yii-фреймворк, скоро пересядем на Symfony. Предотвращая сообщения любителей руби и пайтона, напишу сразу, что Django и RoR - это мегакруто и я непременно вернусь к ним, ибо сами эти языки мне симпатичнее.

P.S. - Всё, что я написал про фреймворки, имеет отношение исключительно к web-программированию. Но, когда мы писали сервак под свое приложение, очень много вкусностей были подсмотрены в данных проектах. Потому, когда я ссылаюсь на Кохану, я не предлагаю ее в качестве безальтернативного инструмента, а предлагаю посмотреть КАК это делается правильно.
Старый 01.07.2012 23:28 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Когда-то делал регитрацию и логин, а потом забил.
Теперь смотрю на твой туториал и понимаю, что я ничего не понимаю
Зачем ты выкладывал урок, если тебе лень объяснять код?
Обновил(-а) MikroAcse 02.07.2012 в 16:02
Старый 04.07.2012 21:22 artcraft вне форума
artcraft
 
Аватар для artcraft
Цитата:
Заметка о новых сиськах Анджелины Джоли наберёт на много порядков больше комментариев, чем статья об открытии нового мю-мезона в опытах на БАК.
Это шоу-бизнес, детка!
Цитата:
кстати, я недавно узнал, из достоверного источника, что скоро будут хорошие новости касающиеся экспериментов на БАК, у них там всё сходится и скоро они нам скажут что-то вроде: "мир устроен именно так мы, физики, предполагали!
Вот и свершилось нашли новую частицу и скорее всего это бозон хиггса
 

 


Часовой пояс GMT +4, время: 22:46.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.