2016-12-12 113 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"; 
    } 
} 
?> 

我正在使用composer和medoo來做這個數據庫項目。我知道數據庫代碼的工作原理,因爲我已經運行它自己,它運行良好。

我正在努力與代碼似乎是變量$database。如果我從混合中刪除該變量,函數調用將起作用。我覺得我只是不理解我應該在哪裏聲明變量/如何從函數內部/外部引用變量。謝謝。

+1

每當您在PHP中得到一個空白頁面時,如果有其他預期的輸出,請檢查您的錯誤日誌。在開發和測試代碼時始終啓用display_errors - 任何致命錯誤應立即顯示。在腳本的頂部:'error_reporting(E_ALL); ini_set('display_errors',1);' –

+1

我注意到你已經使用過'global $ database',但是你也有一個在類中定義的'$ database'屬性,它可以被'$ this-> database'訪問。 .. –

+0

當聲明一個屬性時,實例化一個類實例'$ database'似乎不是http://php.net/manual/en/language.oop5.properties.php給出的例子之一,所以我想象你的錯誤報告已關閉,因此您需要將其打開或檢查錯誤日誌。 – MonkeyZeus

回答

1

如前例中建議,你應該使用這樣的事情並傳遞一個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',  
     ]); 

    } 

檢查考慮捕捉錯誤。在數據庫上使用唯一或主鍵將是更安全的方法,否則您必須在數據庫上進行驗證和搜索。添加密鑰並檢查重複的錯誤。

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

謝謝 - 創建構造函數似乎使事情變得更好,我能夠得到這個工作。 – Entevily

1

這裏的問題是使用全局範圍。相反的:

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

使用

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

,你也可以考慮在構造函數實例化$數據庫,即

private $database; 

public function __construct() { 
    $this->database = new medoo([args....