Не удалось вставить информацию в базу данных со структурой MYSQLI oops - PullRequest
0 голосов
/ 03 июля 2019

Я подготовил структуру для управления приложением в OOPS Manner в php, я пытаюсь подключить базу данных и вставить записи в базу данных, мое соединение установлено, но я не могу добавить записи в мои DB-таблицы. Вот мои коды Файл класса моей модели User user: users.php (который является классом имени папки):

<?php
class Users extends Connection{

    public $con;
    public function __construct(){
        $this->con = new Connection();
    }
    //creating user
    public function createInfo($data){
        $username = $data['username'];
        $email = $data['useremail'];
        $password = md5($data ['password']);
        $query = "INSERT INTO js_users(username, useremail, `password`) VALUES ('".$username."', '".$email."', '".$password."')";
        $result = $this->con->query($query); 
        print_r($result); exit;
        return array("status"=>$result, "message"=>"User Generated Successfully");
     }
     public function getUserInfo(){
         $query  = "SELECT * FROM employee";
         $result = mysqli_query($this->con, $query) or die(mysqli_error($this->con));
         return $result;
     }  
}

Моя модель: Файл класса соединения (То же в папке класса):

<?php

class Connection{

    private $hostname;
    private $username;
    private $password;
    protected $dbname;
    public $con;
    public function __construct()
    {   
        $this->hostname = '127.0.0.1';
        $this->username = 'localuser';
        $this->password = 'R@5gull@';
        $this->dbname = 'jobsearch';
        $this->con = $this->connect();
        return $this->con;
    }
    private function connect(){
        $this->con =  new mysqli($this->hostname, $this->username, $this->password, $this->dbname);
        return $this->con;   
    }

}
?>

Моя HTML-форма: (в корневом каталоге):

 <form class="user" action="process.php" method="post">
              <input type="hidden" name="actions" value="createUser" />

                <div class="form-group row">
                  <div class="col-sm-10 mb-3 mb-sm-0">
                    <input type="text" class="form-control form-control-user" id="username" name="data[username]" placeholder="Choose username">
                  </div>
                </div>
                <div class="form-group row">
                <div class="col-sm-10 mb-3 mb-sm-0">
                  <input type="email" class="form-control form-control-user" id="useremail" name="data[useremail]" placeholder="Email Address">
                </div>
                </div>
                <div class="form-group row">
                  <div class="col-sm-5 mb-3 mb-sm-0">
                    <input type="password" class="form-control form-control-user" id="password" name="data[password]" placeholder="Password">
                  </div>
                  <div class="col-sm-5">
                    <input type="password" class="form-control form-control-user" id="confirm_password" name="data[confirmPassword]" placeholder="Repeat Password">
                  </div> 
                  <div class="col-sm-2">
                  <span id="message"></span>
                  </div>

                </div>
                <button type="submit" name="submit"  class="btn btn-primary btn-user btn-block">
                  Register User
                </button>
              </form>

Мой Process.php:

<?php
function __autoload($class){
    require_once "class/$class.php";
}


$connect = new Connection();
$action = $_POST['actions'];
if(isset($action) && isset($_POST['actions'])){
switch($action){
    case "createUser":
        $createUser = new Users();
        $res = $createUser->createInfo($_POST['data']);
        print_r($res);
    break;

    default:
        return NULL;
    }
}
?>

моя схема базы данных:

CREATE TABLE `js_users` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(155) NULL DEFAULT NULL,
    `useremail` VARCHAR(155) NULL DEFAULT NULL,
    `password` VARCHAR(255) NULL DEFAULT NULL,
    `created_on` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_on` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `username` (`username`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;

Поскольку мое соединение установлено, но записи не отправляются в базу данных, необходимо вставить записи с помощью этих методов.

1 Ответ

2 голосов
/ 03 июля 2019

В вашем классе Connection единственное, что он делает, это устанавливает соединение и сохраняет его в $this->con (вы не можете ничего вернуть из конструктора).

Ваше определение класса пользователя использует ...

class Users extends Connection

, что не является хорошим дизайном ОО как пользователя, не является типом соединения с базой данных. Поэтому я бы предложил сбросить бит extends Connection - вы все равно его не используете.

Но тогда в вашем конструкторе вы используете

$this->con = new Connection();

поэтому $this->con теперь является экземпляром класса соединения. Это не фактическое соединение с базой данных, а класс, который содержит его. При запуске запроса

$result = $this->con->query($query); 

Я ожидаю, что это не удастся, поскольку класс Connection не содержит метод с именем query(). С текущим кодом вы можете сделать это с ...

$result = $this->con->con->query($query); 

Поскольку $con является публичным свойством класса и содержит фактический класс.

Есть несколько других проблем - пожалуйста, используйте подготовленные операторы для любого SQL, где пользовательский ввод является частью оператора. Не используйте md5() для паролей - посмотрите password_hash(). Также обратите внимание на внедрение зависимостей для передачи базы данных в любой экземпляр, используя его, поскольку это позволяет лучше контролировать и тестировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...