2016-12-12 13 views
0

このコードがうまくいくはずです。文字通り、この時点で私はいくつかの情報を取り、データベースに対してコマンドを実行するPHPクラスを作成しようとしています。コマンドが機能するので、それは私の変数の範囲と関係があるとは限りません。PHPページの空白 - スコープを理解していない

私はPHPが初めてです。これは面白いことです。

<?php 
require __DIR__ . '/../bin/composer/vendor/autoload.php'; 

$cx = new Customer(); 
$cx->WriteCxToDB(); 

class Customer { 
    public $database = new medoo([ 
    'database_type'=>'mysql', 
    'database_name'=>'dbname', 
    'server'=>'localhost', 
    'username'=>'dbusername', 
    'password'=>'dbpassword', 
    'charset'=>'utf8' 
    ]); 

    public function WriteCxToDB(){ 
    global $database; 
    if($database->has("customer", [ 
     "OR"=>[ 
     "username"=>"cxusername", 
     "email"=>"[email protected]" 
     ] 
     ])) 
     { 
     echo "User already exists"; 
    }else{ 
     $database->insert("customer", [ 
     "username"=>"username", 
     "keyword"=>"keyword", 
     "email"=>"[email protected]", 
     "phone"=>"444-444-4444", 
     "first_name"=>"First", 
     "last_name"=>"Last" 
    ]); 
    echo "User added"; 
    } 
    echo "Done"; 
    } 
} 
?> 

私はこのデータベースエントリを行うために作曲家とmedooを使用しています。私はそれを自分の上で走らせて、うまく動作するので、データベースコードが動作することを知っています。

私が苦労しているのは、コード内の変数$databaseのようです。その変数をミックスから削除すると、関数呼び出しが機能します。私は、変数の宣言がどこにあるのか/関数の内部/外部から参照する方法を理解していないような気がします。ありがとう。

+1

PHPで何らかの出力が予想されるときに空白のページが表示されるときはいつでも、エラーログを確認してください。コードの開発とテスト時に常にdisplay_errorsを有効にしてください。致命的なエラーがすぐに表示されるはずです。あなたのスクリプトの一番上にある: 'error_reporting(E_ALL); ini_set( 'display_errors'、1); ' –

+1

あなたは' global $ database'を使ったことに気付きましたが、 '$ this-> database'としてアクセス可能な' $ database'属性もクラスに定義されています。 .. –

+0

プロパティを宣言するときにクラスインスタンス '$ database'をインスタンス化することは、http://php.net/manual/en/language.oop5.properties.phpで与えられた例の1つではありません。エラー報告はオフになっているため、オンにするかエラーログを確認する必要があります。 – MonkeyZeus

答えて

1

、コンストラクタで$データベースをインスタンス化する検討することもでき、使用

if($this->database->has("customer", 

db接続をクラスに渡すと、ベースクラスを拡張するとdb接続の再利用が可能になります。

private $database; 

public function __construct($db_connection = null){ 
    //do stuff or set db 
    $this->database = $this->db_connect; 
} 

やエラーをキャッチ考える確認するためにそれを

private function db_connect(){ 
     return new medoo([ 
     // required 
     'database_type' => 'mysql', 
     'database_name' => 'name', 
     'server' => 'localhost', 
     'username' => 'your_username', 
     'password' => 'your_password', 
     'charset' => 'utf8',  
     ]); 

    } 

を行うには、クラスのメソッドを作ります。 DB上で一意または主キーを使用する方が安全な方法です。そうでない場合は、DBで検証と検索を行う必要があります。キーを追加し、重複エラーがないか確認します。

if($database->error()){ 
    //deal with return or pass to logging 
} 
+0

ありがとう - コンストラクタを作成すると、よりうまく動作するように見えて、これを動作させることができました。 – Entevily

1

ここでの問題は、グローバルスコープの使用です。代わりに:

global $database; 
    if($database->has("customer", 

あなたはこのようなものを使用する必要があり、前の例で示唆したように、あなたはまた、すなわち

private $database; 

public function __construct() { 
    $this->database = new medoo([args.... 
関連する問題