PHP - ¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

 
Vista:
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 09/06/2018 17:46:18
Quiero hacer un código que genere cuotas automáticas para los socios de mi base de datos para el mes y el año actual.

Primero tengo un select que identifica que socios no tienen creada la cuota para el mes y el año actual, y para esos ejecuto un insert que crea las cuotas.

El problema es que solo inserta la cuota para el ultimo socio de todos los que devuelve el select del principio, que son los que no tienen las cuotas creadas, valga la redundancia.

He probado con un foreach y no me funciona y no se si es que no lo estoy haciendo bien.

EL código aqui:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
 
	// Función que crea las cuotas automáticamente.
	function cuotaAuto() {
 
		require_once 'conexion.php';
 
		$seleccionar = "SELECT Id FROM socios WHERE Id NOT IN(SELECT Id_Socio FROM cuotas WHERE Mes = ? AND Anno = ?)";
 
		if ($seleccionar_stmt = mysqli_prepare($conexion, $seleccionar)) {
 
			// Ligar parámetros para marcadores.
			mysqli_stmt_bind_param($seleccionar_stmt, "ii", $mes, $anno);
 
			//Establecer la información local en castellano de España
			$inf_local = setlocale(LC_ALL,"es_ES");
 
			//Variables que guardan el mes (numérico) y el año atual.
			$mes = strftime("%B");
			$anno = date("Y");
 
			// Ejecutar la consulta preparada.
			mysqli_stmt_execute($seleccionar_stmt);
 
			 // Vincular las variables de resultados.
			$res = mysqli_stmt_bind_result($seleccionar_stmt, $Id);
 
			// Obtener los valores.
		    while (mysqli_stmt_fetch($seleccionar_stmt)) {
 
		    	echo $Id . "<br/>";
 
		    }
 
		    $numf = mysqli_stmt_num_rows($seleccionar_stmt);
 
		    if ($numf == 0) {
 
		    	echo "0 filas";
 
		    } else {
 
		    	echo "<p><b>Filas: </b>" . $numf . "</p>";
 
		    	echo "<p>Se insertará la cuota del mes actual para todos los socios que no la tengan creada</p>";
 
		    	$array = array();
 
		    	foreach ($array as $Id) {
 
		    		$insertar = "INSERT INTO cuotas VALUES(?, ?, ?, ?, ?, ?)";
 
			    	if ($insertar_stmt = mysqli_prepare($conexion, $insertar)) {
 
 
			    		// Ligar parámetros para marcadores.
			    		mysqli_stmt_bind_param($insertar_stmt, "iisidi", $id_cuota, $id_socio, $mes, $anno, $importe, $pagado);
 
			    		$id_cuota = NULL;
 
			    		$id_socio = $Id;
 
			    		//El importe actual es un valor temporal. El valor real debe ser el valor predeterminado de la tabla opciones.
			    		$importe = 12.50;
 
			    		$pagado = 0;
 
			    		//Ejecutamos la consulta preparada.
			    		mysqli_stmt_execute($insertar_stmt);
 
			    	}
 
			    	// Cerrar la sentencia preparada.
			    	mysqli_stmt_close($insertar_stmt);
 
		    	}
 
		    }
 
		    // Cerrar la sentencia preparada.
		    mysqli_stmt_close($seleccionar_stmt);
 
		}
 
		mysqli_close($conexion);
 
	}
 
	cuotaAuto();
 
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por gonzalo (615 intervenciones) el 09/06/2018 19:39:08
te recomiendo cambiar a PDO, en algun post deje una clase que te ayuda a controlar el acceso a la base de datos.

creo que el problema esta en esta orden a partir de la linea 29

1
2
3
while (mysqli_stmt_fetch($seleccionar_stmt)) {
    echo $Id . "<br/>";
}

aqui lees todo el resultset y te deja en el ultimo registro que es el que procesas al final del codigo.

salu2

(si te interesa la clase avisame)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 09/06/2018 19:45:50
En primer lugar , le agradezco la recomendacion de cambiar a PDO, pero es un proyecto que tengo que terminar lo antes posible, y en un principio no tendria pensado cambiar y utilizar PDO, pero igualmente se lo agradezco y a partir del proximo proyecto seguro lo usaré.

El while que usted menciona que puede ser el error, ¿porque seria exactamente? Si lo que falla es el insert que solo ejecuta una fila, si puedes detallar un poco mas donde tu ves el error o aportarme una solución de la misma, se lo agradecería.

Si usted lo ve necesario le puedo adjuntar pantallazos de los resultados.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por gonzalo (615 intervenciones) el 09/06/2018 21:04:46
ok, vamos a suponer que el query retorna 10 registros.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
require_once 'conexion.php';
 
$seleccionar = "SELECT Id FROM socios WHERE Id NOT IN(SELECT Id_Socio FROM cuotas WHERE Mes = ? AND Anno = ?)";
 
