Как проверить mysql соединение с базой данных из другого файла php - PullRequest
0 голосов
/ 13 февраля 2020

Я создал форму, где пользователь может добавить свое имя базы данных, имя пользователя, пароль, хост. Затем эта форма создает файл конфигурации и добавляет детали базы данных пользователей. форма находится в root, а файл конфигурации находится в корне / включает в себя. Я хочу знать, как я могу проверить соединение с базой данных из файла формы. если соединение установлено успешно, он может перейти к следующему шагу, а если нет, я хочу показать ошибку.

Форма

if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['db-details']) {

    $dbName = $_POST['dbName'];
    $dbUsername = $_POST['dbUsername'];
    $dbPassword = $_POST['dbPassword'];
    $dbHost = $_POST['dbHost'];

    $phConfigFile = 'includes/ph_config.php';

    file_put_contents($phConfigFile, $phConfigData);

}

Config

<?php 

    define("DB_HOST", "[dbHost]");

    define("DB_USER", "[dbUsername]");

    define("DB_PASS", "[dbPassword]");

    define("DB_NAME", "[dbName]");

    $connection = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

Вы действительно хотите проверить соединение перед созданием файла конфигурации, поэтому после его создания вы знаете, что оно будет работать

if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['db-details']) {

    $dbName     = $_POST['dbName'];
    $dbUsername = $_POST['dbUsername'];
    $dbPassword = $_POST['dbPassword'];
    $dbHost     = $_POST['dbHost'];

    // use error supression so you get to process the error rather 
    // than PHP throwing an error
    $connection = @mysqli_connect($_POST['dbHost'], 
                                $_POST['dbUsername'], 
                                $_POST['dbPassword'], 
                                $_POST['dbName']);

    if ( ! $connection ) {
        // do whatever you need to when the information passed does not work
        exit;
    }

    // must be valid as we connected

    $str = '<?php' . PHP_EOL;
    $str .= 'define("DB_HOST", "' . $_POST['dbHost'] . '");'        . PHP_EOL;
    $str .= 'define("DB_USER", "' . $_POST['dbUsername'] . '");'    . PHP_EOL;
    $str .= 'define("DB_PASS", "' . $_POST['dbPassword'] . '");'    . PHP_EOL;
    $str .= 'define("DB_NAME", "' . $_POST['dbName'] . '");'        . PHP_EOL; 

    $str .= '$connection = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);' . PHP_EOL;

    // create the config file in all confidence that the values will work
    file_put_contents($phConfigFile, $str);    
}
0 голосов
/ 18 февраля 2020

Это то же самое, что и ответ RiggsFolly, но улучшено.

if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['db-details'])) {
    try {
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        $connection = new mysqli(
            $_POST['dbHost'],
            $_POST['dbUsername'],
            $_POST['dbPassword'],
            $_POST['dbName']
        );

        $DBconfig = [
            'dbHost' => $_POST['dbHost'],
            'dbUsername' => $_POST['dbUsername'],
            'dbPassword' => $_POST['dbPassword'],
            'dbName' => $_POST['dbName']
        ];

        // generate the config file
        $contents = '<?php' . PHP_EOL;
        $contents .= '$DBconfig = ' . var_export($DBconfig, true) . ';' . PHP_EOL;
        $contents .= 'mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);' . PHP_EOL;
        $contents .= '$connection = new mysqli(
            $DBconfig["dbHost"],
            $DBconfig["dbUsername"],
            $DBconfig["dbPassword"],
            $DBconfig["dbName"]
        );';
        echo $contents;
    } catch (\Exception $e) {
        // echo error message here and show the same form. 
    }
}

По сути, вы должны избегать оператора подавления ошибок любой ценой. К счастью, PHP имеет исключения, которые можно перехватить и обработать.

Если исключений нет, вы можете поместить сведения о соединении в массив, а затем экспортировать этот массив в строку. Создайте файл подключения и сохраните его.

Еще одна вещь, которую я хотел бы улучшить, - это инкапсулировать это в функцию, чтобы предотвратить утечку деталей конфигурации.

// generate the config file
$contents = '<?php' . PHP_EOL;
$contents .= 'function db_connect():\mysqli { '. PHP_EOL;
$contents .= '$DBconfig = ' . var_export($DBconfig, true) . ';' . PHP_EOL;
$contents .= 'mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);' . PHP_EOL;
$contents .= 'return new mysqli(
    $DBconfig["dbHost"],
    $DBconfig["dbUsername"],
    $DBconfig["dbPassword"],
    $DBconfig["dbName"]
);';
$contents .= PHP_EOL;
$contents .= '}'.PHP_EOL;
$contents .= '$connection = db_connect();'.PHP_EOL;
echo $contents;
0 голосов
/ 13 февраля 2020

Так что, если я вас правильно понял, вы хотите знать, действительно ли введенные пользователем данные действительны для подключения к серверу. Не проверять его.

Вы можете включить файл, который вы только что написали, и протестировать его.

Просто убедитесь, что вы используете то же имя переменной после include.

if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['db-details']) {

 $dbName = $_POST['dbName'];
 $dbUsername = $_POST['dbUsername'];
 $dbPassword = $_POST['dbPassword'];
 $dbHost = $_POST['dbHost'];

 $phConfigFile = 'includes/ph_config.php';

 file_put_contents($phConfigFile, $phConfigData);

 include($phConfigFile);

 if ($connection->connect_errno) {
  //data for the connection isn't valid
  echo "Failed to connect to MySQL: " . $connection->connect_error;
  exit();
 }

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