Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα. Πήρα ένα course απο udemy και γενικά το προχωράω καλά. Έχω μια απορία όμως, ρώτησα και τον καθηγητή αλλά δεν παίρνω σαφή απάντηση (ή μπορεί να μην την καταλαβαίνω εγώ).

Στα γρήγορα....

Έχουμε φτιάξει ένα σύστημα, εγγραφής, σύνδεσης κλπ. Σε ένα session(userdata) μετά το login αποθηκεύουμε τα δεδομένα του χρήστη που συνδέθηκε.  Στο παράδειγμα του ο καθηγητης στο login_view εμφάνισε και το  session με το κώδικα:

    <?php if($this->session->userdata('username')): ?>
     
    <?php echo "You are logged in as " . $this->session->userdata('username');?>
     
    <?php endif; ?>

Ολα οκ μέχρι εδώ... Εγώ θέλω όμως να "τραβήξω" και εμφανίσω και άλλα πράγματα από τον χρήστη. Π.Χ. first_name και να το κάνω κάπως έτσι:

    <?php if($this->session->userdata('username')): ?>
     
    <?php echo "Hello " . $this->session->userdata('first_name');?>
     
    <br>
     
    <?php echo "You are logged in as " . $this->session->userdata('username');?>
     
    <?php endif; ?>

Το θέμα είναι οτι δεν παίρνει στοιχεία σε οτιδήποτε απο την βάση, εκτός username  και id.

Ο καθηγητής μου είπε οτι πρέπει στο session('userdata') να αποθηκεύσω, ότι θέλω από την βάση.

-------- Screenshot--------

Snip20181002_8.png.7b53e0c75e525830374377a34b14c388.png

-------- Screenshot--------

Αυτός όμως στο παράδειγμα νομίζω το κάνει ήδη. Απλά εγώ πήγα και έβαλα τα έξτρα πεδία της βάσης. Δηλαδή θα σας γράψω πως τα είχε αυτός και με κόκκινο χρώμα, τι προσθεσα εγώ, αν μπορεί να βοηθήσει κάποιος:

Στο controllers/Users.php έχει αυτή τη μέθοδο(αν το λέω σωστά)

Αναφορά σε κείμενο

    public function login() {
    $this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[3]');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[3]');
      
    if($this->form_validation->run() == FALSE) {
        
     $this->session->set_flashdata('error_login', 'Please fill correct the fields.');   
         
    } else {
        
        $username = $this->input->post('username');
        $password = $this->input->post('password');
        
        $user_id = $this->user_model->login_user($username,$password);
        
        if($user_id) {
            $user_data = array(
            'user_id' => $user_id,
            'username' => $username,
            'first_name' => $first_name,
            'last_name' => $last_name,
            'avatar' => $avatar,

            'logged_in' => true
            );
            
        $this->session->set_userdata($user_data);
            
        $this->session->set_flashdata('login_success', 'You are logged in');
            
            redirect('home');   
        
        } else {
            
            $this->session->set_flashdata('login_failed', 'Fail Login;
            
            redirect('home');  
            
        }    
    }
}

Στο models/User_model.php έχουμε:

Αναφορά σε κείμενο

    public function login_user($username, $password){
    
        $this->db->where('username', $username);
        $result = $this->db->get('users');
        $db_password = $result->row(6)->password;
           if(password_verify($password, $db_password)) {  
            return $result->row(0)->id;
        } else {
            return false;
        }
    }

Και στο views/login_view.php αυτό:

Αναφορά σε κείμενο

<?php if($this->session->userdata('logged_in')): ?>  
        
 <?php echo "Hello " . $this->session->userdata('first_name');?>

<br>

<?php echo "You are logged in as " . $this->session->userdata('username');?>

<?php endif; ?>

 Και τελικά εμφανίζεται

Hello (κενό)

You are logged in as Killer76

Τι κάνω λάθος???

 

 

 

Επεξ/σία από killer76
Δημοσ.

