#php #mysql #sql #codeigniter #xampp
#php #mysql #sql #codeigniter #xampp
Вопрос:
Привет, я кодирую модуль входа и регистрации, я обнаружил ошибку в сеансе, подобную этой. Сначала я делаю вход в систему, затем закрываю страницу. После этого я снова открываю страницу и указываю URL-адрес пути, и это произойдет…..,
- Если я укажу URL-адрес пути «localhost/codeigniter/index.php/some-controller», он покажет страницу просмотра в состоянии перед входом в систему.
- Но если я нажму что-нибудь, чтобы изменить страницу, она покажет состояние после входа в систему, а URL-адрес пути изменится с «localhost/codeignite/index.php/some-controller» на «[::1]/codeigniter/index.php/some-controller»
- поэтому, если я попытаюсь сначала указать [::1] вместо localhost в URL-адресе path, он также покажет состояние после входа в систему. что происходит? почему я не могу использовать localhost? Кажется, у него нет сеанса, если я использую localhost. или это ошибка в xampp mysql??
<?php ///////////////view/header.php///////////
if($this->session->userdata('is_logged_in'))
{
echo "Welcome!, " . $this->session->userdata('username');
echo anchor('login/logout','Sign Out') ."</span>";
}
else
{
echo anchor('login','Log in');
echo anchor('register/index','Register') ;
}
?>
Контроллер входа в систему
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Login extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library(array('form_validation','session'));
}
public function index()
{
$this->load->view('header');
$this->load->view('regislogin/loginform');
$this->load->view('footer');
}
public function login_validation()
{
$this->load->view('header');
$this->form_validation->set_rules('username','Username','required|trim|callback_validate_credentials');
$this->form_validation->set_rules('password','Password','required|md5|trim');
if($this->form_validation->run()) //==TRUE
{
$data = array(
'username' => $this->input->post('username'),
'is_logged_in' => true
);
$this->session->set_userdata($data);
redirect('login/userPage');
}
else
{
$this->load->view('regislogin/loginform');
}
}
public function userPage()
{
if($this->session->userdata('is_logged_in')) //if==true
{
$this->load->view('header');
$this->load->view('regislogin/success');
}
else
{
}
}
public function validate_credentials()
{
//$this->load->model('login_model'); //autoload already
if($this->login_model->can_login()) //if can_login == true
{
return true;
}
else
{
$this->form_validation->set_message('validate_credentials','Username/Password Incorrect');
return false;
}
}
public function logout()
{
$this->session->sess_destroy();
redirect('login');
}
}
Модель входа в систему
<?php
class Login_model extends CI_Model
{
public function can_login()
{
$this->db->where('username', $this->input->post('username'));
$this->db->where('password', md5($this->input->post('password')));
$query = $this->db->get('member');
if($query->num_rows() == 1) //if Found 1 match
{
return true;
}
else
{
return false;
}
}
}
register controller
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Register extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library(array('form_validation','session'));
}
public function index()
{
$this->load->view('header');
$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[6]);
if($this->form_validation->run() == FALSE)
{
$this->load->view('regislogin/register_view');
}
else
{
$key = md5(uniqid());
$this->load->library('email', array('mailtype'=>'html'));//default mailtype is 'text'
$this->email->from('supanat_thana@hotmail.com', "Webmaster");
$this->email->to($this->input->post('email'));
$this->email->subject("Confirm your account");
$message = "<p>Thank you for register!</p>";
$message .= "<p><a href='".base_url()."register/register_activate/$key'>Click Here</a> เพื่อยืนยันบัญ๙ีของคุณ </p>";
$this->email->message($message);
if($this->register_model->add_temp_user($key))
{
if($this->email->send())
{
$data['emailstr'] = "Please activate your account by email";
}
else
{
$data['emailfail'] = "could not send the email.";
}
}
else
{
echo "Problem: cannot insert to out database";
}
$this->load->view('regislogin/success', $data);
}
}
public function register_activate($key)
{
if($this->register_model->is_key_valid($key))
{
if($newuser = $this->register_model->addMember($key))
{
$data = array(
'username' => $newuser,
'is_logged_in' => true
);
$this->session->set_userdata($data);
redirect('login/userPage');
echo "successfully activate account <br/>";
echo anchor('home', 'back to Home');
} else echo "sorry cannot activate account";
}
else
{
echo "invalid key";
}
}
}
register model
<?php
class Register_model extends CI_Model
{
public function __construct()
{
parent::__construct();
}
public function add_temp_user($key)
{
$data = array(
'username' => $this->input->post('username'),
'password' => md5($this->input->post('password')),
'email' => $this->input->post('email'),
'phone' => $this->input->post('phone'),
'key' => $key
);
$query = $this->db->insert('temp_user', $data);
if($query) {return true;}
else {return false;}
}
public function is_key_valid($key)
{
$this->db->where('key', $key);
$query = $this->db->get('temp_user');
if($query->num_rows() == 1)
{
return true;
}
else{return false;}
}
public function addMember($key)
{
$this->db->where('key', $key);
$temp_users = $this->db->get('temp_user');
if($temp_users)
{
$row = $temp_users->row();
$data = array(
'username' => $row->username,
'password' => $row->password,
'email' => $row->email,
'phone' => $row->phone
);
$did_adduser = $this->db->insert('member', $data);
}
if($did_adduser)
{
$this->db->where('key', $key);
$this->db->delete('temp_user');
return $data['username'];
} else{return false;}
}
public function isUserExist()
{
$username = $this->input->post('username');
$this->db->where('username',$username);
$query = $this->db->get('member');
if($query->num_rows() > 0)
{
return true;
}
else
{
return false;
}
}
public function isEmailExist()
{
$email = $this->input->post('email');
$this->db->where('email',$email);
$query = $this->db->get('member','temp_user');
if($query->num_rows() > 0)
{
return true;
}
else
{
return false;
}
}
}
view/regislogin/success.php
<DOCTYPE! html>
<html>
<head>
<title> Register </title>
<meta charset="utf-8">
</head>
<body>
<?php
if($this->input->post("btn"))
{
echo "<h3>Thank you for your registration</h3>";
echo $emailstr."<br/><br/>";
if(isset($emailfail)) {echo $emailfail."<br/><br/>";} else{}
echo anchor('home', 'กลับสู่หน้าหลัก');
}
else
{
echo "<h3>Successful Login</h3>";
echo "<pre>";
echo "Welcome!, ". $this->session->userdata('username');
echo "</pre>";
echo anchor('login/logout', 'Logout')."<br/>";
echo anchor('home', 'Back to Home');
}
?>
</body>
</html>
view/loginregis/loginform.php
<div class="loginbox">
<?php echo form_open('login/login_validation');?>
<h2> Login </h2>
<ul id='login'>
<li>
Username: <br>
<input type='text' name='username'>
</li>
<li>
Password:<br>
<input type='password' name='password'>
</li>
<br>
<li>
<input type='submit' name='btn2' value='Log in'>
</li>
<li>
<br>
<?php echo anchor("register/index","Register");?>
</li>
</ul>
<?php echo form_close();?>
</div>
view/regislogin/register_view.php
<head>
<meta charset="utf-8">
<title>Register</title>
</head>
<div id="wrapper_regis">
<div id="header_regis">
<h1>Register</h1>
</div>
<?php echo form_open('register');?>
<table>
<tr>
<td>Username : </td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td>Password : </td>
<td><input type="password" name="password" value=""/></td>
</tr>
<tr>
<td>Confirmed Password : </td>
<td><input type="password" name="pass_confirm" value=""/></td>
</tr>
<tr>
<td>Email : </td>
<td><input type="text" name="email" value=""/></td>
</tr>
<tr>
<td>Phone : </td>
<td><input type="text" name="phone" value=""/></td>
</tr>
</table>
<br/>
<input class="btn" type="submit" name="btn" value="สมัครสมาชิก"/>
<?php echo form_close();?>
</div>
Таблица MySQL
CREATE TABLE `temp_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(35) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(50) NOT NULL,
`phone` varchar(15) NOT NULL,
`key` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `member` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(50) NOT NULL,
`phone` varchar(15) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
в config/autoload.php
$autoload['libraries'] = array('database', 'session');
$autoload['helper'] = array('url','form');
$autoload['model'] = array('register_model','login_model');
Комментарии:
1. не видел ошибки в коде. это может быть вызвано конфликтом имени сеанса
Ответ №1:
Пожалуйста, проверьте, работает ли ваш сеанс или нет, также добавляете ли вы правильное условие для контроллера и выхода из системы. Лучше добавить одно условие в хуки, чтобы вам не приходилось писать его на каждом контроллере. Также вы можете предоставить некоторый фрагмент кода, чтобы посмотреть больше.
Ответ №2:
Я импортировал ваш код, и он работает так, как должен быть. Пожалуйста, просто выполните следующие действия 1. добавьте пустой массив $data = array(); внутри Register.php (контроллер) в индексной функции. 2. В контроллере входа в систему внутри функции userPage , Else condition добавьте строку, чтобы перенаправить ее на страницу входа
public function userPage()
{
if($this->session->userdata('is_logged_in')) //if==true
{
$this->load->view('header');
$this->load->view('regislogin/success');
}
else
{
redirect('login');
}
}
Если у вас есть какие-либо проблемы, не могли бы вы поделиться своим именем страницы, на которой вы получаете ошибки.
Комментарии:
1. Не могли бы вы, пожалуйста, дать мне поток, например, вы собираетесь index.php/login затем index.php / userPage и т.д., Чтобы я мог понять весь сценарий
2. 1. home.php <— извините, я не помещаю сюда файл просмотра, но мой view/home.php это всего лишь тестовая страница, которую вы можете создать сами. 2. перейдите на страницу loginform 3. введите имя пользователя и пароль 4.заголовок изменится на welcome! имя пользователя 5. закройте страницу 6. откройте страницу введите любой URL-адрес localhost /codeigniter……….. не [::1]/codeigniter/….. например, «localhost/codeigniter/index.php/register, а затем вы увидите заголовокне отображается приветствие! сообщения об имени пользователя больше нет.
3. Это я создал, но не получаю то, какой поток выдает вам ошибку. Просто хочу знать, какой поток вы делаете
4. 7. если указать URL-адрес, подобный этому «[::1]/codeigniter/index.php/some_controller, такой как home, register», вы увидите, что результат показывает приветствие! имя пользователя в заголовке правильно.
5. В заключение, если я использую «[:: 1]» вместо «localhost» в URL пути, сеанс будет работать правильно. и да, если я перейду на другую страницу, она автоматически изменит localhost на [::1] и тоже будет работать нормально.
Ответ №3:
хорошо, я решаю это. в пути к папке config/config.php установите этот $config[‘base_url’] = ‘http://’.$_SERVER[‘HTTP_HOST’].’/foldername’;