Базы данных на основе плоских файлов [закрываются]

Элемент, который вы пытались найти, не был в DOM , когда ваш скрипт работал.

Позиция вашего DOM-зависимого скрипта может оказать глубокое влияние на его поведение. Браузеры анализируют HTML-документы сверху донизу. Элементы добавляются в DOM, и сценарии выполняются (как правило), когда они встречаются. Это означает, что порядок имеет значение. Как правило, скрипты не могут найти элементы, которые появляются позже в разметке, потому что эти элементы еще не добавлены в DOM.

Рассмотрим следующую разметку; сценарий # 1 не находит

, а сценарий # 2 преуспевает:


test div

Итак, что вы должны делать? У вас есть несколько вариантов:


Вариант 1: Переместите свой скрипт

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


  
  

Примечание: размещение скриптов внизу как правило, считается лучшей практикой .


Вариант 2: jQuery's ready()

Отмените свой сценарий до тех пор, пока DOM не будет полностью проанализирован, используя ready() :



Примечание. Вы можете просто привязать к DOMContentLoaded или window.onload, но у каждого есть свои оговорки. jQuery ready() предоставляет гибридное решение.


Вариант 3: Делегирование событий

Делегированные события имеют преимущество в том, что они могут обрабатывать события из элементов-потомков, которые будут добавлены в документ позже.

blockquote>

Когда элемент вызывает событие (при условии, что это bubbling g6], и ничто не останавливает его распространение), каждый родитель в родословной этого элемента также получает событие. Это позволяет нам привязать обработчик к существующему элементу и примерным событиям, когда они пузырятся от его потомков ... даже те, которые добавлены после присоединения обработчика. Все, что нам нужно сделать, это проверить событие, чтобы узнать, был ли он поднят нужным элементом и, если да, запустите наш код.

jQuery on() выполняет эту логику для нас. Мы просто предоставляем имя события, селектор для желаемого потомка и обработчик событий:



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


Вариант 4: Атрибут defer

Используйте атрибут defer в

Для справки, вот код из этого внешнего скрипта :

document.getElementById("test").addEventListener("click", function(e){
   console.log("clicked: %o", this); 
});

Примечание: атрибут defer, безусловно, кажется , как волшебная пуля , но важно знать об оговорках ... 1. defer может использоваться только для внешних скриптов, т. е. для тех, у кого есть атрибут src. 2. знать о поддержке браузера , то есть: ошибка реализации в IE & lt; 10

116
задан meDeepakJain 8 November 2019 в 09:37
поделиться

7 ответов

Ну, какова природа плоских баз данных. Действительно ли они являются большими или маленькими. Это - простые массивы с массивами в них? если что-то простое говорит профили пользователей, созданные как таковой:

$user = array("name" => "dubayou", 
              "age" => 20,
              "websites" => array("dubayou.com","willwharton.com","codecream.com"),
              "and_one" => "more");

и сохранить или обновить запись дБ для того пользователя.

$dir = "../userdata/";  //make sure to put it bellow what the server can reach.
file_put_contents($dir.$user['name'],serialize($user));

и загружаться запись для пользователя

function &get_user($name){
    return unserialize(file_get_contents("../userdata/".$name));
}

, но снова эта реализация будет варьироваться на приложении и природе базы данных, в которой Вы нуждаетесь.

74
ответ дан Paul Fleming 24 November 2019 в 02:16
поделиться

Вы могли бы рассмотреть SQLite. Это почти столь же просто как плоские файлы, но Вы действительно получаете механизм SQL для запросов. Это работы хорошо с PHP также.

48
ответ дан yukondude 24 November 2019 в 02:16
поделиться

По-моему, с помощью "Базы данных на основе плоских файлов" в смысле Вы имеете в виду (и ответ, который Вы приняли), не neccesarily лучший способ пойти о вещах. В первую очередь, использование serialize() и unserialize() может вызвать СИЛЬНЫЕ головные боли, если кто-то входит и редактирует файл (они могут, на самом деле, поместить код arbritrary в Вашу "базу данных", которая будет выполнена каждый раз.)

Лично, я сказал бы - почему бы не смотреть в будущее? Были так много раз, что у меня были проблемы, потому что я создавал свои собственные "собственные" файлы, и проект взорвался к точке, где ему нужна база данных, и я думаю, что "Вы знаете, мне жаль, что я не записал это для базы данных для запуска с" - потому что рефакторинг кода занимает слишком много времени и усилия.

От этого я узнал, что, соответствуя требованиям завтрашнего дня мое приложение так, чтобы, когда это становится больше, я не шел и провести дни, осуществляя рефакторинг, является способом продвинуться. Как я делаю это?

SQLite. Это работает базой данных, использует SQL и довольно легко перейти на MySQL (espescially при использовании абстрагированных классов для управления базой данных как, я делаю!)

На самом деле, espescially с "принятым ответом" метод, это может решительно сократить использование памяти Вашего приложения (Вы не должны загружать все "ЗАПИСИ" в PHP)

20
ответ дан Mez 24 November 2019 в 02:16
поделиться