Οι μεταβλητές first_name και last_name δεν έχουν μέσα τους τιμή , λογικά θα πρέπει να έχει και notices στο execution.

Αυτό που πρέπει να κάνεις είναι να κάνεις ένα ακόμη function το οποίο θα τραβάει από την βάση τα στοιχεία του user που θέλεις ( πχ first_name, last_name ) με βάση το user_id που σου επιστρέφει η login_user.

 

Για παράδειγμα κάτι τέτοιο

 public function getUserData($user_id){
        $this->db->where('id', $user_id);
        $result = $this->db->get('users');
        
        if(!$result->row) {
   		return false;
	}

        return array(
		'first_name' => $result->row(0)->first_name,
		'last_name' => $result->row(0)-last_name
	)
 }

 

Και το κομμάτι που κάνεις assign τα values θα γίνει έτσι

$user_id = $this->user_model->login_user($username,$password);
if($user_id) {
			$user_info = $this->user_model->getUserData($user_id);    
            $user_data = array(
            'user_id' => $user_id,
            'username' => $username,
            'first_name' => $user_info['first_name'],
            'last_name' => $user_info['last_name'],
            'avatar' => $avatar,
            'logged_in' => true
            );
}

Μπορείς να το κάνεις και διαφορετικά , να επιστρέφεις από την αρχή δηλαδή όλη την πληροφορία που χρειάζεσαι από την user_login ( id, first_name, last_name ).

Δημοσ.

Το έκανα όπως λες αλλα και πάλι δεν δουλεύει :(

Δηλαδή στο models/User_model.php οι 2 function είναι:

 public function login_user($username, $password){
    
        $this->db->where('username', $username);

        $result = $this->db->get('users');
        
        $db_password = $result->row(2)->password;
        
           if(password_verify($password, $db_password)) {
            
            return $result->row(0)->id;
            
        } else {
            return false;
        }
        
    }
    
 public function getUserData($user_id){
        $this->db->where('id', $user_id);
        $result = $this->db->get('users');
        
        if(!$result->row) {
   		return false;
	
        } else {

        return array(
              'user_id' => $result->row(0)->id,
              'first_name' => $result->row(0)->first_name,
              'last_name' => $result->row(0)->last_name,
              'avatar' => $result->row(0)->avatar      
               );
 		}
}

 Και στο controllers/Users.php είναι:

public function login() { 
    $this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[3]');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[3]');
      
    if($this->form_validation->run() == FALSE) {
        
    $this->session->set_flashdata('message', 'Fail.');   
        
    redirect('home'); 
         
    } else {
        
        $username = $this->input->post('username');
        $password = $this->input->post('password');
        
        $user_id = $this->user_model->login_user($username,$password);
        
        if($user_id) {
            $user_info = $this->user_model->getUserData($user_id);
            $user_data = 
                
            array(
            'user_id' => $user_id,
            'username' => $username,
            'first_name' => $user_info['first_name'],
            'last_name' => $user_info['last_name'],
            'avatar' => $user_info['avatar'],
            'logged_in' => true
            );
            
        $this->session->set_userdata($user_data);
            
        $this->session->set_flashdata('message', 'Success');
            
            redirect('home');   
        
        } else {
            
            $this->session->set_flashdata('message', 'Fail');
            
            redirect('home');  
            
        }    
    }
}

Οι μεταβλητές για κάποιο λογο δεν παίρνουν στοιχεία. Δεν ξέρω γιατί. Το session δουλευει όμως. Αν βάλω δηλαδή κάτι στατικό στο array του userdata, π.χ. 'first_name' => 'John'; το δείχνει κανονικά το session. "Hello, John"

Δημοσ.

Για δες μήπως σου είπα πατάτα πιο πάνω και βγάλε το return από την if.

return array(
              'user_id' => $result->row(0)->id,
              'first_name' => $result->row(0)->first_name,
              'last_name' => $result->row(0)->last_name,
              'avatar' => $result->row(0)->avatar      
               );

Κάνε δοκιμές βλέποντας τι γίνεται σε διάφορα σημεία του προγράμματος , τερμάτισε πχ με 

