FSD - учим php/sql
Запись от in4core размещена 28.06.2012 в 18:23
Предисловие :
FSD ( flash->server->dataBase) Так решил я озаглавить данную статейку. Речь пойдет о взаимодействии флеша с сервером, а сервера с БД , получение данных, отправка POST , работа с сессиями и т.п.
Что нужно знать, чтобы понять статью :
1. As3 / PHP - хотя бы на уровне любителя. ( но php буду объяснять, но мало )
2. Форматы xml / json , понятие, что такое БД.
По скольку php я не знал до сего дня вообще, часть кода ПОНИМАЮЩИМ людям может показаться быдло кодерством, поэтому сразу правим меня. Но думаю , документации, уроков и знания клиентских языков мне хватило, чтобы написать следующую либу
Немного рассуждения :
Сегодня наша с Вами задача научится отправлять данные на сервер, обрабатывать их и т.п., причем серверные скрипты мы будем писать сами, и так создадим вот такую оберточку
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); }
Эта процедура нам ясна с детских лет, поэтому разговаривать о ней не будем, а сразу перейдем к серверу.
Из флеша будем делать вот такой запрос :
Далее создадим файл someUrl.php и сохраним его на сервере.
Код:
<?php $var1 = $_POST['var1']; $var2 = $_POST['var2']; $var3 = $_POST['var3']; echo $var1 . "/" . $var2 . "/" . $var3 ; ?>
Метод 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'; ?>
Кое какая, но безопасность :
Тут мы поговорим о сессиях в пхп. Сессия это очень полезная вещь смысл приблизительно такой :
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(); //убили сессию ?>
Разбираем БД , первый 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"; } ?>
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"; ?>
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"; ?>
Конечно , для людей не знакомых с php много пользы от этого не будет, если тока не брать просто мои либы и использовать их не думая, но уж извините объяснять новый язык с нуля, тяжко) С другой стороны, я сам php не знал тоже, как написал выше, и всю вот эту баланду я написал за 2 дня изучения и тестов, а значит и Вы сможете.
Всем удачи!!!
Всего комментариев 24
Комментарии
28.06.2012 19:14 | |
... :/ Для тех кто в курсе нет ничего нового, для тех кто не трогал php/sql - даже и не знаю... Как минимум нужно больше теории и листинги попроще
|
28.06.2012 19:32 | |
Цитата:
Как минимум нужно больше теории и листинги попроще
|
28.06.2012 19:50 | |
Ну флешовскую часть можно любую написать в принципе, она тут как посредник только выступает - дайте данные и все тут Поэтому на ней не стал заострять внимание
|
29.06.2012 02:07 | |
Цитата:
Сообщение от Psycho Tiger
Статью написал in4core. За первый час в ночь - дофига комментариев.
|
29.06.2012 10:43 | |
Инъекции
|
29.06.2012 11:38 | |
SQL-инъекции
Я уже привел в пример Кохану. Можно посмотреть организацию приложения, стиль написания кода. Это отличный пример хорошего программирования на php |
29.06.2012 18:32 | |
кстати, я недавно узнал, из достоверного источника, что скоро будут хорошие новости касающиеся экспериментов на БАК, у них там всё сходится и скоро они нам скажут что-то вроде: "мир устроен именно так мы, физики, предполагали!"
|
|
Обновил(-а) artcraft 29.06.2012 в 18:34
|
30.06.2012 12:28 | |
Цитата:
Но лучше не городить свои велосипеды, а использовать php-фреймворки.
|
30.06.2012 12:31 | |
in4core, не хватает методичности и разметки. Попробуй четко выстроить пост в разделы/подразделы и визуально выделить/пронумеровать заголовки.
|
30.06.2012 12:53 | |
Не совсем связываются некоторые комментарии. Их потёрли?
|
30.06.2012 13:36 | |
На данный момент, нет
|
30.06.2012 16:18 | |
Цитата:
..и мне на таком примере Котяре не доказать, что на php можно писать хорошие вещи.
|
01.07.2012 00:00 | |
Psycho Tiger, Ctrl+F рулит — 5-й камент.
|
01.07.2012 12:00 | |
Ах, точно. Честно - искал, но что-то меня подвело. Спасибо )
|
01.07.2012 13:25 | |
Цитата:
Вот непонятно, откуда цитата эта, например
Цитата:
Кому-то лучше пользоваться тем, что создали другие. Кому-то лучше создавать. Зависит.
Вообще, немного истории. Работаю с php давно. Около 2х лет назад собирались слезать с php на RoR или Django, но попался простенький проект, решили попробовать php-фреймворк Kohana. Фреймворк очень простенький, но из-за него мы решили отложить данный переезд. Сейчас мое мнение такое: сам ЯП php как средство web-программирования полностью спасают фреймворки. Они, как минимум, исправляют много его косяков на своем уровне абстракции. У них задана четкая структура приложения (как RoR/Django, подозреваю они слизаны оттуда), они берут на себя громадный объем рутинной работы. Да и самое главное: у них достаточно высокий порог вхождения, чем страдает сам язык, потому печального кода там несравнимо меньше. Сейчас мы используем Yii-фреймворк, скоро пересядем на Symfony. Предотвращая сообщения любителей руби и пайтона, напишу сразу, что Django и RoR - это мегакруто и я непременно вернусь к ним, ибо сами эти языки мне симпатичнее. P.S. - Всё, что я написал про фреймворки, имеет отношение исключительно к web-программированию. Но, когда мы писали сервак под свое приложение, очень много вкусностей были подсмотрены в данных проектах. Потому, когда я ссылаюсь на Кохану, я не предлагаю ее в качестве безальтернативного инструмента, а предлагаю посмотреть КАК это делается правильно. |
01.07.2012 23:28 | |
Когда-то делал регитрацию и логин, а потом забил.
Теперь смотрю на твой туториал и понимаю, что я ничего не понимаю Зачем ты выкладывал урок, если тебе лень объяснять код? |
|
Обновил(-а) MikroAcse 02.07.2012 в 16:02
|
04.07.2012 21:22 | |
Цитата:
Заметка о новых сиськах Анджелины Джоли наберёт на много порядков больше комментариев, чем статья об открытии нового мю-мезона в опытах на БАК.
Это шоу-бизнес, детка! Цитата:
кстати, я недавно узнал, из достоверного источника, что скоро будут хорошие новости касающиеся экспериментов на БАК, у них там всё сходится и скоро они нам скажут что-то вроде: "мир устроен именно так мы, физики, предполагали!
|
Последние записи от in4core
- Система диалогов, создаем подобие old School типа Fallout. (07.05.2014)
- MVC в игорной индустрии (27.11.2012)
- Якорь мне .... ))) Или History API (06.11.2012)
- FSD - учим php/sql (28.06.2012)
- I4Logger - простой и компактный логгер (06.05.2012)