2

バックグラウンド :

フラット ファイル キー値ストアを作成しようとしています。以下のコードを使用すると、ファイルに書き込まれた配列が削除され、空のファイルになります。次のリクエストで、ファイルに配列が取り込まれます。このプロセスは、すべてのページ要求でループします。

私が試したこと:

  • 「json_encode()」/「json_decode()」による各種メソッド。
  • 「serialize()」/「unserialize()」でも同じことを試みました。
  • 「array_merge()」と「array_merge_recursive()」でさまざまなコーディング構造を試しました。

何も機能していないようです!空のファイルの同じループになってしまいます->配列のあるファイルが続きます

質問 :

より経験豊富な人が私が間違っていることを教えてもらえますか?

コード:

/**
 * Class Orm
 */
class Orm
{

    /**
     * @var string The Root database directory with a trailing slash. default is "./database/".
     */
    static $dir = "./database/";
    /**
     * @var array
     */
    protected $data;
    /**
     * @var string
     */
    protected $file = "";

    /**
     * @param $file
     * @return string
     */
    public function load_table($file)
    {
        try {
            if (file_exists(self::$dir . $file)) {
                return $this->file = $file;
            } else {
                throw new Exception("The file " . $file . " cannot be created, because it already exists");
            }
        } catch (Exception $error) {
            return $error->getMessage();
        }
    }

    /**
     * @param String
     * @param array $values An associative array of values to store.
     * @return array
     */
    public function set($key, $values = array())
    {
        try{
            if (!empty($key) && !empty($values)){
                return $this->data[$key] = $values;
            } else {
                throw new Exception();
            }
        } catch (Exception $error){
            return $error->getMessage();
        }

    }

    public function save()
    {
        try{
            if (file_exists(self::$dir . $this->file)) {
                if (filesize(self::$dir . $this->file) == 0)
                {
                    file_put_contents(self::$dir . $this->file, print_r($this->data, TRUE));
                }else{
                    $tmp = file_get_contents(self::$dir . $this->file);
                    $content = array_merge($tmp, $this->data);
                    file_put_contents(self::$dir . $this->file, print_r($content, TRUE));
                }
            } else {
                throw new Exception();
            }
        } catch(Exception $error){
            return $error->getMessage();
        }

    }
}


$user = new Orm();
$user->load_table("users");
$user->set("Tito",array("age" => "32", "occupation" => "cont"));
$user->save();

PS : これは、Php に慣れるための良いプロジェクトだと思いました。したがって、これは Php の学習と理解のみを目的としているため、SQL を使用することはお勧めしません。

4

1 に答える 1

3

なぜあなたのコードが失敗するのか、そうでないのかはわかりません。ただし、文字列をディスクにロードして保存する別のオブジェクトも作成します。それ以上でもそれ以下でもない:

class StringStore
{
    private $path;

    public function __construct($path) {
        $this->path = $path;
    }

    /**
     * @return string
     */
    public function load() {
        ... move your load code in here
        return $buffer;
    }

    /**
     * @param string $buffer
     */
    public function save($buffer) {
        ... move your save code in here
    }
}

少し小さく見えるかもしれませんが、コードの大部分を ORM クラスから移動できます。問題がディスクへの保存にある場合 (たとえば、何らかの間違いがあった場合)、store クラスで修正できます。

文字列処理で間違いがあった場合は、代わりに ORM クラスを調べて修正を続ける必要があることがわかります。

于 2013-04-30T19:11:12.247 に答える