Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: gAb1 en 2 Diciembre 2014, 01:44 am



Título: comprobar variables de db
Publicado por: gAb1 en 2 Diciembre 2014, 01:44 am
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
  1. if ($stmt = $mysqli->prepare("  SELECT members.*, account_type.*, friends.*, friendsCount.*,
  2.                                       COUNT(friendsCount.friendID) AS num_f
  3.                                FROM members
  4.                                INNER JOIN account_type ON account_type.id = ?
  5.                                INNER JOIN friends ON friends.friendID = ?
  6.                                INNER JOIN friends AS friendsCount ON friendsCount.userID = ?
  7.                                WHERE members.id = ?")) {
  8.  
  9.    $stmt->bind_param('iiii', $_SESSION['acc_type'], $_GET['id'], $_SESSION['user_id'], $_GET['id']);
  10.    $stmt->execute();
  11.  
  12.    $result = $stmt->get_result();
  13.    $row = $result->fetch_array();
  14.  
  15.    $monthNames = array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
  16.    $paid = array(); //Placeholder for paid months.
  17.  
  18.    for ($i = 1; $i < 13; $i++) {
  19.  
  20.        $month = 'month' . $i;
  21.        $bonus_month = 'bonus_month' . $i;
  22.  
  23.        // check if the user received the monthly bonus
  24.        if ($row[$bonus_month] == 0) {
  25.  
  26.            // check if the friend's member account is active
  27.            if ($row['status'] == 1) {
  28.  
  29.                // check if the friend paid the month
  30.                if ($row[$month] == 1) {
  31.  
  32.                    $paid[] = 'Pagado';
  33.  
  34.                    // check the user account type
  35.                    if ($row['type'] == 'Base') {
  36.  
  37.                        // TODO: check if the friend is one of the three first (special promotion)
  38.                        // (user gets double bonus for the first three invited friends)
  39.                        if ($row['extra'] == 1) {
  40.                            $extra = $row['bonus'] + 5;
  41.                            $bonus[] = $extra . '€';
  42.                        }
  43.  
  44.                        else {
  45.                            $bonus[] = $row['bonus'] . '€';
  46.                        }
  47.                    }
  48.  
  49.                    else {
  50.                        $bonus[] = $row['bonus'] . '€';
  51.                    }
  52.  
  53.                    $cashed[] = 'No';
  54.                    //$non_cashed[] = $bonus[];
  55.                }
  56.  
  57.                else {
  58.                    $paid[] = 'No Pagado';
  59.                    $bonus[] = 'n/a';
  60.                    $cashed[] = 'n/a';
  61.                }
  62.            }
  63.  
  64.            else {
  65.                $paid[] = 'n/a';
  66.                $bonus[] = 'n/a';
  67.                $cashed[] = 'n/a';
  68.            }
  69.        }
  70.  
  71.        else {
  72.            $paid[] = 'Pagado';
  73.            $bonus[] = $row[$bonus_month] . '€';
  74.  
  75.            // TODO: find a way to check if user already received the bonus
  76.            // 12 new columns? (bonus_received_month1-12)
  77.            if (1 == 0) {
  78.                $cashed[] = 'Si';
  79.                //$total_cashed[] = $row[$bonus_month];
  80.            }
  81.  
  82.            else {
  83.                $cashed[] = 'No';
  84.                //$non_cashed[] = $row[$bonus_month];
  85.            }
  86.        }
  87.    }
  88.  
  89.    //Now make the HTML list
  90.  
  91.    foreach ($monthNames as $key => $month) {
  92.  
  93.        echo '
  94.                <div class="list">
  95.                    <ul>
  96.                        <li><a class="month">' . $month . '</a></li>
  97.                        <li><a class="status">' . $paid[$key] .'</a></li>
  98.                        <li><a class="bonus">' . $bonus[$key] . '</a></li>
  99.                        <li><a class="cashed">' . $cashed[$key] . '</a></li>
  100.                    </ul>
  101.                </div>';
  102.    }
  103. } 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
  1. // the number of friends
  2. $count = $row['num_f'];
  3. // the current friendID
  4. $f_id = $_GET['id'];
  5. $match = 'the first 3 ids (with acc status 1)';
  6.  
  7. if ($count > 2 && $f_id == $match) {
  8.    $extra = $row['bonus'] + 5;
  9.    $bonus[] = $extra . '€';
  10. } 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
  1. $non_cashed[] = $bonus[];
  2. $total_cashed[] = $row[$bonus_month];
  3. $non_cashed[] = $row[$bonus_month];
  4.  
  5. // not received
  6. echo '<p>Total acumulado: ' . array_sum($non_cashed[]) . '€</p>';
  7. // total received
  8. 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!