2016-07-30 4 views
0

Я новичок в ООП в PHP, и я пытаюсь играть с моим кодом. Поэтому первое, что я хотел сделать, это написать один базовый класс с функциями подключения и вставки для базы данных. Поэтому моя желаемая ситуация такова:Функции базы данных 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

Неустранимая ошибка: Непринятая ошибка: вызов функции функции-члена() по нуле в ... – 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'); 

Я надеюсь, что это поможет вам в вашем журнале через ООП, извините за мой плохой английский.

+0

Да, это тоже работает. Я исправил это 2 минуты назад ха-ха. Но в любом случае, спасибо за помощь. Я ценю. – Irfan

Смежные вопросы