Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - gAb1

#451
A mí actualmente me esta pasando esto y es muy extraño. Recién inicio sesión, le doy a cualquier link del menu de usuario (perfil por ejemplo) y me sale el mensaje diciendo que necesito estar logueado. La sesión se pierde misteriosamente. Pero si vuelvo a iniciar sesión y le doy al mismo link, ya no se pierde...

Solo tengo el session_start en index.php, pero porque nunca cambio de pagina, en mi caso se incluyen las paginas de contenido en index.php. Debería ser lo mismo...
#452
PHP / Re: imprimir lista con datos de db
7 Octubre 2014, 21:12 PM
Vale, eso tiene mucho más sentido :)

Solo una cosa, la idea es sacar la informacion del amigo que el usuario haga click, no de todos a la vez. Al principio del archivo .php tengo un script para imprimir la lista de amigos del usuario:

Código (php) [Seleccionar]
if(empty($_GET)) {
   // imprimir lista de amigos
}


Ahí si que hago:
Código (sql) [Seleccionar]
SELECT members.*, friends.*
FROM friends
INNER JOIN members ON members.id = friends.friendID
WHERE friends.userID = ? /* mi id $_SESSION */


Y con eso hago una lista con todos los amigos, y en el nombre imprimido añado un url que envia a la misma página pero con el id del amigo:

Código (php) [Seleccionar]
echo '
<div class="list">
<ul>
<li><a class="name" href="friend?id=' . $row['id'] . '">'.$row['name'].'</a></li>
<li><a class="subscription">' . $status . '</a></li>
<li><a class="totalbonus">' . $row['total'] . '€</a></li>
</ul>
</div>
';


Entonces ahora estoy atascado en el if que obtiene $_GET['id'] y muestra otra tabla con la información del amigo, y ese es el código que pegué en el primer mensaje, en la misma pagina.php se muestra la lista de amigos y en el nombre hay un link que muestra la información de ese usuario.

No estoy seguro pero voy a probar con
Código (sql) [Seleccionar]
SELECT members.*, account_type.*, friends.*, membersF.*
FROM members
INNER JOIN account_type ON `members`.`acc_type` = `account_type`.`type`
INNER JOIN friends ON friends.userID = members.id
INNER JOIN members AS membersF ON membersF.id = friends.friendID
WHERE `members`.`acc_type` = $_SESSION['acc_type']
AND friends.userID = $_SESSION['user_id']
AND membersF.id = $_GET['id']


1º Devolverá el tipo de cuenta para el usuario conectado y así poder obtener el bonus del usuario conectado solo.
2º Aquí ¿devolverá las columnas total y cashed_month1 a 12? para saber si ya ha recibido el bonus de cada mes o no.
3º Aquí devolverá la información relevante para el amigo.

Más o menos me voy enterando de como funciona.

Lo que no me queda claro es WHERE <-- aquí que tengo que poner? la tabla.columna antes del = o de despues?

Gracias!

Edito: Funciona perfecto! Muchas gracias ^^
#453
PHP / Re: imprimir lista con datos de db
7 Octubre 2014, 19:48 PM
Aquí he pegado la estructura: http://pastebin.com/sX8BAECm

Gracias!
#454
PHP / Re: imprimir lista con datos de db
7 Octubre 2014, 19:11 PM
La idea era hacer un sistema RBAC, pero en realidad solo necesito 1 columna para un permiso entonces lo hice asi: account_type -> type y bonus. Cada cuenta puede ser de un tipo u otro, por lo que en la tabla miembros tengo una columna llamada acc_type que coincide con el valor de account_type.type, entonces la cuenta tiene los privilegios de ese tipo.

Y las columnas month1 a 12, 1 quiere decir si ha pagado ese mes y 0 que no lo ha pagado. Tambien cada cuenta tiene un status, 1 activa y 0 no activa.

La tabla friends tiene el id de la cuenta que es amiga de otra cuenta (friendID es amigo de UserID) las otras columnas, total: el total acumulado para userID y cashed_month1 a 12, 1: ha recibido el bonus para ese mes y 0: no no lo ha recibido, tambien para userID