var_dump($result->row(0)->first_name);
exit;

πριν την return να δεις αν έχεις δεδομένα,

Οι αλλαγές στον πίνακα της βάσης έχουν γίνει σωστά και υπάρχουν δεδομένα μέσα;

Δημοσ.

Δεν υπάρχει "πρόβλημα". Το θέμα είναι δικό σου, αν και μου φαίνεται περίεργο να μην μπορείς να πάρεις data πίσω από το model. 

Δεν γνωρίζω από code igniter οπότε ίσως κάτι χάνω.

 

  • Like 1
Δημοσ.

Για να μην ανοίγω νέο νήμα ρε παιδιά. Στην φόρμα έβαλα και ένα input για file upload με js για preview  και delete.

στην φόρμα είναι έτσι ο κώδικας.

<div class="field" align="left">
  <h3>upload photo</h3>
  <input type="file" id="files" name="avatar" />
</div>

 και το script του είναι αυτό

<script type="text/javascript">
    $(document).ready(function() {
  if (window.File && window.FileList && window.FileReader) {
    $("#files").on("change", function(e) {
      var files = e.target.files,
        filesLength = files.length;
      for (var i = 0; i < filesLength; i++) {
        var f = files[i]
        var fileReader = new FileReader();
        fileReader.onload = (function(e) {
          var file = e.target;
          $("<span class=\"pip\">" +
            "<img class=\"imageThumb\" src=\"" + e.target.result + "\" title=\"" + file.name + "\"/>" +
            "<br/><span class=\"remove\">Remove image</span>" +
            "</span>").insertAfter("#files");
          $(".remove").click(function(){
            $(this).parent(".pip").remove();
          });

          
        });
        fileReader.readAsDataURL(f);
      }
    });
  } else {
    alert("Your browser doesn't support to File API")
  }
});
    </script>

Δουλεύει μια χαρά το σύστημα. Δηλαδή επιλέγω εικόνα, γράφεται το όνομα του αρχείου, δίπλα από το upload, φαίνεται το preview, φαίνεται το κουμπί για αφαίρεση κλπ. Στέλνοντας την φόρμα, ανεβαίνει το αρχείο και αποθηκευεται και το ονομα στην βάση. Ολα οκ μεχρι εδώ δηλαδή.

Το πρόβλημα είναι οτι αν κάποιος φορτώσει μια εικόνα και μετά το μετανοιώσει και αφαιρέσει την εικόνα, όντως αφαιρείται το preview, αλλά και το όνομα αρχείου μένει γραμμένο και το αρχείο ανεβαίνει κανονικα. Πως μπορεί με την αφαίρεση της εικόνας να αδειάζει ολο το input της εικόνας???

======================================

Snip20181004_9.png.c2583baf474d42e04ef2fb487d1f0c11.png

======================================

Snip20181004_10.png.7903e866757ccf6127a2d02aaced1e82.png

======================================

Snip20181004_11.png.033f8afbf4b7ee270b2c09514295164d.png

======================================

Snip20181004_13.png.5c7a80f05109de1505829ef2f2ef3203.png

======================================

Δημοσ.

Το input σου παίρνει 1 εικόνα έτσι και αλλιώς, οπότε μπορείς να το κάνεις reset αδειάζοντας το value του

$(this).parent(".pip").remove();
$('#files').val('');

 

Δημοσ.
Στις 6/10/2018 στις 10:35 ΠΜ, sarakinos είπε

Το input σου παίρνει 1 εικόνα έτσι και αλλιώς, οπότε μπορείς να το κάνεις reset αδειάζοντας το value του


$(this).parent(".pip").remove();
$('#files').val('');

Thanks δουλεψε.

 

Δημοσ.

Καλησπέρα. Ελπίζω να σας πρήζω τελευταία φορά. Εφτασα στο τέλος σε αυτό που φτιάχνω. Εχει μείνει μόνο ένα κομμάτι που θέλω ο χρήστης να ανεβάζει φωτογραφίες.

