OK przyj żyjmy się twojemu programowi:
Cytat(adbacz @ 12.05.2011, 14:10:00 )

Z tym co napisałeś, żeby w sesji zapisać czy użytkownik jest zalogowany to już tak robiłem, jesli jest wartość 1 to zalogowany - jeśli 0 lub brak, wylogowany. No ale i tak, oprócz tego musiałbym dać coś jeszcze, bo przecież takie informacje można zmienić.
Ale chwila, przecież to sesja...


?PS.
Zrobiłem coś takiego. Główny kod llogowania:
function loguj() {
$this->load->library('logowanie_lib');
$login = $this->input->post('login');
$haslo = $this->input->post('haslo');
$zapytanie = $this->db->query("SELECT * FROM user_admin WHERE login = '".$login."'");
[color="#FF0000"]Sprawdz logowanie, po samym loginie? a hasła zadnego juz nie sprawdzasz? to po co one jest? Wystarczy ze znam login i juz jestem zalogowany
petla foreach, nie wiem co chcesz tutaj robić, przecież szukasz jednego jedynego rekordu z użytkownikiem, a a nie kilku?
[/color]
foreach($zapytanie->result() as $i) {
$user_id = $i->user_id;
$haslo_db = $i->haslo;
}
$hash = md5(sha1
($login.$this->input->ip_address().date("His"))); [color
="#FF0000"]Rozumiem że to ma być identyfikator sesji?
date his
, bedzie troche za słabe
... ogólnie po co skoro
, PHP sam zapisuje SESSID
[/color
]
$this->db->query("UPDATE user_admin SET sesja = '".$hash."', last_ip = '".$this->input->ip_address()."' WHERE user_id = ".$user_id."");
[color="#FF0000"]Tutaj rozumiem że zapisać adres ip, cały czas nie wiem po co pole "sesja" i zapis do niej tego hashu, który i tak tutaj praktycznie Nic Ci nie daje. [/color]
$this->session->set_userdata(array('user_id' => $user_id, 'pass' => $hash)); [color="#FF0000"]Nie zapisuj hasła w sesji! [/color]
if($this->logowanie_lib->sprawdz() == TRUE) {
echo 'jesteś zalogowany'; }
[color="#FF0000"]Ok, sprawdzasz czy jest zalogowany TRUE, a zaraz potem sprawdzasz czy ma false, przecież jeżeli niema TRUE to: Może być false, może byc null, może zmiennej w ogóle nie być.
wystarczy if (zalogowany) else 'ok to nie'[/color]
elseif($this->logowanie_lib->sprawdz() == FALSE) {
echo 'Nie jestes zalogowany'; }
}
I biblioteka Logowanie_lib.php:
function sprawdz() {
$CI =& get_instance();
$pass = $CI->session->userdata('pass');
$user_id = $CI->session->userdata('user_id');
[color
="#FF0000"]Co tu robi
MYSQL_QUERY?
, ogołnie po co to zapytanie?
[/color
] $zapytanie = mysql_query("SELECT last_ip FROM user_admin WHERE user_id = ".$user_id.""); $ip_address_db = $wiersz[0];
}
[color
="#FF0000"]

? Tutaj to ja już nic nie rozumie
, dajesz zapytanie o ostatni adres IP
, aby zaraz pobrać aktualny
, podczas gdy przy logowaniu zapisujesz własnie ten aktualny adres IP
[/color
] $ip_address_cookie = $CI->input->ip_address();
if($pass == 0 || $user_id == 0 || $ip_address_db != $ip_address_cookie) {
return FALSE;
}
if($pass != 0 && $user_id != 0 && $ip_address_db == $ip_address_cookie) {
return TRUE;
}
[color="#FF0000"]Przecież tu wyżej wystarczy tylko return $this->session->userdata('zalogowany');
[/color] }
Działa dobrze, tylko, że to i tak po wyłączeniu przeglądarki wszystko się "refresh" i już nie jestem zalogowany.
To zapisywanie
userID oraz ciągu znaków pod nazwą
pass wziąłem z pewnego portalu znanego. Zauważyłem, że po zmianie obojętnie którego jestem automatycznie wylogowany więc uznałem, że to dobrze rozwiązanie. Tylko tak, mimo, że wyłącze przeglądarkę - nadal jestem zalogowany.
Jak Ci to działało to ja jestem na prawdę pod wrażeniem, i się dziwie że PHP taki kod w ogóle wykonał.
Przykład szybkiego logowania, pisany na szybko, więc mogą być błędy, no i brakujemy modeli, zapytania są w kontrolerze. I nie sprawdzałem czy ten kod działa. Jak nie działa to rozkmiń jak go uruchomić.
<?php
class Users extends CI_Controller {
public function index()
{
$data['error'] = Null;
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
if ($this->form_validation->run() == TRUE)
{
$this->load->helper('security'); // do_hash() helper
$this->db->select('user_id, userame, password, name');
$this->db->where('username', $this->input->post('username'));
$this->db->where('password', do_hash($this->input->post('password')));
$user = $this->db->get('users')->result_array();
{
$this->session->set_userdata('user_login', TRUE);
unset($user['0']['password']); // nie przechowujmy hasła w sesji
$this->session->set_userdata('user', $user);
$this->db->where('user_id', $user['0']['user_id']);
$this->db->update('users', Array('adres_ip', $this->input->ip_address())); // nie powninem pisac zapytan w controlerze, tylko w modelu, ale pisze to na szybko.
reidrect('users/profile', 'refresh');
}
else
{
$data['error'] = 'Podales zly login lub haslo';
}
}
$this->load->view('tutajwidok logowania', $data);
}
public function profil()
{
// Sprawdzanie czy jest zalogowany to:
if($this->session->userdata('user_login'))
{
$data['user'] = $this->session->userdata('user');
$this->load->view('users/konto itp');
}
else
{
// nie zalogowany to wypad
redirect('users', 'refresh');
}
}
public function logout()
{
$this->session->sess_destroy();
redirect('/users', 'refresh');
}
}
Jak to Ci nie pomoże to proponuje powrót do podstaw PHP i przeczytać kilka razy a potem brać się za framework.
Logowanie na sesji zawsze musi się kiedyś skończyć, w zależności od czasu jaki masz ustawiony w konfiguracji, ale zazwyczaj po restarcie przeglądarki sesja już zanika. Więc jedyne przetrzymanie tego to wrzucenie dopiero ciasteczka do klienta, i potem przy ponownym wejściu na podstawie tego ciasteczka dopiero zalogować użytkownika ponownie tworząc nową sesję.
Brakuje konstruktora w controlerze