Nunca he hecho eso de DESCRIBE, no se que es.

Lo que no entiendo es porque
Código (sql) [Seleccionar]

INNER JOIN account_type ON account_type.type = members.acc_type WHERE members.acc_type = $_SESSION['acc_type']

no funciona si $_GET['id'] (friendID) no tiene el mismo tipo de cuenta....

¿Ves alguna relación entre members.acc_type (de la cuenta logueada) con members.acc_type (friendID)?

Es muy extraño la verdad, debe ser esa consulta que esta mal hecha, pero no veo cual es el fallo...

Si no coinciden ambas devuelve NULL  :huh:

Así es como lo tengo ahora:

Código (php) [Seleccionar]
if ($stmt = $mysqli->prepare("SELECT friends.*, members.*, account_type.* FROM members INNER JOIN friends ON friends.friendID = members.id
                                                                              INNER JOIN account_type ON account_type.type = members.acc_type
      WHERE friends.friendID = ? AND members.acc_type = ?")) {
$stmt->bind_param('is', $_GET['id'], $_SESSION['acc_type']);


¿Tal vez si uso LEFT o RIGHT devolverá todo lo demás menos el match entre los dos ids?
#455
PHP / Re: imprimir lista con datos de db
7 Octubre 2014, 18:09 PM
Actualmente estoy usando INNER JOIN. Entonces para MySQL debo usar CROSS JOIN?

Aunque ahora que lo pienso bien creo que necesito condiciones para las columnas y de que ID debo coger cada columna:

1º from members.status (y otras columnas como name, month1-12 and photo) where members.id = $_GET['id']
2º from account_type.type necesito que compare con members.acc_type pero especificando where members.id = $_SESSION['user_id'] y solo de esa id.
3º from friends.cashed_month1-12 (y la columna total que debería incluirse sin problemas) where friends.friendID = $_GET['id']

Necesito una consulta que haga todo eso, pero mi conocimiento en sql es bastante limitado. He estado intentandolo con:

Código (php) [Seleccionar]
SELECT friends.*, members.*, account_type.* FROM members INNER JOIN friends ON friends.friendID = members.id
                                                             INNER JOIN account_type ON account_type.type = members.acc_type
                                                             WHERE friends.friendID = ? AND members.acc_type = ?")) {
$stmt->bind_param('is', $_GET['id'], $_SESSION['acc_type'];


Y obviamente no funciona... :(

Edito: se me olvido cambiar el bind_param de otra prueba. Y el problema no era hacer un JOIN para la tercera tabla. Asi que debo hacer un JOIN, pero el problema esque mi consulta esta mal.
#456
PHP / [resuelto] imprimir lista con datos de db
7 Octubre 2014, 02:52 AM
Hola buenas! Estoy haciendo una lista que imprima informacion de varias tablas de una base de datos mysql. Estas son las tablas:

- account_type: tiene dos columnas: type (varchar, usada en la consulta) y bonus (int, imprimida en la lista).
- friends: de aqui necesito las columnas total y cashed_month1-12 (todas int)
- members: varias columnas: id y acc_type (usadas en la consulta), las demás columnas tambien son seleccionadas y se deberían de imprimir normal.

Lo que el siguiente script debería hacer sería lo siguiente:

Seleccionar de estas 3 tablas: friends.*, members.*, y account_type.* pero con la unica condición de INNER JOIN account_type ON account_type.type = members.acc_type

Código (php) [Seleccionar]
if(isset($_GET['id'], $_SESSION['user_id'])) {

/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT COUNT(*) rowCount FROM friends WHERE friendID = ? AND userID = ?")) {
$stmt->bind_param('ii', $_GET['id'], $_SESSION['user_id']);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($rowCount);

/* fetch values */
if($stmt->fetch()) {
if ($rowCount > 0) {

$stmt->close();

if ($stmt = $mysqli->prepare("SELECT members.*, account_type.* FROM members INNER JOIN account_type ON account_type.type = members.acc_type
                                                                                               WHERE members.acc_type = ?")) {
$stmt->bind_param('s', $_SESSION['acc_type']);
$stmt->execute();

$result = $stmt->get_result();
$row = $result->fetch_array();


if ($row['status'] == 1) {
$status = 'Activa';
} elseif ($row['status'] == 0) {
$status = 'No Activa';
}

echo '<p>La cuenta esta ' . $status . ';

$monthNames = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
$paid = array(); //Placeholder for paid months.

for ($i = 1; $i < 13; $i++) {
$month = 'month' . $i;
$cashed_month = 'cashed_month' . $i;
if($row[$month] == 1) {
$paid[] = 'Pagado';
$bonus[] = $row['bonus'] . '€';
} else {
$paid[] = 'No Pagado';
$bonus[] = 'n/a';
}
if ($row[$cashed_month] == 1) {
$cashed[] = 'Si';
} elseif ($row[$month] == 1) {
$cashed[] = 'No';
} else {
$cashed[] = 'n/a';
}
}

//Now make the HTML list

foreach($monthNames as $key => $month) {
echo '
<div class="list">
<ul>
<li><a class="month">' . $month . '</a></li>
<li><a class="status">' . $paid[$key] .'</a></li>
<li><a class="bonus">' . $bonus[$key] . '</a></li>
<li><a class="cashed">' . $cashed[$key] . '</a></li>
</ul>
</div>';
}

echo '<div class="clear"></div>';

echo '<p>Total recibido para ' . date('Y') . ': ' . $row['total'] . '€</p>';

echo '<a href="/friend">Volver</a>';

} else echo $mysqli->error;

} else{
echo $_SESSION['username'], ', no estás autorizado para ver la información de este socio ya que no es tu amigo...';
}
}
/* close statement */
$stmt->close();
} else echo $mysqli->error;
/* close connection */
$mysqli->close();
}


Pero no encuentro la manera de agregar esta tercera tabla sin necesidad de condicion, ya que si hago otro inner join con la tercera tabla, no funciona como es debido:

Por ejemplo, necesito trabajar con $row['bonus'] (tabla account_type) pero que sea el del usuario actual, no del otro (friendID). Si ambas cuentas (friendID y userID) tienen el mismo tipo de cuenta (acc_type) todo funciona, pero no todos las cuentas son iguales, entonces si cambio el acc_type del usuario logueado no funciona nada, es como si solamente se muestra información si ambas cuentas tienen el mismo tipo, y eso no debería ser así. Por eso no puedo juntar esta tercera tabla.

¿Es posible selecionar una tabla más sin ninguna condicion? Simplemente cogiendo toda la informacion sin más y en la misma sentencia preparada.

Gracias!
#457
Hola, tengo una pagina que muestra informacion de un usuario. Necesito protegerla para que no se pueda acceder a ella si no se cumplen dos requisitos, 1º estar logueado y 2º ser "amigo" de ese usuario.

Utilizo $_GET para saber la informacion que coger de la base de datos.

Hago un if para saber si esta definida la variable get y si el usuario está conectado, por ultimo compruebo si son amigos.

Código (php) [Seleccionar]
<?php

if(isset($_GET['id'], $_SESSION['user_id'])){
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n"mysqli_connect_error());
exit();
}

$id $_GET['id'];
$connectedUserID $_SESSION['user_id'];

/* prepare statement */
if ($stmt $mysqli->prepare("SELECT COUNT(*) rowCount FROM friends WHERE friendID = ? AND userID = ?")) {
$stmt->bind_param('ii'$id$connectedUserID);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($rowCount);

/* fetch values */
if($stmt->fetch()) {
if ($rowCount 0) {
// zona segura
echo 'It works!';
} else{
echo $_SESSION['username'], ', no estás autorizado para ver la información de este socio ya que no es tu amigo...';
}
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
} else {
echo 'No estás autorizado para acceder a esta página';

if (login_check($mysqli) == false) {
echo '. Por favor, <a href="login">inicia sesión</a>.';
} else{
echo ' '.$_SESSION['username'];
}
}
?>


Me gustaría saber si es igual de seguro comprobar isset($_SESSION['user_id']) o hacer un login_check == true.

Gracias!
#458
Si, lo de sec_session_start(); ya esta arreglado, lo he puesto solo en index.php despues del require_once y han dejado de salir esos errores.

Vale, si quito la función, lo que pasa es que se ejecuta el return $content; y lo muestra al final del archivo y no donde deberia ir, entonces necesito alguna manera de que se incluya donde antes, en el div y realmente no se como hacer eso :(

Pero si, ya no hay ningún error :)

Se me olvido quitar del logout.php y del process_login el session start y he tenido algunos problemas, ya estan solucionados.

Pero en el process_login.php si quito el include_once functions me da error funcion login() no definida.

login.php lo llama en el form action="includes/process_login.php" entonces tiene que requerirlo, le he dejado require normal, ya que process_login no se incluye en ningún sitio.

Pero ese no es el problema, process_login necesita sec_session_start(); o no "inicia sesion"...

Código (php) [Seleccionar]
<?php

require('functions.php');

sec_session_start();       // sin esto no inicia sesión y no veo ningún error

if (isset($_POST['email'], $_POST['p'])) {
    
$email $_POST['email'];
    
$password $_POST['p']; // The hashed password.

    
if (login($email$password$mysqli) == true) {
        
// Login success
header('Location: /home');
    } else {
        
// Login failed
        
header('Location: /login?error=1');
    }
} else {
    
// The correct POST variables were not sent to this page.
    
echo 'Invalid Request';
}
?>


Entonces al cerrar sesión salen estos errores:

Código (php) [Seleccionar]
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\themes\sportislife\views\layouts\main.php:74) in C:\xampp\htdocs\views\site\logout.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\themes\sportislife\views\layouts\main.php:74) in C:\xampp\htdocs\views\site\logout.php on line 19


Dejo tambien el logout.php:
Código (php) [Seleccionar]
<?php

// Unset all session values 
$_SESSION = array();

// get session parameters 
$params session_get_cookie_params();

// Delete the actual cookie. 
setcookie(session_name(),
''time() - 42000
$params["path"], 
$params["domain"], 
$params["secure"], 
$params["httponly"]);

// Destroy session 
session_destroy();
header('Location: /home');
?>


¿Como puedo solucionar este problema?  :huh:

Gracias!
#459
¿Te refieres a que lo haga sin función? Y que en main.php haga un echo a $content???

Si, llamo a sec_session_start(); en todas las paginas, ese puede ser el problema? Entonces tambien lo tengo que llamar en index.php no??
#460
Era la cache del navegador, pasándole el ccleaner se arregla. Pero siguen habiendo errores:

A partir de aquí solo hay un require_once('includes/functions.php'); al principio de index.php y en ningún archivo más.

Recien pasado el ccleaner, sin iniciar sesión:
Código (php) [Seleccionar]
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\themes\default\views\layouts\main.php:76) in C:\xampp\htdocs\includes\functions.php on line 28

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\themes\default\views\layouts\main.php:76) in C:\xampp\htdocs\includes\functions.php on line 28

Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29

Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 5


Y se muestra el formulario y todo el codigo html.

Esto cuando inicias sesión, y no se muestra el resto del codigo html.
Código (php) [Seleccionar]
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\themes\default\views\layouts\main.php:76) in C:\xampp\htdocs\includes\functions.php on line 28

Warning: session_regenerate_id(): Cannot regenerate session id - headers already sent in C:\xampp\htdocs\includes\functions.php on line 29

Notice: Undefined variable: mysqli in C:\xampp\htdocs\views\site\login.php on line 5

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\includes\functions.php on line 155


La linea 76 de main.php es la etiqueta php que abro para llamar la funcion showContent()