Παιδεύτηκα λίγο με js και ajax αλλά δεν έβγαλα άκρη. Προς το παρόν ας το φτιάξω με απλή html και php και θα ασχοληθώ αργότερα να το κάνω με ajax.

Μέχρι στιγμής έφτασα εδώ, στο οποίο μου ανεβάζει τα ονόματα των φώτος στην βάση. Επίσης συνεχίζει άν υπήρχαν ήδη άλλα ονόματα. Δηλαδή αν υπήρχε η foto1.jpg,foto2.jpg, και προσθέσω την  foto3.jpg, foto4.jpg, τότε όλο το πεδίο γίνεται foto1.jpg,foto2.jpg,foto3.jpg, foto4.jpg. Μετά το τραβάω στην php, το κάνω array και με foreach δείχνω τις φωτος. Ολα καλά μέχρι εδώ.

Η τιμές εισέρχονται στην βάση. Το κακό όμως είναι οτι δεν ανεβάζει τις φωτος στο φάκελο.

Η φόρμα μου είναι

<form  action="<?php echo base_url();?>upload_files/upload_photos" method="post" align="center" enctype="multipart/form-data"> 
  
<input type="hidden" id="id" name="id" value="<?php echo $object->id; ?>"> //Στέλνω το id
<input type="hidden" id="old_photos" name="old_photos" value="<?php echo $object->photos; ?>">//Στέλνω τις υπάρχουσες τιμές της βάσης
  
<input type="file" name="upload_photos[]" id="upload_photos"  class="form-control-file border"   multiple/> </br>

<input type="submit" name="upload_photos_button" id="upload_photos_button" value="Ανεβάστε φώτος" class="btn btn-info btn-block" /> 
</form>

και η php που υποδέχεται την φόρμα μου

function upload_photos()  
   {  
    if(isset($_FILES["upload_photos"]["name"])) 
      {  $id = $this->input->post('id');
         $old_photos_string =  $this->input->post('old_photos');
         $old_photos_array = explode(',',$old_photos_string); 
               
         $uploaded_array = $_FILES["upload_photos"]["name"];
      
    foreach ($uploaded_array as $photo_item) {

        $original_name_photo = $photo_item;
        $filename_ext_photo = pathinfo($photo_item,PATHINFO_EXTENSION);
         
        $filename_db_photo = $original_name_photo.'.'.$filename_ext_photo;

                $config['file_name'] = $original_name_photo;
                $config['upload_path'] = './assets/photos/';  
                $config['allowed_types'] = 'jpg|jpeg|png|gif';     
                $this->load->library('upload', $config);  
                $old_photos_array[] = $filename_db_photo;  
               }
               $new_photos = implode(',',$old_photos_array);
            

               $datadb = array ('photos' => $new_photos);  
               $this->db->where(['id' => $id]);
               $this->db->update('users' , $datadb);        
           }  
      }           

Αν χρησιμοποιήσω μονό input και δέν εχω foreach κλπ. ανεβαίνουν τα αρχεία κλπ. Άρα δεν τίθεται θέμα δικαιωμάτων φακέλου κλπ.

Επίσης στο μονό input πρόσθετα και τον παρακάτω κώδικα. Που αν το βάλω στον παραπάνω, πετάει σφάλμα.

  if(!$this->upload->do_upload('upload_photo'))  
              {  
                   echo "error";  
              }  
                else  
              {  
               $datadb = array ('photos' => $one_photo);  
               $this->db->where(['id' => $id]);
               $this->db->update('users' , $datadb); 
}

 

Δημοσ.

Δεν κατάλαβα τις θέλεις να κάνεις, θέλεις ο κάθε user να έχει φάκελο με εικόνες ή να τις έχεις όλες χύμα στον assets.

Επίσης νομίζω ότι θα ήταν καλύτερο να δοκιμάσεις να έχεις τις εικόνες σε έναν άλλον πίνακα [ user_id, image_id, image_name ] κάτι τέτοιο.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...