Jump to content

Yarik Voronov

Expert
  • Posts

    226
  • Joined

  • Last visited

Everything posted by Yarik Voronov

  1. 1. простой вариант. создать ассоцативный массив в отдельном файле подключаемом include. //menu.php.inc $Menu = array ( "1" => array ( "name"=>"Главная", "file" =>"index.php" ), "2" => array ( "name"=>"Контакты", "file" =>"contacts.php" ), /*. . .*/ "60" => array ( "name"=>"Шестьдесят", "file" =>"60.php" ) ); в дальнейшем редактировать этот файл. а в основном подгружать этот массив и по номеру в списке доставать нужную информацию. 2. оптимальный вариант. организовать аналогичную таблицу в базе данных. и получать запросом только необходимую инфу. ПС, ППС: Более детально смотреть манулы и учебники по работе с массивами и базами данных
  2. точно не определено в каких поисковиках искал человек... Копирование таблиц MySQL
  3. Yarik Voronov

    Дерево

    mario, есть вариант: 4 таблицы + продуманный SQL. определимся что есть статичная информация, что есть модель взаимосвязей. Города и Страны - это статичная информация - заносим ее в 2е таблицы и не паримся больше: Таблица Страны idс | Name Таблица Города cid | idc | Name Теперь модель взаимосвязей: Таблица Тип/Подтип tid | parent_id | Name Таблица TypeCityMap mid | tid | parent_id | cid Выборка SELECT TypeCityMap.tid TypeCityMap.mid, Города.name, Страны.name FROM TypeCityMap LEFT JOIN Города ON TypeCityMap.cid = Города.cid LEFT JOIN Страны ON Города.idc = Страны.idc ORDER BY TypeCityMap.tid, Города.name результат кладем в ассоциативный двумерный массив 1 c ключом tid: array ( [tid] array ( [0] array ( mid, city, country ) [1] array ( mid, city, country ) ) ) так как информация типов разнородна то придется сделать еще один запрос (самый нужный) SELECT * FROM Тип/Подтип ORDER BY Тип/Подтип.parent_id DESC, Тип/Подтип.tid DESC результат кладем в двумерный массив 2 с ключом первой вложенности tid: array ( [tid] array( [0] = typename [1] = parent_id ) ) далее надо раскидать массив 2 в модель дерева. можно сделать на массиве используя рекурентный вызов функции модель на массивах (массив 3): array( [tid] array( // parent_id то же имеет номер в поле tid [tid] array( [tid] array( [пусто] ) ) ) Собственно алгоритм: идем по массиву 3, беря информацию из массива 2, как только попадаем на "пусто" - обращаемя к массиву 1. сделать можно, используя рекурентный вызов функции. PS: зная номер mid таблицы TypeCityMap мы можем собрать нужную цепочку PPS: не только. см классы РНР
  4. Есь еще вариант, кроме session и get. cookie + serialize() / unserialize(). и можно надумать множество вариаций. 2 Veseloff Это относиться к теории экспертных систем и искуственного интеллекта (основопложник теориии фреймов М.Минский). Используется для описания стереотипных знаний/ситуаций как структур. Примерный аналог РНР - класс.
  5. когда Вы пишете руками тег кирилицей, то браузер отправляет кирилицу в кодировке своей ОС. потому что еще не получил заголовок с кодировкой, в которой работает сайт. приведу вам пример алгоритма когда вы работаете в однобайтовой кодировке скрипта, получая запрос в мультибайтовой. Модифицировать алгоритм для частных случаев я думаю Вам не составит труда. /** * скрипт сохранен в windows-1251 */ $RU = urldecode( $_SERVER["REQUEST_URI"] ); $myScriptCharset = "windows-1251"; if ( !preg_match("/[а-я]/i", $RU ) ) { /** * mb_detect_encoding () * только для мультибайтовых кодировок * подробнее http://www.php.su/functions/?cat=mbstring */ $thisCharset = mb_detect_encoding( $RU ); $RU = iconv( $thisCharset, $myScriptCharset, $RU ); header( "Content-type: text/plain; charset=$myScriptCharset" ); header( "Location: $RU" ); exit(); } header( "Content-type: text/html; charset=$myScriptCharset" ); echo urldecode( $_SERVER['QUERY_STRING']); echo "<pre>"; var_dump( $_SERVER['QUERY_STRING'] ); echo "</pre>"; phpinfo(32);
  6. Возможная причина проблемы. Bolmazov, Вы в своих скриптах используете функцию открытия постоянного соединения с базой. Такое соединение остается открытым после завершения скрипта, если Вы такое соединение не закрыли явно. Используется когда следует "гонять" очень большой объем трафика м/у приложением и базой.
  7. 2 -=PSU=- не пропрет у него этот класс: public $rezult;. wsh постоянно будет перезаписывать эту переменную в процессе выполнения своего алгоритма, как и раньше было. там надо что-то типа return $result где $result внутренняя переменная функции, перед каждым запросом чистая. По хорошей логике класс БД должен получить запрос, получить тип ответа, выполнить запрос, отформатировать результат и отдать его, не запоминая. А вот "то что" запросило должно распорядиться с этим результатом как требует "этого чего-то" логика.
  8. Я как и homm предлагаю включить мозг, а не ждать натс. Ты привел конкретный пример я выдал конкретный ответ. Если у тебя 10 запросов и после каждого запроса есть готовый результат то его надо отдать клиенту. если это 10 запросов связывающих 10 таблиц базы данных то проще сделать один "трехэтажный" запрос, и не пренебрегать функционалом базы данных. это мое имхо: есть и плюсы и минусы трехэтажных запросов. но это не относиться к теме. Так же если например 5 таблиц базы данных связывают информацию одного объекта (меню например) а другие 5 другого (информация о контенте) то это два разных объекта. соответственно два разных класса, наследники третьего: работа с базой данных (например). причем экземпляры этих первых двух классов (конечные объекты) не пересекаются в родителе (не имеют общих переменных - т.е названия переменных одни и теже. но физическое адресное пространство разное). Вообще наследовать класс базы данных не есть хорошая логика - так как в 99% случаев требуется лишь один экземпляр этого класса для работы приложения, а не реализация этого класса во множестве других, т.е множество других экземпляров класса базы данных (10 потомков класса создат 10 соединений с БД, умножая на среднее количесво юзеров сайта, получаем нагрузку канала передачи данных; хотя приложение выполняется последовательно, но есть небольшой лимит времени в течение которого существует открытое соединение, ессно дело если ручками его не закрывать). vvsh, если у тебя не получается вникнуть в ОПП на абстрактных процессах, используй материальные: приготовление кофе, например. Чашка, ложка, турка, кофе, сахарница и т.п - это объекты, с определенным интерфесом доступа к своим свойствам. Рецепт кофе: "Кофе по турецки" - это модель. Ты сам - это контроллер, который связывает объекты, их свойста и их методы с моделью для получения результата (представление): попить кофе по турецки. Так что возьми листочек бумаги и коды подейшь пить кофе запиши всю последовательность действий над объектами и их свойствами, сгруппируй, проанализируй, обобщи в классах (шаблонах объектов) и получишь "приложение" кофепития
  9. ня, ня, ня и т.д. долго врубался в час ночи в исходный код. ня. если это то, что надо выбрать из одной таблицы данные по полю другой, то это, как вариант SELECT table2.* FROM table2 LEFT JOIN table1 ON (table2.field2 = table1.field) WHERE table1.field IS NOT NULL; кстати слегка модифицированный пример из манула MySQL Или первый результат записывать в переменню класса наследника, которая не меняется в процессе работы дальнейшего алгоритма.
  10. перед всеми спец символами форматирования строк такими как например \n, \t, \r надо добавить еще один обратный слэшь: \\n, \\t, \\r. тогда будет пониматься что это обратная слэшь + буква. такую замену можно осуществить тем же str_replace() или preg_replace(). соответственно когда осуществляется импорт бэкапа надо делать все наоборот. регуляркой, имхо, удобнее, можно в качестве входных параметров поиска и замены использовать массивы.
  11. Посмотрел. но немного не то, что хотелось бы увидеть. Видимо я сам плохо разъяснил, что нужно. Объясняю в чем подвох моего ТЗ. SC однозначно имеет преимущество когда нужно работать динамически со статичным контентом (набором элементов дерева полученных один раз при загрузке страницы). Но мне не понятно как SC поведет себя при работе динамически с динамическим контентом. Например, расширим ТЗ таким образом: 1. Форма авторизации. после успешной проверки данные должны быть переданы AJAX на сервер. Полученный ответ может быть трех типов: ок + резюме по пользователю + кукер, false (авторизация не удалась), bun + причина отказа. Первый тип ответа должен быть выведен в правой части страницы в виде таблицы (имя, ник, дата регистрации, последний раз был). Второй тип ответа должен быть выведен как системный алерт с активацией формы авторизации (активация предполает все уже описанные действия со второй формой) Третий тип ответа должен быть размещен в области системных сообщений с изменением цвета фона. Форма должна быть очищена (или заменена на кнопку "Logout" - для усложнения) при успешной авторизации. 2. Форма подписки. Если пользователь залогинился - просто подписать на данный контент, отправив методом AJAX уникальный идентификатор контента. Если пользователь не авторизован - предложить авторизоваться, выведя системный алерт с сообщением и активировав форму авторизации. примечание: проверка на авторизованность проверяется наличаем или отсутствием кукера с определенным заранее именем (или динамически определенным - если хочется усложнить) И наверно хватит "расширений". Все эти расширения реализовывать на SC я не предлагаю. Просто поясняю свой "угол зрения", с которого рассматривал пример 7 и все другие: то что ноды (формы) могут не быть размещены в одном контейнере; то что системный алерт может быть заменен на его эмуляцию html; сколько уникальных обработчиков событий надо внедрить; нужно ли переписывать валидатор форм в каждом конкретном случае (состояние окружающих нодов и произошедших событий); сколько имен состояний надо определить; сколько нодов и их атрибутов sc потребуется переписать вручную. Подозреваю, что одним блокнотиком я не обойдусь через пару дней работы. Хочу акцентировать: я не пытаюсь доказать что SC плох. я пытаюсь определить его возможности. А если следует во втором таббере показать по нажатию на к.-л. таб тот контент, который зависит от состояния первого таббера? Что-то не понятно, что имелось в виду под "Именно это нужно в интерфейсах". Если программирование процедур, без инкасуляции конкретных методов, то привожу свои рассуждения. А зачем собственно нужны разные названия методов для операций одного типа? У таббера есть метод "открыть" (показать вкладку) у коментария есть метод "открыть" (показать содержимое), у галереи картинок есть метод "открыть" (показать соответствующую картинку крупным планом). Примечание: галерея, таббер, коментарий существуют одновременно на странице. Понятнее реализовать на мой взгляд типизированный интерфейс. В обыденной жизни мы же говорим "открыть холодильник", "открыть дверь", "открыть кран с водой", "открыть пакет сока", предполагая под этим совершенно разные действия, с разными условиями окружающего мира в конкретный момент времени. С точки зрения ООП: [Холодильник].открыть(); [Кран с водой].открыть(); [Пакет сока].открыть(); [Дверь].открыть(); З.Ы.: sorrow, не стоит отвечать сразу. я тоже человек занятой.
  12. Ну мне лично идея SC нравиться. Хотя она и не лишена недостатков. Один из них насколько я понял после изучения манула - это невозможность задать одни и те же имена состояний для разных объектов, даже для разных экземпляров одного и того же класса. Хотя слова "объекты и классы" в контексте SC употреблять было бы несколько ошибочно. Так как здесь в большинстве своем идет программирование процедур, без инкасуляции конкретных методов: на команду "голос!" хотелось бы чтобы собака лаяла, а кошка - мяукала) То есть, проще говоря, надо набраться фантазии и блокнотиков чтобы не забыть и не перепутать имена состояний и их обработчики. На мой взгляд такая проблема решается просто - объект globalStateController можно сделать двумерным: globalStateController.[AbstractObjectName].States={"state_name":"state_val"}. s0rr0w, Вы просили что-то нетревиальное. Предлагаю. Мне просто интересно как это будет реализовано в SC. Свою реализацию прикрепил. Итак, тазик. 1. Создаем две формы. В первой одно поле типа текст для ввода адреса электронной почты. Во второй, два поля: одно типа текст ("логин"), другое типа пароль ("пароль"). Каждая из форм содержит кнопку типа "сброс" и типа "сабмит". Создаем контейнер вверху страницы для системных уведомлений (например, div) 2. Каждая форма проверяется по нажитию кнопки сабмит своим валидатором (можно одним и тем же) на пусто не пусто в каждом поле. Все поля конкретной формы обязательны к заполнению. 3. Логика по нажатию кнопки "сабмит": если в какой либо форме найдены ошибки - должен быть выведен системный алерт со списком всех ошибок, поля с ошибками должны быть подсвечены, область системных уведомлений должна быть очищена. Данные на сервер не должны быть отправлены. Соответственно если в данный момент подсвечены поля другой формы они должны быть переведены в обычное сотояние. Данные не должны быть сброшены. Если ошибок не найдено в области системных уведомлений должно быть выведено уникальное объявление (Например: "Форма 1 Ошибок не найдено"). Данные проверенной формы на сервер не отправляются. Если подсвечены поля другой формы они должны остаться подсвеченными. 4. По нажатию кнопки "сброс" поля конкретной формы очищаются, область системных уведомлений очищается, если поля формы подсвечены, то они переводятся в обычное состояние. Моя реализация основана на применении технологии Observer - Mediator - Controller. Когда-то читал сабж на сайте Артемия Лебедева "Слабое связывание компонентов в JavaScript. Произвольные события". В кратце суть технологии. В процессе выполнения задачи каждый объект может иметь несколько состояний. Эти состояния именуются. Как только к-л состояние возникает, вызывается метод notify() данного объекта, который оповещает всех подписавшися (observers) на это состояние данного объекта. Mediator - отдельный программный код подписки для каждой конкретной ситуации. Лан, тут все пишут сколько на это ушло времени... В данном случае 3 минуты. На продумывание "тазика" - 15 минут. Ессно дело все это без учета того, что основные классы были мной оформлены и переработанны более полугода назад. OI.utf8.rar
  13. Yarik Voronov

    ROOT

    <?php echo $_SERVER['DOCUMENT_ROOT'].dirname(__FILE__);?>
  14. 2 Mihahail, JS - это не только document.write(); <script type="text/javascript"> var newCODE='<br><table><tr><td><fieldset style="border: 1px solid #494949"><legend>Миничат:</legend>$CHAT_BOX$</fieldset></td><td>' + informer() +'</td></tr>', element; siteDIVs=document.getElementsByTagName("div"); ..... </script> function informer () { return "<div style=\"border-bottom: 1px solid black;\"><a href=\"http://aonmap.ru/forum/11-27-0-17\">Гро'гот, Орк Наемн</a></div>"; }
  15. 2 ekklesiast. имхо: для параноиков. в 99% случаев используется для взлома уязвимость конкретного алгоритма, а не то как будет назван файл с этим алгоритмом. то есть без разницы как назвать, смысл в том, что уязвимый скрипт сервером выполняется, а соответственно можно сделать пакость. С другой стороны - раз такой сабж опубликован, значит взломщик - осведомлен. и ему потребуется чуть больше времени.
  16. Да. Точно. Структура подгружается. ———————————————————————— На этом я думаю все. По крайней мере я не намерен больше высказываться. Спасибо.
  17. Если работает не должным образом. значит не классно. Выкладываю два варианта. В версии 1.1 изменил немного алгоритм. readme внутри В версии 2.0 принципиально переделал алгоритм, подключив новый объект к highlight.js - кнопки добавляются сразу после создания форматированного блока кода. соответственно больше исправлений в highlight.js. readme тоже внутри архива. Все изначальные "неудовлетворительные" блоки в highlight.js закоментированы /**/ В обоих вариантах полностью почистил код-html от исходного форматирования сайта, за исключением необходимых стилей. addButtons_v1.1.zip addButtons_2.0.zip
  18. Прилагаю описание структуры исходных данных и алгоритма скрипта example.js описание сухое и слегка неофициальное. Влад, пытался по другому сверстать - никак под IE 6 не получается у меня скрыть текст в теге <pre> (организовать полосу прокрутки). может по-другому кнопки расположить? или пусть ослик отдыхает? Вообще-то еще подумаю, поищу в нете, на форуме. README_addButtons.zip
  19. Влад, вот что получилось: 1. за основу взял расположение кнопок как в разделе html-теги (справа-снизу). получилось вполне нормально в Opera 9.63, FF3. IE6SP2 - отдыхает. Верстальщик из меня так себе, если будут другие варианты расположения кнопок скрипт переделаю. 2. подправил сам скрипт highlight.js (который сжат) теперь он оставляет исходники. перед внесенными исправлениями в скрипте стоит /*/* двойной коментарий. 3. создал новый файл example.js - собственно который добавляет кнопки. к сожалению к нему коментов написать не успеваю... вечером. напишу. может заодно какие новые идеи по поводу оптимизации алгоритма придут. 4. opacity.html - с которого все начинается. opacity.html - это просто сохраненный и подрезанный (пардон) исходник кода и стилей из раздела CSS. в его коде сделал небольшие коментарии. кстати есть маленький нюанс: подключать example.js надо перед highlight.js, а то IE6 не успевает сформировать нужную структуру тегов. скорее всего это можно решить по-другому. opacity_addButtons.zip
  20. ага. вижу. сейчас буду "ковырять".... Влад, там одна заноза есть. похоже новый скрипт удаляет из дерева <pre><code></code></pre> исходник. распарсивать то что получается "взад" смысла нет - получатся те же тормоза. наверно надо будет подправить скрипт highlight-ра. ушел "ковырять"
  21. 2 Zeroglif, да точно. спасибо. заодно пересмотрел манулы. мой пример не в тему. по поводу передачи параметров "по ссылке"/"по значению". пришел для себя к выводу: функция работает с адресным пространством в зоне своей видимости, а это могут быть как глобальные так и локальные объекты/переменные. "куда показал - то и возьмет".
  22. Влад, если я правильно понял, старый скрипт делает подстветку через <div><ol><li><span> (_http://www.dreamprojections.com/syntaxhighlighter). в эту структуру внедряется <div> с кнопками показа примера. Новый скрипт формирует подсветку на базе <pre><code> и в него кнопки не внедряются. другой <pre> c исходным кодом как был так и остается. Вопрос. можно получить результирующий код подсветки нового скрипта (<pre><code>)? или хотя бы ссылочку на источник где этот новый скрипт подсветки можно скачать. Надо посмотреть с точки зрения верстки куда там можно внедрить кнопки и вообще какая получается структура тегов.
  23. Не. Еслиб так было.... В Java Script насколько я помню в 99% случаев параметр передается по ссылке, а не по значению. function createMyObject (inp) { this.localVariable = {value: inp}; this.alert = function () {return this.localVariable.value} } MyObject0 = new createMyObject ('local1'); MyObject1 = new createMyObject ('local2'); alert([MyObject0.alert(),MyObject1.alert()]); MyObject1.localVariable.value = "valueNext"; alert([MyObject0.alert(),MyObject1.alert()]);
  24. Zeroglif, конечно я могу ошибиться. Поправьте меня если что-то не так. Функция изначально до ее вызова существует формально. Как только к ней идет обращение, происходит выделение памяти под ее локальные переменные, копирование значений входных параметров или передача их по ссылке. далее происходит выполнение операций внутри тела функции и возвращение результата. После того как функция отработала ее переменные обнуляются и удаляются из динамической памяти. Функция переходит в формальное состояние. И так до следующего вызова. То есть function () {} это на самом деле шаблон, по которому в процессе выполнения скрипта создаются экземпляры функции. Что я вижу в приведенном коде. Я вызываю конструктор. Директива new создает пустой объект. Вызывается функция сreateMyObject. ей передается по значению параметр inp и this - как указатель на пустой объект. В функции сreateMyObject локальная переменная функции localVariable приводиться автоматически к типу Object. в этот локальный объект внутри функции свойству value присваивается значение inp. Далее у пустого объекта (созданного директивой new) создается метод alert по принципу замыкания и это замыкание указывает на локальный объект функции сreateMyObject (причем вполне конкретный). Собственно все- объект MyObject0 создан. И размещен в памяти. Но экземпляр сreateMyObject не может быть удален из памяти, потому что на него ссылается MyObject0, точнее на локальную переменную localVariable функции сreateMyObject с конкретным значением. То же самое происходит во второй раз. Итого 2 + 2 = 4 объекта в памяти. Или я не прав?
  25. Для пояснения приведу расширенный пример function createMyObject (inp) { var localVariable = {value: inp}; this.alert = function () {return localVariable.value} } MyObject0 = new createMyObject ('local1'); MyObject1 = new createMyObject ('local2'); alert([MyObject0.alert(), MyObject1.alert()]); Теперь у нас в динамической памяти два экземпляра конструктора и по одному экземпляру объекта. Итого 4 объекта. каждому нужна память, для хранения своих свойств. function createMyObject (inp) { this.localVariable = {value: inp}; this.alert = function () {return this.localVariable.value} } MyObject0 = new createMyObject ('local1'); MyObject1 = new createMyObject ('local2'); alert([MyObject0.alert(), MyObject1.alert()]); Конструктор переходит в неактивное состояние. Память для хранения его переменных не требуется. Он отработал свое и лежит формально, пока не будет вызван.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy