Используя PHP, мы можем не только выполнять некоторый код прямо на uCoz, но и сохранять результат работы на нашем сервере. Давайте рассмотрим подробнее, как. Сразу надо отметить, что хостинг uСoz не предоставляет базы MySQL, не смотря на то, что PHP уже есть. И у этой проблемы есть два решения.
Сторонний хостинг с поддержкой MySQL и удалённого доступа к ней.
Рассматривать бесплатный хостинг смысла нет. Дело в том, что нам нужно будет только база от них, а не сайт, а это частично нарушает их правила, т.к. выгоды от вас владельцу бесплатного хостинга нет никакой, ваш сайт у них не размещается и вставить свою рекламу вам они не смогут.
Из платных хостингов можно посоветовать следующие:
После получения данных к подключению MySQL можно приступать к работе с базой, используя функции mysql_connect() и т.п.
Конечно, есть нюанс. Если вас не смутит отдельная плата за PHP на сервере uCoz, и отдельная плата за MySQL на другом сервере сторонней хостинг-компании, где вы в придачу получите ещё и всё тот же PHP, тот этот вариант вам подойдёт. В иных же случаях придётся смотреть в сторону собственноручных решений.
База данных на сервере uCoz своими силами.
В папке /scripts создайте файл с именем my.db. Вставьте в него следующий код:
Code
<?php
$mydb = array();
?>
Давайте теперь напишем функции для работы с нашей "базой данных". Создайте в той же папке файл mydb.php. Этот файл будет содержать наши функции. Функция для подключения (чтения) к базе данных:
Code
function mydb_read(){
$mydb = false;
if(!is_file('my.db')) return false;
include('my.db');
return $mydb;
}
Возвращает массив всех данных, с которым потом можно работать дальше. При ошибке возвращается FALSE. Иногда при такой ошибке стоит выполнить повторно функцию mydb_read().
Функция записи в базу данных:
Code
function mydb_write($data){
$f = fopen( ($n=rand(0,1000000)), "w+" );
fwrite( $f, '<?php $mydb='.var_export($data, true).'; ?>' );
fclose($f);
rename($n, 'my.db');
}
RENAME - это атомарная, т.е. неделимая, функция операционной системы. Благодаря этому можно значительно обезопасить запись в файл нашей базы данных. Но есть небольшой нюанс, который может привести к ошибке чтения (в функциях выше я учёл то). Когда PHP выполняет функцию rename и файл назначения уже существует, то сначала удаляется файл назначения, а затем лишь происходит rename. И это ДВЕ ОТДЕЛЬНЫЕ операции.
Подводя некоторые итоги, можно сказать, каким должен быть в целом файл mydb.php:
Code
<?php
function mydb_read(){
$mydb = false;
if(!is_file('my.db')) return false;
include('my.db');
return $mydb;
}
function mydb_write($data){
$f = fopen( ($n=rand(0,1000000)), "w+" );
fwrite( $f, '<?php $mydb='.var_export($db, true).'; ?>' );
fclose($f);
rename($n, 'my.db');
}
?>
Как использовать эти функции - думаю, разобраться не сложно. Например:
Code
<?php
include('mydb.php'); //не забываем подключать наш файл для работы с базой данных!!!
$data = mydb_read();
//записываем род занятий для пользователя с userid == 1 в новое поле
$data[1]['rod'] = 'эльф 80 уровня';
mydb_write($data);
//узнать род занятий пользователя с userid == 237
echo $data[237]['rod'];
?>
В нашем примере я не использовал сериализацию: в PHP при больших массивах она работает крайне медленно. И всё-таки, для больших и сложных баз данных хранение в текстовом файле может привести к ошибкам, сбоям и ограничениям на лимиты памяти PHP uCoz, особенно если к базе будет частое обращение. В этом случае вам придётся использовать MySQL на стороннем хостинге. Если же вы очень хотите использовать MySQL, но не на стороннем хостинге, а на uCoz, могу порекомендовать txtSQL — это PHP-класс, реализующий красивый и удобный интерфейс работы с базой, этакий аналог MySQL без собственно MySQL. Или MooSQL — СУБД на PHP с намеком на MySQL-совместимый синтаксис. Эта СУБД является продолжением YNDb.