2016-07-30 10 views
0

私はPHPでOOPの初心者です。私は自分のコードで試してみようとしています。だから私がやりたかったのは、データベースの接続と挿入の機能を持つ1つの基本クラスを書くことでした。だから私の希望の状況はこれです:OOP mysqliデータベース関数

- 私は、接続と挿入機能を制御するクラスに作成したいです。問題は、私の$ connect変数が別の関数から動いていないことです。それを可能にするために私は何ができますか? 提供されたコードにより、さらに理解することができます。

<?php 

class DB { 
protected $dbhost = 'localhost'; 
protected $dbuser = 'root'; 
protected $dbpass = ''; 
protected $dbname = 'newdb'; 

public function connect() 
{ 
    $connect = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 

    if($connect->error) 
    { 
     echo "Failed to connect"; 
    } 
    else 
    { 
     echo "connected"; 
    } 
} 

public function insert($name, $second) 
{ 
    $insert = "INSERT INTO posts (name, second) VALUES ('$name', '$second')"; 

    if ($connect->query($insert) === TRUE) 
    { 
     echo "New record created successfully"; 
    } 
    else 
    { 
     echo "Error: " . $sql . "<br>" . mysqli_connect_error(); 
    } 
} 
} 
require_once 'classes/DB.php'; 

$db = new DB; 

if(isset($_POST['submit'])) 
{ 
    $name = $_POST['name']; 
    $second = $_POST['second']; 

    $db->insert($name, $second); 
} 

?> 


<form method="POST"> 
    Add smth<input type="text" name="name"><br> 
    Also omg<input type="text" name="second"><br> 
    <input type="submit" name="submit"> 
</form> 
+1

パラメータとして渡すのはどうですか? –

+0

私はそれについて考えましたが、適切な使用法はわかりません。それが私が助けを求めている理由です。 – Irfan

+0

'$ connect'はその関数のローカルスコープにあります。また、このコードでSQLインジェクションを開くこともできます。パラメータ化されたクエリを使用して調べることをお勧めします。 http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – chris85

答えて

1

クラスのプロパティとして$connectを追加しますので、あなたは$this->connectを使用して、クラス内どこでもそれを再利用することがあります。あなたは、データベースを挿入することができるように

class DB 
{ 
    protected $dbhost = 'localhost'; 
    protected $dbuser = 'root'; 
    protected $dbpass = ''; 
    protected $dbname = 'newdb'; 
    protected $connect; 

    public function connect() 
    { 
     $this->connect = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 

     if ($this->connect->error) 
     { 
      echo "Failed to connect"; 
     } 
     else 
     { 
      echo "connected"; 
     } 
    } 

    public function insert($name, $second) 
    { 
     $insert = "INSERT INTO posts (name, second) VALUES ('$name', '$second')"; 

     if ($this->connect->query($insert) === TRUE) 
     { 
      echo "New record created successfully"; 
     } 
     else 
     { 
      echo "Error: " . $sql . "<br>" . mysqli_connect_error(); 
     } 
    } 
} 
+0

致命的なエラー:キャッチされていないエラー:nullのメンバ関数query()を呼び出す... – Irfan

+0

正確に何を実行していますか? – Jocelyn

+0

コードを更新しました。それらは2つの異なるファイルですが、大丈夫です、あなたは理解しています。スクロールして見てください。 – Irfan

1

私は、少しのためのあなたのクラスを書き換えていますコンストラクタの設定。したがって、実際にはオブジェクトであり、複数のデータベースを使用できます。あなたのクラスで間違っていたのは、変数$ connectをクラス全体で使用可能な変数に宣言することなく使用していたことです。

クラス

<?php 

class DB { 
    protected $dbhost; 
    protected $dbuser; 
    protected $dbpass; 
    protected $dbname; 
    protected $connection; 

    public function __construct($dbhost, $dbuser, $dbpass, $dbname) 
    { 
     $this->dbhost = $dbhost; 
     $this->dbuser = $dbuser; 
     $this->dbpass = $dbpass; 
     $this->dbname = $dbname; 

     $connection = new mysqli($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 
     if($connection->error) 
      die('Could not connect with the database!'); 

     $this->connection = $connection; 
    } 

    public function connect() 
    { 
     $this->__construct($this->dbhost, $this->dbuser, $this->dbpass, $this->dbname); 
    } 

    public function insert($name, $second) 
    { 
     $insert = "INSERT INTO posts (name, second) VALUES ('$name', '$second')"; 

     if ($this->connection->query($insert) === TRUE) 
     { 
      echo "New record created successfully"; 
     } 
     else 
     { 
      echo "Error: " . $sql . "<br>" . mysqli_connect_error(); 
     } 
    } 

    public function getConnection() 
    { 
     return $this->connection; 
    } 
} 

使用

$db = new DB('localhost', 'root', '', 'newdb'); 
$db->insert('name', 'second'); 

私はこれがOOPを通して、あなたのジャーナルにお役に立てば幸い、私の悪い英語のため申し訳ありません。

+0

うん、これも動作します。私は2分前にそれを修正した。しかし、とにかく助けてくれてありがとう。私は感謝します。 – Irfan

関連する問題