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. ');
....
}
...
?>