comprobar variables de db

Iniciado por gAb1, 2 Diciembre 2014, 01:44 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Hola, siento que el titulo no sea muy intuitivo pero no encuentro manera de nombrar el problema que tengo.

Estoy reescribiendo un código que imprime una lista con datos de una tabla, pero con ciertas condiciones:

Código (php) [Seleccionar]
if ($stmt = $mysqli->prepare("  SELECT members.*, account_type.*, friends.*, friendsCount.*,
                                       COUNT(friendsCount.friendID) AS num_f
                                FROM members
                                INNER JOIN account_type ON account_type.id = ?
                                INNER JOIN friends ON friends.friendID = ?
                                INNER JOIN friends AS friendsCount ON friendsCount.userID = ?
                                WHERE members.id = ?")) {

    $stmt->bind_param('iiii', $_SESSION['acc_type'], $_GET['id'], $_SESSION['user_id'], $_GET['id']);
    $stmt->execute();

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

    $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;
        $bonus_month = 'bonus_month' . $i;

        // check if the user received the monthly bonus
        if ($row[$bonus_month] == 0) {

            // check if the friend's member account is active
            if ($row['status'] == 1) {

                // check if the friend paid the month
                if ($row[$month] == 1) {

                    $paid[] = 'Pagado';

                    // check the user account type
                    if ($row['type'] == 'Base') {

                        // TODO: check if the friend is one of the three first (special promotion)
                        // (user gets double bonus for the first three invited friends)
                        if ($row['extra'] == 1) {
                            $extra = $row['bonus'] + 5;
                            $bonus[] = $extra . '€';
                        }

                        else {
                            $bonus[] = $row['bonus'] . '€';
                        }
                    }

                    else {
                        $bonus[] = $row['bonus'] . '€';
                    }

                    $cashed[] = 'No';
                    //$non_cashed[] = $bonus[];
                }

                else {
                    $paid[] = 'No Pagado';
                    $bonus[] = 'n/a';
                    $cashed[] = 'n/a';
                }
            }

            else {
                $paid[] = 'n/a';
                $bonus[] = 'n/a';
                $cashed[] = 'n/a';
            }
        }

        else {
            $paid[] = 'Pagado';
            $bonus[] = $row[$bonus_month] . '€';

            // TODO: find a way to check if user already received the bonus
            // 12 new columns? (bonus_received_month1-12)
            if (1 == 0) {
                $cashed[] = 'Si';
                //$total_cashed[] = $row[$bonus_month];
            }

            else {
                $cashed[] = 'No';
                //$non_cashed[] = $row[$bonus_month];
            }
        }
    }

    //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>';
    }
} else echo $mysqli->error;


Basicamente son esos 2 "TODOs". Las relaciones de las tablas son muy sencillas:

1º members: contiene informacion de todos los usuarios y en este caso obtiene los datos del amigo ($_GET['id']) del usuario. Las columnas utilizadas son -> "id", "status" (0 or 1; inactive/active), "name" and "month1-12" (12 columns: 0 or 1; not paid / paid month).

2º account_type: contiene los diferentes tipos de cuenta (actualmente solo sirve para asignar bonificaciones segun el tipo). Las columnas utilizadas son -> "id" (members.acc_type), "type" (the type name) and "bonus" (5, 10, 15 etc...).

3º friends: contiene información acerca del usuario y las bonificaciones referentes a un amigo. Las columnas utilizadas son -> "friendID" (members.id, el usuario/amigo invitado), "userID" (members.id, el usuario que ha invitado a un amigo), "extra" (1 para los 3 primeros usuarios invitados y 0 para el resto; 1 es bonus doble, 0 es bonus normal. columna temporal), "bonus_month1-12" (12 columns; 0 is para este o un futuro mes, 1+ es el bonus que el usuario ha ganado este mes(el de la tabla: 1-12), referente al amigo)

Primero me gustaría poder reemplazar la columna friends.extra que indica si el usuario obtiene doble bonus o no, algo así como:

Código (php) [Seleccionar]
// the number of friends
$count = $row['num_f'];
// the current friendID
$f_id = $_GET['id'];
$match = 'the first 3 ids (with acc status 1)';

if ($count > 2 && $f_id == $match) {
    $extra = $row['bonus'] + 5;
    $bonus[] = $extra . '€';
} else $bonus[] = $row['bonus'] . '€';


La idea es que los usuarios con tipo de cuenta "Base" obtengan doble beneficio por los tres primeros amigos invitados, teniendo en cuenta que una de las tres primeras cuentas este desactivada (status 0) entonces la siguiente deberia incluirse, un ejemplo:

Si la cuenta número 1 no esta activa pero la 2 y la 3 si, entonces la 4 debería incluirse en $match.

Pero no se como hacer esto, aunque tengo una ligera idea, ¿sería como crear un array con las ids que solo tengan status 1?

Lo otro debería ser más sencillo: una manera de comprobar si el usuario ya recibió la bonificación. Creo que lo mejor es hacer lo mismo que para saber si la mensualidad ha sido pagada, month1-12 usando 0 y 1, en este caso algo como bonus_received_month1-12. Y contar lo que tiene pendiente por recibir y el total recibido:

Código (php) [Seleccionar]
$non_cashed[] = $bonus[];
$total_cashed[] = $row[$bonus_month];
$non_cashed[] = $row[$bonus_month];

// not received
echo '<p>Total acumulado: ' . array_sum($non_cashed[]) . '€</p>';
// total received
echo '<p>Total recibido: ' . array_sum($total_cashed[]) . '€</p>';


Creo que lo que falla aqui son las variables / arrays que no esta bien puestos...

Sinceramente, lo que mas agradecería serían los consejos, si hay fallos en el código y la manera de estructurar la DB (me han dicho que no se deben usar números en los nombres de las columnas por algo llamado normalización).

Gracias!