>SOLVED:在多次重写mysql和成员代码后,最后一个在启用mysqlind(本机驱动程序)时起作用。
我有这个运行良好的登录脚本,但我希望它将登录用户的全名发布到我的页面。
我希望它使用登录时提供给会话的用户名在任何给定页面上的div 中获取和发布名字和姓氏。
登录脚本:
<?php
session_start();
require_once 'classes/membership.php';
$membership = new Membership();
// If the user clicks "Log Out".
if(isset($_GET['status']) && $_GET['status'] == 'loggedout') {
$membership->log_User_Out();
}
// Did the user enter a password/username and click submit?
if($_POST && !empty($_POST['username']) && !empty($_POST['pwd'])) {
$response = $membership->validate_User($_POST['username'], $_POST['pwd']);
}
?>
检查成员资格中的凭据.php:
<?php
require 'mysql.php';
class Membership {
function validate_user($un, $pwd) {
$mysql = New Mysql();
$ensure_credentials = $mysql->verify_Username_and_Pass($un, md5($pwd));
list($ensureCredentials, $data) = $mysql->verify_Username_and_Pass($un, md5($pwd));
if($ensure_credentials) {
$_SESSION['status'] = 'authorized';
$_SESSION['fname'] = $data['fname'];
$_SESSION['lname'] = $data['lname'];
header("location: medlem.php");
} else return "Please enter correct username and password";
print_r($row);
exit;
}
function log_User_Out() {
if(isset($_SESSION['status'])) {
unset($_SESSION['status']);
if(isset($_COOKIE[session_name()]))
setcookie(session_name(), '', time() - 1000);
session_destroy();
}
}
function confirm_Member() {
session_start();
if($_SESSION['status'] !='authorized') header("location: login.php");
}
}
在 mysql 中建立与 mysql 的连接.php:
<?php
require_once 'includes/constants.php';
class Mysql {
private $conn;
function __construct() {
$this->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or
die('There was a problem connecting to the database.');
}
function verify_Username_and_Pass($un, $pwd) {
$query = "SELECT *
FROM users
WHERE username = ? AND password = ?
LIMIT 1";
if($stmt = $this->conn->prepare($query)) {
$stmt->bind_param('ss', $un, $pwd);
$stmt->execute();
// UPDATE : I added correct usage of the stmt here.
$result = $stmt->get_result();
if($row = $result->fetch_array()) {
$stmt->free_result();
$stmt->close();
// returning an array the first item is the validation the second is the data.
return array(true, $row);
}
}
// if there is no just return empty data, and false for validation.
return array(false, array());
}
为了可重用性,我在常量中定义了常量.php:
<?php
// Define constants here
define('DB_SERVER', 'localhost');
define('DB_USER', 'myusername');
define('DB_PASSWORD', 'mypassword');
define('DB_NAME', 'membership');
当会话只知道登录用户的用户名时,我如何轻松地让它从MySQL数据库中检索名字(fname)和姓氏(lname)。
正如我上面所说,名字和姓氏的行名称是 fname 和 lname。
我想使用浮动 CSS 格式的div id'ed topr 尽可能简单地显示它,如下所示:
<?php
session_start();
if(isset($_SESSION['status'])){
echo "<div id='topr'>Welcome, " . $_SESSION['fname'] . "!</div>";
} ?>
我主要关注先显示名字。当我做对时,我肯定会让它显示姓氏。
只是想了解更多有关此的信息。因为我的网络搜索没有想出任何我可以设法在我的代码中实现而不会搞砸的东西。
按如下方式更改验证函数。我添加了相关评论。
function verify_Username_and_Pass($un, $pwd) {
$query = "SELECT *
FROM users
WHERE username = ? AND password = ?
LIMIT 1";
if($stmt = $this->conn->prepare($query)) {
$stmt->bind_param('ss', $un, $pwd);
$stmt->execute();
// UPDATE : I added correct usage of the stmt here.
$result = $stmt->get_result();
if($row = $result->fetch_array()) {
$stmt->free_result();
$stmt->close();
// returning an array the first item is the validation the second is the data.
return array(true, $row);
}
}
// if there is no just return empty data, and false for validation.
return array(false, array());
}
因此,在调用verify_Username_and_Pass的 MemberShip 类中,只需将数组数据放入变量中。 并使用它发送到会话变量。因此,您将有资格在您想要的任何位置使用会话。
list($ensureCredentials, $data) = $mysql->verify_Username_and_Pass($un, md5($pwd));
if($ensure_credentials) {
$_SESSION['status'] = 'authorized';
$_SESSION['first_name'] = $data['first_name'];
$_SESSION['last_name'] = $data['last_name'];
header("location: medlem.php");
} else return "Please enter correct username and password";
一种方法可能是这样做:
verify_Username_and_Pass()
中,不要只返回布尔值 true,而是返回名字和姓氏;如果出错/失败,则返回 false。
这样,类中validate_user()
Membership
中的 if 语句仍然可以按原样工作。然后,您需要做的就是通过$_SESSION['full_name'] = $ensure_credentials;
将该信息保存到会话中