Как наследовать переменные в классе

1

У меня такое:

$db_hostname = 'localhost';
$db_username = 'root';
$db_password = '';
$db_database = 'publications';

сохранен как connection.php но я не могу его использовать в этом переменном:

namespace form;
include_once "Form.php";
include_once "connection.php";
class login extends Form
{
    public  function showLoginfrom()
    {
    echo '<form name="loginform"  method="get">';
    $login = new Form();
    $login->AddText('username','Your username');
    $login->AddPassword('password','','Your password');
    $login->SubmitButton('Login');
    echo "</form>";
}

public function executeLogin()
{
    $connection = new \mysqli($db_hostname,$db_username,$db_password,$db_database);

    $username = ($_GET["username"]);
    $password = ($_GET["password"]);

    $query ="SELECT * FROM users WHERE username= '$username' AND password= '$password'";
    $result = $connection->query($query);

    if (mysqli_num_rows($result)== 1)
    {
        echo "Welcome";
    }
    else
    {
        echo "Login failed";
    }
}

Я знаю, что мой код небезопасен, я просто экспериментирую. Его первая программа php.

  • 0
    Пожалуйста, исправьте уязвимость атаки SQL-инъекцией: xkcd.com/327.
  • 0
    Либо используйте global (ew!), Либо введите их.
Показать ещё 3 комментария
Теги:
mysqli

2 ответа

1
Лучший ответ

Внедрить их в метод

Например;

public function executeLogin($db_hostname,$db_username,$db_password,$db_database)
{
    $connection = new \mysqli($db_hostname,$db_username,$db_password,$db_database);

А затем вызовите метод executeLogin() с этими переменными в текущей области.

Сделать недвижимость

Два способа вы можете ввести их для создания свойств. Первый точно такой же, как и выше, в методе __construct().

Другой способ - включить файлы в __construct() и установить их как свойства. Например

private $arrDbDetails = array();

public function __construct() {
  include_once "connection.php";
  $this->arrDbDetails = array(
     'host' => $db_hostname,
     'user' => $db_username,
     'pass' => $db_password,
     'db'   => $db_database
  );

Затем вы можете получить к ним доступ с помощью $this->arrDbDetails['host'], например, в вашем executeLogin().

$connection = new \mysqli($this->arrDbDetails['host'],$this->arrDbDetails['user'],$this->arrDbDetails['pass'],$this->arrDbDetails['db']);

Использование констант

Вы также можете define значения и использовать их в глобальной области.

define('DB_USERNAME', 'my_mysql_user');

А затем назовите их как обычные константы в вашем методе.

  • 0
    Большое спасибо за объяснение :)
0

Другой способ сделать это - использовать класс w/static. Что-то вроде:

class Config {
    static public $mysqli;
    static public $dbCredentials = [];
}
include('connection.php');
Config::$dbCredentials['host'] = $db_hostname;
// and repeat for the others
//optional, extra step:
Config::$mysqli = new \mysqli(...);

Затем, чтобы использовать, вы можете сделать:

public function executeLogin()
{
    $connection = new \mysqli(\Config::$dbCredentials['host'], ..);
    //or
    $connection = \Config::$mysqli;
    // do other stuff
}

Другие примечания/альтернативы:

  • помещая класс config в connection.php и выполняя эту настройку оттуда.
  • используя функцию getter (то есть public static getConnection()), чтобы получить соединение mysqli (возможно, использовать одноэлементный)
  • используя функции getter/setter для учетных данных (т.е. public static getDbHost())
  • Используйте подходящий объектно-ориентированный подход и получите executeLogin объект mysqli, который будет передан из вызывающего кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню