Foros del Web » Programando para Internet » PHP »

Sesiones?

Estas en el tema de Sesiones? en el foro de PHP en Foros del Web. Llevo varias horas buscando la manera de solucionar lo siguiente y no he encontrado ninguna solución... A ver si aquí me podéis ayudar: Antes que ...
  #1 (permalink)  
Antiguo 25/05/2014, 16:19
 
Fecha de Ingreso: mayo-2014
Mensajes: 2
Antigüedad: 9 años, 11 meses
Puntos: 0
Sesiones?

Llevo varias horas buscando la manera de solucionar lo siguiente y no he encontrado ninguna solución... A ver si aquí me podéis ayudar:

Antes que nada, deciros que no se mucho sobre PHP y menos de POO... Tengo un script en .js que lo que hace es consultar un archivo .php donde se realiza una consulta sql y posteriormente envía los resultados de la consulta... hablando en código...

Aquí tenéis el .js
notify.js

Código HTML:
function Chatter(){
	this.getMessage = function(callback, lastTime){
		var t = this;
		var latest = null;
		
		$.ajax({
			'url': 'notify.php',
			'type': 'post',
			'dataType': 'json',
			'data': {
				'mode': 'get',
				'lastTime': lastTime
			},
			'timeout': 30000,
			'cache': false,
			'success': function(result){
				if(result.result){
					callback(result.message);
					latest = result.latest;
				}	
			},
			'error': function(e){
				console.log(e);
			},
			'complete': function(){
				t.getMessage(callback, latest);
			}
		});
	};
};

var c = new Chatter();

$(document).ready(function(){
	$('#notification').submit(function(e){
		e.preventDefault();
		
		var user = $('#postUsername');
		var sponsor = $('#postSponsor');
		var err = $('#postError');
		
		c.postMessage(user.val(), sponsor.val(), function(result){
			if(result){
				sponsor.val('');
			}
			err.html(result.output);
		});
	
		return false;
	});
	
	c.getMessage(function(message){
		var chat = $('#notification').empty();
		
		for(var i = 0; i < message.length; i++){
			chat.append(
				'<a href="#" title="'+i+'"><i class="fa fa-user"></i><b>' + message[i].user + '</b> es tu nuevo referido directo.</a>'
			);
			var n = i;
		}

		var number = $('#number').empty();

		if( n == 0){
			number.append(
				'1'
			);
		}
		if( n == 1){
			number.append(
				'2'
			);
		}
		
	});
});
Podéis ver la consulta a notify.php mediante ajax (jquery 1.10.2)... al final envía los resultados al div con id "#notification"

Ahora os muestro el código php
notify.php

Código PHP:
<?php 
    
class Chatter{
        
//change this according to your database setup
        
protected $server 'localhost';
        protected 
$username '';
        protected 
$password '';
        protected 
$database '';
        
//leave this as our database connection later
        
protected $connection null;
        protected 
$session $_SESSION['username'];
    
        public function 
__construct(){
            
$this->connection = @mysql_connect($this->server$this->username$this->password);
            if(
$this->connection){
                if(!
mysql_select_db($this->database)) die('database not found');
            }
            else die(
'database connection failed. Check your setup');
            
            
$mode $this->fetch('mode');
            
            switch(
$mode){
                case 
'get':
                    
$this->getMessage($this->sess);
                    break;
            }
            
            return;
        }
                
         function 
getMessage($session){
            
$endtime time() + 20;
            
$lasttime $this->fetch('lastTime');
            
$curtime null;
                    
            while(
time() <= $endtime){
                
$rs mysql_query("
                    SELECT *
                    FROM long_polling
                    WHERE sponsor LIKE '"
.$session."'
                    ORDER BY insertDate desc
                    LIMIT 2
                "
);
                
                if(
$rs){
                    
$messages = array();
                    
                    while(
$row mysql_fetch_array($rs)){
                        
$messages[] = array(
                            
'user' => $row['username'],
                            
'sponsor' => $row['sponsor'],
                            
'time' => $row['insertDate']
                        );
                    }
                    
                    
$curtime strtotime($messages[0]['time']);
                }
                
                if(!empty(
$messages) && $curtime != $lasttime){
                    
$this->output(true''array_reverse($messages), $curtime);
                    break;
                }
                else{
                    
sleep(1);
                }
            }
        }
        
        
        
        protected function 
fetch($name){
            
$val = isset($_POST[$name]) ? $_POST[$name] : '';
            return 
mysql_real_escape_string($val$this->connection);
        }
        
        protected function 
output($result$output$message null$latest null){
            echo 
json_encode(array(
                
'result' => $result,
                
'message' => $message,
                
'output' => $output,
                
'latest' => $latest
            
));
        }
    }
    
    new 
Chatter();
Por último en index.php, donde hay una sesión iniciada, llamo a los js necesarios y creo el div con id notification

