2011-12-15 20 views
5

ここでは非常に奇妙なエラーが発生しています。私はフラットファイルデータベースクラスを作成しています。これはリフレッシュするまでうまくいきました。PHP:致命的なエラー:非オブジェクトのメンバ関数を呼び出す

Fatal error: Call to a member function name() on a non-object in /home/reithg/public_html/test/engine/class.database.php on line 50

次のように私はクラスを呼び出しています:

<?php 
ini_set('display_errors', '1'); 

require('engine/class.database.php'); 

$config = new Config("lessons", array('first', 'second', 'third', 'fourth'), "data/"); 
$db = new Database($config, true); 

print("Querying DB for 'theta' no exclusions: <br />"); 
print_r($db->query('theta', NULL, NULL)); 

print("<p /> Querying DB for 'theta' in column 'second': <br />"); 
print_r($db->query('theta', 'second', NULL)); 

print("<p /> Querying DB for first two rows: <br />"); 
print_r($db->getRows(2)); 

print("<p /> Querying DB for last three rows: <br />"); 
print_r($db->getRows(3, true)); 

print("<p /> Cleaning data for safe DB input: <br />"); 
$testInput = array('escape|these||delimiters','and\these\\slashes','and\0these\0nulls',"don't, forget quotes"); 
print("input: "); 
print_r($testInput); 
echo("<br />output: "); 
print($db->addRow($testInput)); 
?> 

をここでは私のclass.database.phpある

<?php 
require('class.config.php'); 
require('class.column.php'); 

    class Database { 
     private 
      $_config, 
      $_pointer; 

     public function __construct(Config $config) { 
      $this->_config = $config; 
      return true; 
     } 

     private function connect($method) { 
      if (!($this->_pointer = @fopen($this->_config->db(), $method))) 
      echo("Unable to connect to database"); 
     } 

     private function disconnect() { 
      fclose($this->_pointer); 
     } 

     private function lock($method) { 
      if(flock($this->_pointer, $method)) 
       return true; 
      return false; 
     } 

     private function unlock() { 
      flock($this->_pointer, LOCK_UN); 
     } 

     private function cleanInput($input) { 
      $data = array_map(array($this, 'escapeData'), $input); 
      $output = implode($this->_config->delimiter(), $data)."\r\n"; 
      return $output; 
     } 

     private function escapeData($data) 
     { 
      $search = array('\\', '"', "'", '\\0', '\n', $this->_config->delimiter()); 
      $replace = array('\\\\', '\"', "\'", '\\0', '\\n', '\\'.$this->_config->delimiter()); 
      $output = str_replace(array_unique($search), array_unique($replace), $data); 
      return $output; 
     } 

     private function formatRow($data) { 
      foreach($data as $key => $value) { 
       $row[$this->_config->columns($key, "position")->name()] = $value; 
      } 
      return $row; 
     } 

     public function dumpToArray() { 
      $arrayDump; 
      foreach(file($this->_config->db(), FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $row => $content) 
       $arrayDump[$row] = formatRow(explode($this->_config->delimiter(),$content)); 
      return $arrayDump; 
     } 

     public function addRow(array $data) { 
      $this->connect('ab'); 
      if($this->lock(LOCK_EX)) { 
       // fwrite($this->_pointer, $this->cleanInput($data)); 
       echo($this->cleanInput($data)); 
       $this->unlock(); 
       $this->disconnect(); 
       return true; 
      } else { 
       $this->disconnect(); 
       return false; 
      } 
     } 

     public function query($value, $column = NULL, $limit = NULL) { 
      $this->connect('rb'); 
      $results = array(); 
      while ((is_null($limit) || (count($results) < $limit)) && !feof($this->_pointer)) { 
       $data = explode($this->_config->delimiter(), fgets($this->_pointer, 1024)); 
       if(!is_null($column)) { 
        if ($data[$this->_config->columns($column, "string")->index()] == $value) 
         array_push($results, $this->formatRow($data)); 
       } else { 
        if (in_array($value, $data)) 
         array_push($results, $this->formatRow($data)); 
       } 
      } 
      $this->disconnect(); 
      switch (count($results)) { 
       case 0; 
        return false; 
       case 1; 
        return $results[0]; 
       default; 
        return $results; 
      } 
     } 

     public function getRows($limit = 1, $reverse = false) { 
      $this->connect('rb'); 
      $offset = 0; 
      $results = array(); 
      if ($reverse) { 
       while(count($results) < $limit && fseek($this->_pointer, $offset, SEEK_END) >= 0) { 
        $char = fgetc($this->_pointer); 
        if($char == "\n" || $char == "\r"){ 
         $offset --; 
         $data = explode($this->_config->delimiter(), fgets($this->_pointer, 1024)); 
         array_push($results, $this->formatRow($data)); 
        } 
        $offset--; 
       } 
       $results = array_reverse($results); 
      } else { 
       while ((($limit === NULL) || (count($results) < $limit)) && !feof($this->_pointer)) { 
        $data = explode($this->_config->delimiter(), fgets($this->_pointer, 1024)); 
        array_push($results, $this->formatRow($data)); 
       } 
      } 
      $this->disconnect(); 
      return $results; 
     } 
    } 
?> 

class.config.php

<?php 
    class Config { 
     private 
      $_db, 
      $_file, 
      $_columns = array(), 
      $_directory, 
      $_delimiter; 

     public function __construct($file, array $columns, $directory = NULL, $delimiter = "|") { 
      $this->_db = $directory.$file.".db"; 
      $this->defineColumns($columns); 
      $this->_directory = $directory; 
      $this->_delimiter = $delimiter; 
     } 

     public function db() { 
      return $this->_db; 
     } 

     public function delimiter() { 
      return $this->_delimiter; 
     }  

     private function defineColumns($constants) { 
      for ($i=0;$i<count($constants);$i++) { 
       if(in_array($constants[$i], $this->_columns)) 
        die("Column names must be unique"); 
       $column = new Column($constants[$i], $i); 
       $this->_columns[$column->name()] = $column; 
      } 
     } 

     public function columns($index, $search = "string") { 
      switch ($search) { 
       case "string"; 
        return $this->_columns[$index]; 
        break; 
       case "position"; 
        $keys = array_keys($this->_columns); 
        return $this->_columns[$keys[$index]]; 
        break; 
       default; 
        return false; 
      } 
     } 
    } 
?> 

class.column.php

<?php 
    class Column { 
     const 
      ALL = "0", 
      STRING = "1", 
      NUMBER = "2", 
      INT = "3", 
      AUTO_INCREMENT = "4", 
      CURRENT_TIME = "5"; 

     private 
      $_type = ALL, 
      $_name, 
      $_index, 
      $_maxChars = "256"; 

     public function __construct($name, $index, $type = NULL, $maxChars = NULL) { 
      $this->_name = $name; 
      $this->_index = $index; 
      if(!is_null($type)) 
       setDataType($type); 
      if(!is_null($maxChars)) 
       setMaxChars($maxChars); 
      return $this; 
     } 

     public function setDataType($type) { 
      switch ($type) { 
       case ALL; 
       case STRING; 
       case NUMBER; 
       case INT; 
       case AUTO_INCREMENT; 
       case CURRENT_TIME; 
        $this->_type = $type; 
        break; 
       default; 
        return false; 
      } 
     } 

     public function auditData($data) { 
      switch ($this->_type) { 
       case ALL; 
        $output = $data; 
        break; 
       case STRING; 
        $output = (string) $data; 
        break; 
       case NUMBER; 
        $output = (float) $data; 
        break; 
       case INT; 
        $output = (int) $data; 
        break; 
       case AUTO_INCREMENT; 
        $output = (int) $data; 
        break; 
       case CURRENT_TIME; 
        $output = time(); 
        break; 
       default; 
        return false; 
      } 
      return $output; 
     } 

     public function setMaxChars($maxChars) { 
      if(is_int($maxChars)) { 
       $this->_maxChars = $maxChars; 
      } 
     } 

     public function name() { 
      return $this->_name; 
     } 

     public function index() { 
      return $this->_index; 
     } 
    } 
?> 

私はそれが多くのコードを知っているが、これはすべて起こっている理由は、私がうまくできません突然、文字どおりにコードを変更することなく、1つのリフレッシュが行われます。以前のバージョンに戻っても、これがうまくいっています。

私がしようとすると:

print($this->_config->columns($key, "position")); 

それが返されます。

Catchable fatal error: Object of class Column could not be converted to string in /home/reithg/public_html/test/engine/class.database.php *on line 50*

私はname()

と呼ばれるパブリックメソッドを持つクラスの柱の部材に name()を行っておりますことを示しています

私がしたとき:

print($this->_config->columns($key, "position")->name()); 

戻り値(foreachループ内にある1単語につき1単語)。

first second third fourth first second third fourth

したがって、1行前にはっきりと働いています。

+5

デバッグ - 私たち一人一人が一日の90%まで何をしているのですか?だからあなたはすべきです。 – zerkms

+0

難しい、男。エラーの行に注意し、 '$ this-> _config->列($ key、" position ") - > name()のどのオブジェクトが動作していないかを調べるべきです。 –

+0

@Márcioこれに気付きましたが、 '$ this - > _ config->カラム($ key、" position ")'メソッド 'name()'を持つ 'Column'クラスのメンバを返しています。 @zerkmsこれは突然のエラーであり、私は明らかにそれをデバッグしようとしていますが、変更されていないため動作しません...? –

答えて

6

回答は、lessons.dbファイルにある隠し文字が原因でした。

このエラーは、これとは無関係であり、2ペンスを与える時間を取った皆様に感謝したいと思います。

0

私はあなたのために二つのものがあります:あなたが言うとき

  1. を:これは文字通り1回のリフレッシュでは、突然のすべてが起こっている理由 は、「私はそれが多くのコードを知っているけど、私はうまくできませんコードに変更を加えることなく、たとえ私が以前のバージョンに戻ったとしても、これはうまくいきました。私はあなたがブラウザを通してPHPコードをプログラミングしているかどうか尋ねたいと思いますか?もしそうなら、時々キャッシュがあなたを混乱させ、私はPHPコマンドラインインターフェイスを通して私のPHPモデルを開発するほうがずっと簡単です。 これはあなたのためではない場合は、開発時にブラウザのキャッシュを完全にオフにすることを検討してください。
  2. あなたが経験している問題は、Configクラスのパブリック関数カラムの構文エラーが原因だと思います。私はswitch-cases http://php.net/manual/en/control-structures.switch.phpの構文を読まなければならないと思います。ケースガード後にセミコロンを使用したことに気づくでしょう。また、壊す必要はありません。あなたが戻った後、あなたのコードは決してこの時点に達することはありません...

私はこれが役立つことを願っています - 幸運...

+0

セミコロンはリンクしたページに表示されているようにスイッチの場合に有効です:http://php.net/manual/en/control-structures.switch.php –

+1

ああ、大丈夫です:)あなたは毎日を学びます。 – kraenhansen

関連する問題