【问题标题】:How verify mysql database connection from another file php如何从另一个文件php验证mysql数据库连接
【发布时间】:2020-05-29 11:39:15
【问题描述】:

我创建了一个表单,用户可以在其中添加他的数据库名称、用户名、密码、主机。然后该表单创建一个配置文件并添加用户数据库详细信息。表单在 root 中,配置文件在 root/includes 中。我想知道如何从表单文件验证数据库连接。如果连接成功,他可以继续下一步,如果不是,我想显示错误。

表格

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);

}

配置

<?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);

【问题讨论】:

  • 如果您分享代码的关键部分会很棒,这样我们就可以看到它是如何制作的。
  • 您是否为每个用户提供了一个单独的数据库?
  • @RiggsFolly 不,这是一个类似于 Wordpress 的应用程序。当用户提取 zip 时,他可以添加他的数据库详细信息,如果连接成功,应用程序将安装
  • 那么只需将 $_POST 变量放入连接尝试并检查结果
  • 所以你想用 HTML 表单来生成一个 db 配置文件?

标签: php mysql mysqli


【解决方案1】:

因此,如果我说得对,您想知道用户输入的数据是否真正有效地连接到服务器。不验证它。

您可以包含刚刚编写的文件并对其进行测试。

只要确保在包含后使用相同的变量名即可。

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();
 }

}

【讨论】:

  • 是的,我做了同样的事情,但以程序的方式。谢谢你的时间
【解决方案2】:

你真的想在创建配置文件之前检查连接,所以一旦创建你就知道它会起作用

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);    
}

【讨论】:

  • 这适用于两个答案:我认为您不能在连接失败时使用$connection-&gt;connect_errnomysqli_connect() 将返回 false。但我必须说 - 在生成可能无效的配置文件之前,我还会检查连接。
  • 嗨@PaulSpiegel 我确实说过我会在创建配置文件之前检查连接(就像我正在做的那样)?还是你只是同意我的观点??
  • 是的 - 只是同意。
  • @PaulSpiegel 嗯,我认为连接测试是对的 :)
  • 这就是他们在manual 中的做法——这是不良做法的好来源;-)
【解决方案3】:

这与 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;

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2015-10-22
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多