index.php
Código HTML:
<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="notifyScript.js"></script>
	<div class="header-alert">
		<ul>
			<li>
				<a title="" class="notification-btn">
					<i class="fa fa-bell"></i>
					<span id="number"></span>
				</a>

				<div class="notification" id="notification">
					<p>SIN NOTIFICACIONES</p>
				</div>
			</li>
		</ul>
	</div> 

No hay manera de utilizar protected $session = $_SESSION['username']; ... en cambio, si pongo esto: protected $session = 'usuario'; si que me recoje los datos. Y aquí es donde está todo el problema.

El problema que tengo es que, en la página sobre la que quiero implementar ésto (index.php) hay iniciada una sesión, y quiero recuperar de alguna forma el nombre de usuario de ésa sesión y realizar la consulta sql (noyify.php) utilizando el nombre de usuario y no encuentro ninguna manera de hacerlo... He probado y probado y nada... he buscado y tampoco... he leído algo sobre serialize y unserialize pero no se si ayudaría en éste caso ni tampoco sé implementarlo ... cabe decir que los scripts no los he escrito yo... los he sacado de internet y he cambiado lo que he sabido cambiar... ¿A alguien se le ocurre como puedo solucionar éste problema?
  #2 (permalink)  
Antiguo 25/05/2014, 17:15
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Sesiones?

Cita:
Iniciado por gapaceon Ver Mensaje

No hay manera de utilizar protected $session = $_SESSION['username']; ... en cambio, si pongo esto: protected $session = 'usuario'; si que me recoje los datos. Y aquí es donde está todo el problema.

El problema que tengo es que, en la página sobre la que quiero implementar ésto (index.php) hay iniciada una sesión, y quiero recuperar de alguna forma el nombre de usuario de ésa sesión y realizar la consulta sql (noyify.php) utilizando el nombre de usuario y no encuentro ninguna manera de hacerlo...
Lo que haces con protected $session; es declarar la variable como "protected" (privada pero accesible desde sus hijos)


Código PHP:
protected $session// la declaras 
Código PHP:
protected $session 'algo';  // la declaras e inicializas 
Yo la inicializaria en NULL y la llamaria $userName

Código PHP:
protected $userName NULL
Luego nada te impide usar un setter y asignarle un valor $_SESSION['username'];

Lee sobre setters y getters, harias entonces:

Código PHP:
$tu_objeto->setUserName($_SESSION['username']); 
y aqui el metodo que te falta:

Código PHP:
Ver original
  1. protected function setUserName($username)
  2. {
  3.     $this->userName=$username;
  4.     return $this;
  5. }

PREGUNTA: vas a crear una clase que hereda de Chatter ? porque sino no serian protected sino privated

El que devuelva $this tiene que ver con el tema "metodos encadenados"
__________________
Salu2!
  #3 (permalink)  
Antiguo 26/05/2014, 13:22
 
Fecha de Ingreso: mayo-2014
Mensajes: 2
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Sesiones?

Gracias por la ayuda, pero haciendo lo que me decías no funciona... creo que es por que en al archivo notify.php le llama notify.js... no hay ningun include en index.php que llame a notify.php y por lo tanto no es posible recuperar el contenido de una sesión que no existe.

Al final, revisando y contrastando los códigos lo que he hecho a sido...

En index.php, en vez de poner:

Código HTML:
<script type="text/javascript" src="jquery-1.10.2.min.js"></script>
<script type="text/javascript" src="notify.js"></script> 

He sacado todo el código de notify.js y lo he puesto en index.php quedando así...
Fíjate en 'User': '<?php echo $_SESSION["username"]; ?>',

Código:
<script type="text/javascript">
	function Chatter(){
		this.getMessage = function(callback, lastTime){
			var t = this;
			var latest = null;
				
			$.ajax({
				'url': 'assets/notify/notify.inc.php',
				'type': 'post',
				'dataType': 'json',
					'data': {
					'User': '<?php echo $_SESSION["username"]; ?>',
					'mode': 'get',
					'lastTime': lastTime
				},

				.
				.
				.
				.
				.

Después en notify.php he agragado $user = $this->fetch('User');

Código PHP:
function getMessage(){
        
$endtime time() + 20;
        
$lasttime $this->fetch('lastTime');
        
$user $this->fetch('User');
        
$curtime null;

        while(
time() <= $endtime){
            
$rs mysql_query("
                SELECT *
                FROM long_polling
                WHERE sponsor LIKE '"
.$user."'
                ORDER BY insertDate desc
                LIMIT 2
            "
); 
Así todo funciona como quería.

uchas gracias por las molestias.
  #4 (permalink)  
Antiguo 26/05/2014, 13:26
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Sesiones?

Mientras que no cojas variables de session directamente dentro de una clase que no tiene nada que ver... no estara mal, por eso setters / getters en caso de ser necesarios
__________________
Salu2!

Etiquetas: html, mysql, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:23.