【发布时间】:2018-06-23 14:43:15
【问题描述】:
困扰我一段时间的事情。我正在学习使用 oop php、ajax 和使用 pdo 的引导程序进行登录系统。
到目前为止,我已经登录并注册了一部分。 用户在表单中输入信息,被提交给 auth.php,该文件通过一个看起来像这样的 ajax 文件在 user.php 中运行其各自的方法
$(function(){
$('.form').on('submit', function(e){
e.preventDefault();
$form = $(this);
submitForm($form);
});
});
function submitForm($form){
$footer = $form.parent('.modal-body').next('.modal-footer');
$footer.html('<img src="images/ajax-loader.gif">');
$.ajax({
url: $form.attr('action'),
method: $form.attr('method'),
data : $form.serialize(),
success : function( response ){
response = $.parseJSON( response );
if(response.success){
if(!response.signout){
$footer.html( response.message );
setTimeout(function(){
$footer.html( response.message );
window.location = response.url;
}, 1500
);
}
else if(response.signout == 2){
$footer.html( response.message );
setTimeout(function() {
$('#signup').modal('hide');
$('#login').modal('show');
}, 2000
);
}
else if(response.signout == 3){
$footer.html( response.idid );
}
}
else if(response.error){
$footer.html( response.message );
}
console.log(response);
}
})
}
在登录的情况下,ajax 向 auth.php 提交信息,auth.php 运行 user.php 中的方法并将用户登录
auth.php 看起来像这样:
<?php
require_once 'includes/init.php';
$status = $user->login($_POST, $db);
if($status === 'success'){
echo json_encode([
'success' => 'success',
'message'=> '<p class="alert alert-success">Authenticated successfully</p>',
'url' => 'profile.php',
]);
}
else if($status === 'successAdmin'){
echo json_encode([
'success' => 'success',
'message'=> '<p class="alert alert-info">Welcome Admin</p>',
'url' => 'profileAdmin.php',
]);
}
else if($status === 'missing_fields'){
echo json_encode([
'error' => 'error',
'message'=> '<p class="alert alert-danger">All fields are mandatory</p>',
]);
}
else if($status === 'email_dosent_exist'){
echo json_encode([
'error' => 'error',
'message'=> '<p class="alert alert-danger">The e-mail/phone number address you provided does not exist. Please create an account first.</p>',
]);
}
else if($status === 'error'){
echo json_encode([
'error' => 'error',
'message'=> '<p class="alert alert-danger">Incorrect e-mail/phone number or password</p>',
]);
}
之后它在 user.php 中运行一个方法并设置会话变量
public function login($user, $db){
if(empty($user['emailPhone']) OR empty($user['password'])){
return 'missing_fields';
}
else if(!$this->emailExists($user['emailPhone'],$db) AND !$this->phoneExists($user['emailPhone'],$db)){
return 'email_dosent_exist';
}
else{
$sql = "SELECT * FROM `users` WHERE `email`=? OR `phone_number`=?" ;
$statement = $db->prepare($sql);
if( is_object($statement) ){
$statement->bindParam(1, $user['emailPhone'], PDO::PARAM_STR);
$statement->bindParam(2, $user['emailPhone'], PDO::PARAM_STR);
$statement->execute();
if($row = $statement->fetch(PDO::FETCH_OBJ)){
if(password_verify($user['password'], $row->password)){
if ( $row->is_admin == 'admin') {
$_SESSION['logged_in'] = [
'id' => $row->id,
'name' => $row->name,
'c1' => $row->course1,
'conf1' => $row->paid1,
'c2' => $row->course2,
'conf2' => $row->paid2,
'c3' => $row->course3,
'conf3' => $row->paid3,
'c4' => $row->course4,
'conf4' => $row->paid4,
'c5' => $row->course5,
'conf5' => $row->paid5,
'isBossMan' => $row->is_admin,
];
return 'successAdmin';
}
$_SESSION['logged_in'] = [
'id' => $row->id,
'name' => $row->name,
'c1' => $row->course1,
'conf1' => $row->paid1,
'c2' => $row->course2,
'conf2' => $row->paid2,
'c3' => $row->course3,
'conf3' => $row->paid3,
'c4' => $row->course4,
'conf4' => $row->paid4,
'c5' => $row->course5,
'conf5' => $row->paid5,
];
return 'success';
}
}
}
}
return 'error';
}
但是我使用了太多的会话变量。这是一个好习惯吗?
我还需要帮助才能在不使用会话变量的情况下在 profile.php 中显示数据。我想在 user.php 中运行一个 sql 语句来从表中选择所有当前用户数据并在他的 profile.php 页面中显示为一个表?
到目前为止我得到的是
public function displayInfo($user, $db){
$sql = "SELECT `name`, `email`,`institute_name`, `country_code`, `phone_number`, FROM `users` WHERE `email`=? OR `phone_number`=?" ;
$statement = $db->prepare($sql);
if( is_object($statement) ){
$statement->bindParam(1, $user['adminFetch'], PDO::PARAM_STR);
$statement->bindParam(2, $user['adminFetch'], PDO::PARAM_STR);
$statement->execute();
if($row = $statement->fetch(PDO::FETCH_OBJ)){
if (!empty($_SESSION['logged_in']['isBossMan'])) {
return 'success';
echo json_encode($row);
}
}
}
}
我该怎么做呢?我知道 row 变量具有我想要显示的必要信息,但是如何在 profile.php 页面上显示这些信息? 我是否需要编写另一个 ajax 代码来显示或者可以使用相同的代码来完成它?
到目前为止,我取得了一些进展: 我在 profile.php 页面上有一个字段,用户在其中输入任何人的电子邮件并按下按钮以从数据库中获取有关该用户的信息 从表中获取用户信息并显示在 profile.php 上的 div 中,并带有新的获取 ajax 代码我为它写的:
function fetchForm($fetch){
$fetchFooter = $fetch.parent('.modal-body').next('.modal-fetchFooter');
$fetchFooter.html('<img src="images/ajax-loader.gif">');
$fetchBody = $fetchFooter.next();
$.ajax({
url: $fetch.attr('action'),
method: $fetch.attr('method'),
data : $fetch.serialize(),
success : function( data ){
data = $.parseJSON( data );
$fetchFooter.html(data);
if(data.error){
$fetchFooter.html(data.message);
}
else{
$fetchFooter.html(data);
}
}
})
}
它将它发送到这个 fetch.php 文件,该文件具有以下代码并在 user.php 中运行一个方法来检索信息
<?php
require_once 'includes/init.php';
$status = $user->displayInfo($_POST, $db);
if( $status === 'missing_fields'){
echo json_encode([
'error'=> 'error',
'message'=> '<p class="alert alert-danger">Please enter a e-mail address or phone number to fetch data.</p>',
]);
}
user.php 的方法看起来像
public function displayInfo($user, $db){
if(empty($user['adminFetch'])){
return 'missing_fields';
}
else if(!$this->emailExists($user['adminFetch'],$db) AND !$this->phoneExists($user['adminFetch'],$db)){
return 'emailphone_dosent_exist';
}
else{
$sql = "SELECT `name`, `email`,`institute_name`, `country_code`, `phone_number` FROM `users` WHERE `email`=? OR `phone_number`=?" ;
$statement = $db->prepare($sql);
if( is_object($statement) ){
$statement->bindParam(1, $user['adminFetch'], PDO::PARAM_STR);
$statement->bindParam(2, $user['adminFetch'], PDO::PARAM_STR);
$statement->execute();
if($row = $statement->fetch(PDO::FETCH_ASSOC)){
if (!empty($_SESSION['logged_in']['isBossMan'])) {
echo json_encode($row);
}
}
}
}
return 'missing_fields';
}
如果您不输入任何内容并按下按钮,它就可以正常工作。 div 替换为错误代码。
但是当用户键入正确的现有电子邮件或电话号码时,该方法和 fetch.php 将返回 2 个 json 对象。 一个有用户信息,另一个有错误状态。
我做错了什么,我该如何做到,所以它只返回 1 个带有信息的 json,在 true 情况下或在 false 情况下返回错误 json?
【问题讨论】:
-
我注意到的第一件事是你有
echo json_encode($row)AFTER 你返回声明。那行代码永远不会被执行。如果您删除return 'success';行,您可能会很高兴。回答您的问题“会话变量是否太多?”好吧,这取决于。由于您可以运行廉价查询来获取该数据,因此我建议您只保存登录用户的 id 并在需要其余部分时运行查询。除非这意味着您运行查询数百万次,否则不会那么好。因此,这在很大程度上取决于您需要多久访问一次该数据。 -
我明白了,但我是 oop 和 ajax 的新手,所以我想知道在 user.php 文件中是否需要
json_encode。因为 view.php 文件(类似于 auth.php)正在运行这个displayInfo方法并且已经有一个 json_encode 取决于从 user.php 返回的内容,就像 auth.php 文件一样。那么我需要json_encode还是有办法将$row转发到view.php,然后显示在profile.php 页面上?