Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将数据库连接变量安全地传递到新页面?_Php_Mysql_Oop - Fatal编程技术网

Php 如何将数据库连接变量安全地传递到新页面?

Php 如何将数据库连接变量安全地传递到新页面?,php,mysql,oop,Php,Mysql,Oop,你好,你可能会说这个问题已经被回答了,但是相信我,我在问之前已经搜索了所有的问题,但是仍然很困惑。我试图将数据库连接变量$conn传递给新文件中的函数,但我不想全局传递,因为这样做不安全。你能帮我找到一个解决方案,并解释一下我该怎么做吗?我喜欢学习,不想要免费的代码。以下是我目前的代码: 以下是连接到数据库的代码: define('DBHOST','localhost'); define('DBUSER','root'); define('DBPASS',''); define('DBNAME'

你好,你可能会说这个问题已经被回答了,但是相信我,我在问之前已经搜索了所有的问题,但是仍然很困惑。我试图将数据库连接变量
$conn
传递给新文件中的函数,但我不想全局传递,因为这样做不安全。你能帮我找到一个解决方案,并解释一下我该怎么做吗?我喜欢学习,不想要免费的代码。以下是我目前的代码:

以下是连接到数据库的代码:

define('DBHOST','localhost');
define('DBUSER','root');
define('DBPASS','');
define('DBNAME','my_cms');

function connecting ($conn) {

    $conn = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
    if(mysqli_connect_error())
    {
        die( "Sorry! Can't connect to the database." . mysqli_connect_error());
    }
}
下面是我在functions.php文件中的登录函数代码

function login($user, $pass)
{  
    $user = $conn->real_escape_string($user);
    $pass = $conn->real_escape_string($pass);
    $password = md5($pass);
    $sql = $conn->prepare("SELECT * FROM members WHERE username = ? AND password=?");
    $result->bind_param("ss", $user, $password); 
    $result->execute() or die('Query failed. '); 

    if ($result->num_rows) 
    {
         $_SESSION['authorized'] = true;
         header('Location: '.DIRADMIN);
         exit();
    } 
    else 
    {
         $_SESSION['error'] = 'Sorry, wrong username or password';
    }
    $conn->close();
}

有几种方法和设计模式需要考虑。一种简单的方法是在单个文件中定义数据库连接功能,然后在需要访问数据库的任何页面中包含该文件。例如:

在文件
database.inc.php
中:

<?php
define('DBHOST','localhost');
define('DBUSER','root');
define('DBPASS','');
define('DBNAME','my_cms');

$conn = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
if(mysqli_connect_error())
{
    die( "Sorry! Can't connect to the database." . mysqli_connect_error());
}
?>

根据您的应用程序,您可以选择使用。同样,也不清楚为什么在这样的事情上使用全局变量是特别不安全的

需要\u一次
或使用framework@Chay22很抱歉,您需要的是config.php文件吗?我已经做到了。还使用什么框架?你能说得更具体些吗?谢谢,怎么了?您是否为包含文件使用了正确的文件路径?是的,我使用的是Microsoft Expression,它有一个插入选项,可以自行插入require_once代码。然后是错误:警告:login()缺少参数3,在第18行的C:\xampp\htdocs\cms\admin\login.php中调用,在第6行的C:\xampp\htdocs\cms\includes\functions.php中定义致命错误:调用成员函数real\u escape\u string()在第8行C:\xampp\htdocs\cms\includes\functions.php中的非对象上,是否修改了
login()
函数以接受上述示例中所示的3个参数?您原来的函数有2个(用户名、密码)。@Chay22捕捉得很好@mrRay,尝试将变量
$sql
$result
重命名为
$stmt
(按约定)。请参阅更新的答案。@好吧,实际上,当我在Microsoft Expression上按“撤消”时,它会撤消几个步骤,这可能是旧版本,但即使我有$sql作为“执行”和“全部”,我仍然会得到一个错误。问题是,它无法识别$conn变量,而$conn变量是连接变量,但如果我在login函数中全局放置它,它就会识别。但是使用OOP php是不安全的。所以我的问题是,在这里如何使用依赖注入?
<?php
require_once '...\database.inc.php';

function login($conn, $user, $pass)
{  
    $user = $conn->real_escape_string($user);
    $pass = $conn->real_escape_string($pass);
    $password = md5($pass);
    $stmt = $conn->prepare("SELECT * FROM members WHERE username = ? AND password=?");
    $stmt->bind_param("ss", $user, $password); 
    $stmt->execute() or die('Query failed. ');
    ....
}
...
?>