2016-07-30 32 views
0

我在PHP OOP初学者,我想我的代码玩。所以我想要做的第一件事是写一个基本的类与连接和插入数据库的功能。所以我期望的情况是这样的:OOP mysqli的数据库功能

-I想上一流的,这将CONTROLL连接并插入函数创建。问题是,我的$ 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中... – Irfan

+0

你到底在做什么? – Jocelyn

+0

我更新了代码。这是两个不同的文件,但没关系,你明白。向下滚动并看到它。 – 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