Одна платформа, которую я рассматриваю, была бы для платформы блоггинга. Так как примерно любое возможное представление данных, которые Вы хотели бы, будет отсортировано по дате, я думал об этой структуре:

Один каталог на узел содержания:

./content/YYYYMMDDHHMMSS/

Подкаталоги каждого узла включая

/tags  
/authors  
/comments  

, А также простые текстовые файлы в каталоге узла для пред - и постпредставленное содержание и т.п..

Это позволило бы простому вызову PHP glob() (и вероятно реверсирование массива результата) запрашивать на примерно чем-либо в структуре содержания:

glob("content/*/tags/funny");  

Был бы обратные каналы включая все статьи, отмеченные "забавный".

12
ответ дан H. Pauwelyn 24 November 2019 в 02:16
поделиться

Вот код, который мы используем для Lilina:

<?php
/**
 * Handler for persistent data files
 *
 * @author Ryan McCue <cubegames@gmail.com>
 * @package Lilina
 * @version 1.0
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */

/**
 * Handler for persistent data files
 *
 * @package Lilina
 */
class DataHandler {
    /**
     * Directory to store data.
     *
     * @since 1.0
     *
     * @var string
     */
    protected $directory;

    /**
     * Constructor, duh.
     *
     * @since 1.0
     * @uses $directory Holds the data directory, which the constructor sets.
     *
     * @param string $directory 
     */
    public function __construct($directory = null) {
        if ($directory === null)
            $directory = get_data_dir();

        if (substr($directory, -1) != '/')
            $directory .= '/';

        $this->directory = (string) $directory;
    }

    /**
     * Prepares filename and content for saving
     *
     * @since 1.0
     * @uses $directory
     * @uses put()
     *
     * @param string $filename Filename to save to
     * @param string $content Content to save to cache
     */
    public function save($filename, $content) {
        $file = $this->directory . $filename;

        if(!$this->put($file, $content)) {
            trigger_error(get_class($this) . " error: Couldn't write to $file", E_USER_WARNING);
            return false;
        }

        return true;
    }

    /**
     * Saves data to file
     *
     * @since 1.0
     * @uses $directory
     *
     * @param string $file Filename to save to
     * @param string $data Data to save into $file
     */
    protected function put($file, $data, $mode = false) {
        if(file_exists($file) && file_get_contents($file) === $data) {
            touch($file);
            return true;
        }

        if(!$fp = @fopen($file, 'wb')) {
            return false;
        }

        fwrite($fp, $data);
        fclose($fp);

        $this->chmod($file, $mode);
        return true;

    }

    /**
     * Change the file permissions
     *
     * @since 1.0
     *
     * @param string $file Absolute path to file
     * @param integer $mode Octal mode
     */
    protected function chmod($file, $mode = false){
        if(!$mode)
            $mode = 0644;
        return @chmod($file, $mode);
    }

    /**
     * Returns the content of the cached file if it is still valid
     *
     * @since 1.0
     * @uses $directory
     * @uses check() Check if cache file is still valid
     *
     * @param string $id Unique ID for content type, used to distinguish between different caches
     * @return null|string Content of the cached file if valid, otherwise null
     */
    public function load($filename) {
        return $this->get($this->directory . $filename);
    }

    /**
     * Returns the content of the file
     *
     * @since 1.0
     * @uses $directory
     * @uses check() Check if file is valid
     *
     * @param string $id Filename to load data from
     * @return bool|string Content of the file if valid, otherwise null
     */
    protected function get($filename) {
        if(!$this->check($filename))
            return null;

        return file_get_contents($filename);
    }

    /**
     * Check a file for validity
     *
     * Basically just a fancy alias for file_exists(), made primarily to be
     * overriden.
     *
     * @since 1.0
     * @uses $directory
     *
     * @param string $id Unique ID for content type, used to distinguish between different caches
     * @return bool False if the cache doesn't exist or is invalid, otherwise true
     */
    protected function check($filename){
        return file_exists($filename);
    }

    /**
     * Delete a file
     *
     * @param string $filename Unique ID
     */
    public function delete($filename) {
        return unlink($this->directory . $filename);
    }
}

?>

Это хранит каждую запись как отдельный файл, который мы нашли, достаточно эффективно для использования (никакие ненужные данные не загружаются, и это быстрее для сохранения).

9
ответ дан meagar 24 November 2019 в 02:16
поделиться

Если Вы собираетесь использовать плоский файл для сохранения данных, используйте XML для структурирования данных. PHP имеет встроенный синтаксический анализатор XML .

8
ответ дан Peter Mortensen 24 November 2019 в 02:16
поделиться

Если Вы хотите человекочитаемый результат, можно также использовать этот тип файла:

ofaurax|27|male|something|
another|24|unknown||
...

Таким образом, у Вас есть только один файл, можно отладить его (и вручную зафиксировать), легко, можно добавить поля позже (в конце каждой строки), и код PHP прост (для каждой строки, разделенной согласно |).

Однако недостатки состоят в том, что необходимо проанализировать весь файл для поиска чего-то (если у Вас есть миллионы записи, он не прекрасен), и необходимо обработать разделитель в данных (например, если зарубка является WaR|ordz).

7
ответ дан ofaurax 24 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: