Эта тема на forum.dklab.ru


Юрий Насретдинов: База данных на PHP
См. аттачмент (к сожалению с кодом возникли глюки)
Юрий Насретдинов:
Что это ?!?
Юрий Насретдинов:
Эх, как хорошо, когда Punto Switcher записывает все, что я ввожу :).

Дополнение к этому обрезанному куску кода:

Описание функций я думаю даже излишне подробное, так что не буду на этом зацикливаться.
Пример импровизиировнной "гостевой" на этой "базе данных":


<?
include("kernel.php");
$sql=new yoursql;
//**
if(isset($_POST['message']))
{
$sql->connect();
$sql->create_table('test', array( 'id' => 'int', 'name' => 'varchar(50)', 'message' => 'text' ), array( 'id' => 'primary' ) );
if($sql->insert('test',array('name'=>$_POST['name'],'message'=>$_POST['message'],'id'=>rand(0,pow(2,30)))))
{
echo "Запостили успешно.";
}else
{
echo "Ну елы-палы :(. База сказала что ".$sql->error;
}
}
echo "<form action='".basename(__FILE__)."' method=post>\n";
echo "Добавить еще запись:<br><input type=text name=name value='Ник'><br>\n";
echo "<textarea style='width:50%;height:100px;' name=message>то, что вы хотите сказать</textarea><br>\n";
echo "<input type=submit value='Запостить !'>\n";
echo "</form>";
//**
$f=fopen($sql->datapath."/test","rb");
$result=explode($sql->rseparator,fread($f,filesize($sql->datapath."/test")));
fclose($f);
//**
echo "<hr>То, что уже накалякали:<br><br>";
foreach($result as $value)
{
if(empty($value)) continue;
$tmp=str_replace($sql->alternate,$sql->separator,explode($sql->separator,$value));
$tmp=str_replace($sql->ralternate,$sql->rseparator,$tmp);
echo "<i>".$tmp[1]."</i> сказал: \"".$tmp[2]."\", и получил ID ".$tmp[0]."<br>";
}
?>


Почему я не стал делать функцию update - хочется спросить у профи :) :
1) возможно ли "раздвинуть" файл с помощью стандартных функций ? (полное переписывание файла исключено - база данных должна работать без сбоев, и не должно быть возможности скажем случайно стереть всю базу данных)
2) если нет, имеет ли смысл резервировать часть места в таблице для того, чтобы сделать возможность редактирования полей ?
3) если 1) и 2) не подходят, напрашивается вопрос - а как это реализовано в других базах данных (использование flock исключено)
()
?
Я пока что могу гарантировать полную надежность данных :). Потому что нету даже функций чтения... Хотя индексирование уже заложено :)
Дмитрий Эсс:
yUAC:
2 идеи.
1) Переписывать обновлённую БД в другой файл, а старый потом удалять. Так данные не потеряются.
2) Задавать органичение на длину поля таблицы при её создании и заполнять всё оставшееся место пробелами. Но это не экономично.
Дмитрий Котеров:
У меня три вопроса.
1. Что ЭТО делает в "Готовых решениях"?
2. Зачем это все нужно, когда есть готовые СУБД, а в PHP5 вообще встроена sqLite?
3. Неужели ты думаешь, что возможно написать на PHP хотя бы на 1% работающую СУБД, которая бы где-то пригодилась? Для сравнения: исходники Berkeley DB занимают больше 100000 строк на Си. И это при том, что эта СУБД не поддерживает SQL, а работает лишь с файлами, подобными ассоциативным массивам (ключ-значение — и это все!). При этом она, правда, поддерживает транзакции и целостность данных при сбоях.
Дмитрий Котеров:
Перенесено из форума: Программирование::PHP::Склад готовых решений.
Перенесено в форум: Программирование::PHP::Все в кучу.
Юрий Насретдинов:
Неужели ты думаешь, что возможно написать на PHP хотя бы на 1% работающую СУБД, которая бы где-то пригодилась?
Хм. Конечно можно. Совершенно другой вопрос - насколько быстро и надежно она будет работать.

Зачем это все нужно, когда есть готовые СУБД, а в PHP5 вообще встроена sqLite?
Да, но PHP5 есть не у всех (пока что :)), и к тому же ИМХО хостеры могут ограничивать доступ к базе данных, и т.д.

больше 100000 строк на Си
Это не так много, у Apache гораздо больше.
Юрий Насретдинов:
Мне честно говоря интересен именно алгоритм изменения данных - вариант с переименованием тоже конечно не катит, а уж резервирование места тем более. Можете хотя бы примерно подсказать алгоритм, как это сделано в других БД ? (если он конечно не ужасно сложен)
Дмитрий Эсс:
yUAC:
http://russian.joelonsoftware.com/Articles/BacktoBasics.html
там написано вот что, не знаю, насколько это соответствует правде.
В реляционной базе данных каждая строка в таблице (например, в таблице books) имеет одинаковую длину в байтах, и каждое поле находится по фиксированному смещению относительно начала строки. Так что, например, если каждая запись в таблице books имеет длину 100 байт, и поле author находится по смещению 23, то имена авторов расположены начиная с байтов 23, 123, 223, 323, и т.д.
Дмитрий Котеров:
Да, но PHP5 есть не у всех
Вообще-то, не так уж и трудно его откомпилировать и положить в CGI-директорию. А можно и бинарники найти для почти любой ОС. Так что, можно считать, что он есть у всех.
Юрий Насретдинов:
Дмитрий Котеров:
OK, выйдет твоя книга, прочитаю и установлю :). А пока можно ответить на мой глюпый вопросик ;) ?
Дмитрий Котеров:
А уже ответили тут.
Юрий Насретдинов:
А уже ответили тут.
А есть еще какие-то другие варианты ;) ? Ладно, попробую сделать без update, или только update численных полей
blazch:
А вот вопрос: Имеется БД и куча картинок (каждой картинке соответствует своя инфа) с которыми идет постоянная работа есть ли разница в скорости работы скрипта и быстродействия вообще, если эти картинки в бинарном виде залить в БД (в отличии от обычного их хранения в папочке) - не упадет ли скорость?
Дмитрий Котеров:
Зависит от того, как Вы картинки будете отдавать. Сделаете криво — скорость упадет. Сделаете нормально (с кэшированием) — нет.
blazch:
Сделаете криво — скорость упадет. Сделаете нормально (с кэшированием) — нет. А как сделать?
И что Вы подразумеваете под (с кэшированием)?
blazch:
Почему код <?php
$f=fopen("cap.jpg","rb");
$upload=fread($f,filesize("cap.jpg"));
fclose($f);
$upload=addslashes($upload);
@$db = mysql_pconnect($host,$user_db,$pass_db);
mysql_select_db($name_db);
mysql_query("INSERT INTO news VALUES ('NOT NULL','news','$upload','jkjlkjsfsdf','12.12.04')");
$result = mysql_query("select image from news");
$row = mysql_fetch_array($result);
echo $row['image'];
?> работает (выводит картинку), а вот код<?php
$f=fopen("cap.jpg","rb");
$upload=fread($f,filesize("cap.jpg"));
fclose($f);
$upload=addslashes($upload);
@$db = mysql_pconnect($host,$user_db,$pass_db);
mysql_select_db($name_db);
mysql_query("INSERT INTO news VALUES ('NOT NULL','news','$upload','jkjlkjsfsdf','12.12.04')");
$result = mysql_query("select image from news");
$row = mysql_fetch_array($result); ?>
<html><body><p align=center><?php echo $row['image']; ?></p></body></html>
выводит абрак-адабру? Как я понимаю надо использовать header, но он ставится до вывода кода, а если картинка должна выводится не одна (сопровождается контентом - целая страница и заголовок у нее уже есть типа html/.. и все такое)?
Евгений Галашин:
STFW!

http://php.spb.ru/php/image.html

картинку отдавать должен отдельный скрипт.
blazch:
STFW!

http://php.spb.ru/php/image.html

картинку отдавать должен отдельный скрипт. в смысле (подробнее, если не сложно).
Евгений Галашин:
Статью читали?

Броузеру(ИЕ) нужно, чтобы изображение задавалось в отдельном файле. (см. тему ДК на точке)
поэтому пишем <img src="image.php?id=123"> а в image.php выдаем картинку, как в статье.
blazch:
Спасибо. Читал, а больше никакого способа нет?
Дмитрий Котеров:
Нет. Это как раз и есть «узкое место» при хранении картинок в базе.

Кэширование заключается вот в чем: после извлечения из базы сразу же сохраняете картинку во временный файл. При запуске же скрипта проверяете: если временный файл, созланный с прошлых разов, есть, тогда ни в какую базу не лезете, а сразу же его и выводите. А иначе — из базы.

Это дело можно оптимизировать через mod_rewrite — там есть флажок, позволяющий проверять существование файла. Так что наличие временного файла проверяется в самом начале, и, только если его нет, запускается скрипт.

Преимущества неоспоримы:
1. Можно как угодно чистить директорию временных файов, это не скажется на работоспособности, и
2. Можно манипулировать картинками в базе, как простыми записями (поддержка целостности и все такое).

Минус — только один: при кривой реализации будет тормозить (при нормальной — не будет).

P.S.
Прежде, чем спрашивать, «куда лошать запрягают», попробуйте все же разобраться в написанном.
И еще внимательно прочитайте http://xpoint.ru/archive/threads/68/13645.html
blazch:
Спасибо.
7.3.:
STFW!
Так... совсем недавно я узнал что значит RTFM (read this f*cking manual). А это что означает? Тоже по-видимому без мата не обошлось.
Дмитрий Эсс:
7.3.:
Search The F-ing Web.
7.3.:
Так и знал! :)) Млин, и все же мат так расслабляет. (я уже начинаю понимать в каких случаях) Надо бы русский аналог придумать. Чтоб от души.
Юрий Насретдинов:
Ну блин, оффтопик развели, понимаешь :)

Эта тема на forum.dklab.ru