if ($seleccionar_stmt = mysqli_prepare($conexion, $seleccionar)) {
 
    // Ligar parámetros para marcadores.
 
    mysqli_stmt_bind_param($seleccionar_stmt, "ii", $mes, $anno);
 
    //Establecer la información local en castellano de España
 
    $inf_local = setlocale(LC_ALL,"es_ES");
 
    //Variables que guardan el mes (numérico) y el año atual.
 
    $mes = strftime("%B");
 
    $anno = date("Y");
 
    // Ejecutar la consulta preparada.
 
    mysqli_stmt_execute($seleccionar_stmt);
 
     // Vincular las variables de resultados.
 
    $res = mysqli_stmt_bind_result($seleccionar_stmt, $Id);
 
    // Obtener los valores.
 
<-- hasta aqui todo esta bien, los 10 registros estan en el resulset
 
    while (mysqli_stmt_fetch($seleccionar_stmt)) { // aqui lees todos los registros y dejas el puntero en el registro 10 (que para este caso es el ultimo del resultset).
        echo $Id . "<br/>";
    }

de aqui en adelante tienes un solo registro en el resultset, verifica el query y fijate cual es el ultimo registro y luego revisa el registro que se inserto a ver si coincide con el ultimo registro del query.

de este punto en adelante no entiendo tu logica, ya que defines un array ... pero el array no tiene elementos, asi que el foreach no da ningun ciclo ya que esta vacío.

$array= array();

foreach ($array as $Id) { // no hay elementos en el array, no va a correr (en mi opinion).

el array no tiene elementos, para que tenga elementos hay que definirlos, siguiendo tu ejemplo $array=array('0','1','2'); aqui defini 3 elementos, el foreach va a ejecutar 3 ciclos.

creo que debes revisar la logina de tu codigo a partir del while que te indique ya que en la logica del codigo no queda claro como vas a trabajar con los registros del resultset.

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 10/06/2018 13:29:39
Gracias por aclararme lo del foreach.

La idea es que el select del principio va a devolver los Id de los socios que no tengan cuota creada del mes y año actual.

Siguiendo tu ejemplo, suponiendo que los tres primeros tienen cuota del mes actual Junio y año 2018,la consulta select va a devolver los Id desde el 4 al 10, para esos Id que ha devuelto, a continuación, se debería de crear las cuotas con una consulta insert.

Espero que así haya quedado mas claro la lógica del código.

y a ver si tu sabrías como hacer esa parte del código, que llevo varios dias intentando hacer.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por gonzalo (615 intervenciones) el 11/06/2018 00:35:02
ok, bueno, ese while no hace mas que mostrar el id, no lo guarda en el array.

desde mi punto de vista no hay necesidad de usar un foreach para recorrer un array, puedes usar el while para recorrer el resultet y generar los registros, revisa este codigo, es el mismo que nos pasaste pero esta modificado.

no revise la codificacion solo reacomode el procedimiento como lo tenias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
 
// Función que crea las cuotas automáticamente.
function cuotaAuto()
{
    require_once 'conexion.php';
    $seleccionar = "SELECT Id FROM socios WHERE Id NOT IN(SELECT Id_Socio FROM cuotas WHERE Mes = ? AND Anno = ?)";
    if ($seleccionar_stmt = mysqli_prepare($conexion, $seleccionar))
    {
        // Ligar parámetros para marcadores.
        mysqli_stmt_bind_param($seleccionar_stmt, "ii", $mes, $anno);
        //Establecer la información local en castellano de España
    $inf_local = setlocale(LC_ALL,"es_ES");
        //Variables que guardan el mes (numérico) y el año atual.
        $mes = strftime("%B");
        $anno = date("Y");
        // Ejecutar la consulta preparada.
        mysqli_stmt_execute($seleccionar_stmt);
         // Vincular las variables de resultados.
        $res = mysqli_stmt_bind_result($seleccionar_stmt, $Id);
        // Obtener los valores.
    while (mysqli_stmt_fetch($seleccionar_stmt))
    {
        $insertar = "INSERT INTO cuotas VALUES(?, ?, ?, ?, ?, ?)";
 
        if ($insertar_stmt = mysqli_prepare($conexion, $insertar))
        {
            // Ligar parámetros para marcadores.
            mysqli_stmt_bind_param($insertar_stmt, "iisidi", $id_cuota, $id_socio, $mes, $anno, $importe, $pagado);
            $id_cuota = NULL;
            $id_socio = $Id;
            //El importe actual es un valor temporal. El valor real debe ser el valor predeterminado de la tabla opciones.
            $importe = 12.50;
            $pagado = 0;
            //Ejecutamos la consulta preparada.
            mysqli_stmt_execute($insertar_stmt);
            //pasa al siguiente registro.
        }
        // Cerrar la sentencia preparada.
        mysqli_stmt_close($insertar_stmt);
    }
    }
    // Cerrar la sentencia preparada.
    mysqli_stmt_close($seleccionar_stmt);
    mysqli_close($conexion);
}
 
cuotaAuto();
 
?>

aqui teng una duda con este codigo

$insertar = "INSERT INTO cuotas VALUES(?, ?, ?, ?, ?, ?)";

si estas usando mysql o mssql entonces debes mencionar los campos en el orden en que los vas a insertar no?, algo asi como

$insertar = "INSERT INTO cuotas(campo1,campo2,campo3,campo4,campo6) VALUES(?, ?, ?, ?, ?, ?)";

digo, tal vez asi se debe usar, pero en eso el experto eres tu.

salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 11/06/2018 13:26:49
En el caso de que se inserte valores para todos los campos se puede omitir mencionar el nombre de los mismos como yo he hecho.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 11/06/2018 13:52:36
Por otro lado, he probado el código modificado que me pasaste y me tira un error en la linea 44 que es este:

Warning: mysqli_stmt_close() expects parameter 1 to be mysqli_stmt, boolean given in C:\xampp\htdocs\proyecto web asociacion veteranos legionarios -prefinal - 3 ccasa\cuotas_auto.php on line 44

Sin embargo, lo he comentado para evitar el error y he puesto un "echo" dentro del while indicando que se insertaran las cuotas de los socios con las id devueltas mediante la consulta select y no realiza la funcion de insertar, simplemente muestra en pantalla el echo y yasta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por gonzalo (615 intervenciones) el 12/06/2018 03:46:09
al parecer es al cerrar la conexion.

es lo que te comentaba, no revise el codigo, solo lo reacomode, fijate a ver si la orden esta bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 12/06/2018 22:15:58
Se que es al cerrar la conexion pero si la cierro dentro del while no lo recorre no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por gonzalo (615 intervenciones) el 13/06/2018 03:55:48
al cerrar la conexion se pierde el resulset, correcto.

salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 14/06/2018 19:13:23
ya lo conseguí hacer pero lo tuve que hacer de una manera diferente aun así gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por xve (6935 intervenciones) el 14/06/2018 20:27:07
Hola Antonio, nos puedes compartir como lo has solucionado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antonio
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

¿Cómo puedo recorrer todas las filas que devuelve una consulta select?

Publicado por Antonio (8 intervenciones) el 17/06/2018 12:20:26


Aquí les dejo como lo solucioné:

// Función que crea las cuotas automáticamente.
function cuotaAuto() {

// Incluimos el archivo de conexión.
require_once 'conexion.php';

//Consulta para traer el valor del importe de la tabla opciones.
$importe = "SELECT Valor_predeterminado FROM opciones";

if ($resultado = mysqli_query($conexion, $importe)) {

//echo "Importe: " . $resultado . "<br/>";
echo "<br/>";

/* obtener el array asociativo */
while ($fila = mysqli_fetch_row($resultado)) {

printf ("Importe: %s", $fila[0]);
$imp = $fila[0];
//echo "<br/>" . $imp;

}

} else {

echo "error al seleccionar el importe: " . mysqli_error($conexion);

}

$seleccionar = "SELECT Id FROM socios WHERE Id NOT IN(SELECT Id_Socio FROM cuotas WHERE Mes = ? AND Anno = ?)";

if ($seleccionar_stmt = mysqli_prepare($conexion, $seleccionar)) {

// Ligar parámetros para marcadores.
mysqli_stmt_bind_param($seleccionar_stmt, "si", $mes, $anno);

//Establecer la información local en castellano de España.
$inf_local = setlocale(LC_ALL,"es_ES");

//Variables que guardan el mes (numérico) y el año atual.
$mes = strftime("%B");
$anno = date("Y");

// Ejecutar la consulta preparada.
mysqli_stmt_execute($seleccionar_stmt);

// Vincular las variables de resultados.
mysqli_stmt_bind_result($seleccionar_stmt, $Id);

$consulta = "";

echo "<p>Se insertará la cuota del mes actual para todos los socios que no la tengan creada</p>";

// Obtener los valores.
while (mysqli_stmt_fetch($seleccionar_stmt)) {

$importe = $imp;

$res_importe = str_replace(",", ".", $importe);

$pagado = 0;

$id_socio = $Id;

$id_cuota = NULL;

//echo $id_socio . "," . $mes . "," . $anno . "," . $res_importe . "," . $pagado;

$valores = $id_socio . ",'" . $mes . "'," . $anno . "," . $res_importe . "," . $pagado;

$consulta = $consulta . " INSERT INTO cuotas(Id_Socio, Mes, Anno, Importe, Pagado) VALUES(" . $valores . ");";

}

//echo $consulta . "<br/>";

$lote_consultas = explode(";", $consulta);

foreach ($lote_consultas as $consultaC) {

if (strlen($consultaC) > 0) {

//echo $consultaC;

/* Consultas de selección que devuelven un conjunto de resultados */
$resultado = mysqli_query($conexion, $consultaC) ;

//echo $resultado . "<br/>";

}

}

}

// Cerrar la sentencia preparada.
mysqli_stmt_close($seleccionar_stmt);

mysqli_close($conexion);

}

cuotaAuto();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar