Foros del Web » Programando para Internet » PHP »

Problema insertando datos desde un array con checkboxes en MySQL

Estas en el tema de Problema insertando datos desde un array con checkboxes en MySQL en el foro de PHP en Foros del Web. Tengo un problema con un formulario con el que envío datos a una base de datos mysql utilizando un array. Todo va perfecto salvo cuando ...
  #1 (permalink)  
Antiguo 19/12/2011, 12:06
Avatar de loki_gz  
Fecha de Ingreso: febrero-2008
Mensajes: 48
Antigüedad: 16 años, 2 meses
Puntos: 2
Pregunta Problema insertando datos desde un array con checkboxes en MySQL

Tengo un problema con un formulario con el que envío datos a una base de datos mysql utilizando un array.

Todo va perfecto salvo cuando en el formulario introduzco un checkbox para pasarle el valor 0 ó 1 a la BD.

He probado de dos maneras (con dos resultados distintos) pero no consigo obtener lo que quiero.

El código ha sido generado con DW, pero ha sido ligeramente adaptado a mis necesidades

Este es el código que uso:

Código PHP:
 $editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form")) {
  foreach($_POST['input'] as $key => $val){
  $insertSQL = sprintf("INSERT INTO tabla (input, check) VALUES ($val, %s)",
                       GetSQLValueString(isset($_POST['check']) ? "true" : "", "defined","1","0"));

  mysql_select_db($database_db, $db);
  $Result1 = mysql_query($insertSQL, $db) or die(mysql_error());
}
}

<body>

<form  id="form" name="form" method="post" action="<?php echo $editFormAction?>"
<table>
    <tr>
        <td>input 1</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[]" type="checkbox"/>
        </td>
    </tr>
    <tr>
        <td>input 2</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[]" type="checkbox"/>
        </td>

    </tr>
    <tr>
        <td>input 3</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[]" type="checkbox"/>
        </td>
    </tr>
    <tr>
        <input type="hidden" name="MM_insert" value="form" />
    <input type="submit" value="Insertar" />
    </tr>
</table>
</form>

</body>
Con este código el resultado que obtengo es una BD con tres nuevos registros. Pero si en el formulario había activado el checkbox en alguno de los tres inputs, siempre le pasará el valor 1 al primero de los registros. Da igual que active el primero, el segundo o el tercero, siempre se lo pasará al primer registro.

Con esta pequeña modificación que le hice al código, el resultado es distinto, pero tampoco es válido:

Código PHP:
 $editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form")) {
  foreach($_POST['input'] as $key => $val){
  $insertSQL = sprintf("INSERT INTO tabla (input, check) VALUES ($val, %s)",
                       GetSQLValueString($_POST['check'][$key], "int"));

  mysql_select_db($database_db, $db);
  $Result1 = mysql_query($insertSQL, $db) or die(mysql_error());
}
}

<body>

<form  id="form" name="form" method="post" action="<?php echo $editFormAction?>"
<table>
    <tr>
        <td>input 1</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[]" type="checkbox" value="1"/>
        </td>
    </tr>
    <tr>
        <td>input 2</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[]" type="checkbox" value="1"/>
        </td>
    </tr>
    <tr>
        <td>input 3</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[]" type="checkbox" value="1"/>
        </td>
    </tr>
    <tr>
        <input type="hidden" name="MM_insert" value="form" />
    <input type="submit" value="Insertar" />
    </tr>
</table>
</form>

</body>
De esta manera, lo que consigo es que sólo crea un nuevo registro y le asigna el valor 1 al campo check si activo cualquiera de los 3 checkboxes. Es decir, mantiene el mismo problema con los checkboxes que con el código anterior, pero ahora aparece otro problema, ya que no genera 2 de los 3 registros que debiera crear.

Espero haberme explicado bien y que sepáis ayudarme a solucionar este problema. He buscado bastante por internet, pero no consigo dar con la solución.

No dudéis en pedirme cualquier aclaración sobre lo que he escrito aquí.
  #2 (permalink)  
Antiguo 19/12/2011, 19:31
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 2 meses
Puntos: 177
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

yo creo que el problema está en que si han dejado vacio el input text, quizás no se recupera la variable por POST, por eso probé con un for:

for($i=0;$i<sizeof($_POST['input']);$i++){
$insertSQL = sprintf("INSERT INTO tabla (input, check) VALUES ('".$_POST['input'][$i]."', %s)",
GetSQLValueString($_POST['check'][$i], "int"));


Supongo que fue un error de copiar y pegar, pero la etiqueta de apertura del form no está cerrada
__________________
la la la
  #3 (permalink)  
Antiguo 20/12/2011, 01:32
Avatar de toledo_nocturno  
Fecha de Ingreso: agosto-2011
Ubicación: Under the northen star
Mensajes: 86
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Si, es justo lo que comenta Truman. Tienes que ir contando cada vuelta del bucle para que compare si ese valor está a cero o a uno, y que haga lo que deba en cada caso.

Saludos.
__________________
diseño web | Clan Rol
  #4 (permalink)  
Antiguo 20/12/2011, 05:05
Avatar de loki_gz  
Fecha de Ingreso: febrero-2008
Mensajes: 48
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

O sea que el problema está en que el loop ha de hacerse con un for, no con un foreach.

Lo probaré ahora mismo y os cuento
  #5 (permalink)  
Antiguo 20/12/2011, 05:37
Avatar de loki_gz  
Fecha de Ingreso: febrero-2008
Mensajes: 48
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Nada, he probado a cambiar el loop, pero sigue dando el mismo problema.

Si lo hago siguiendo el primero de los códigos, crea tres nuevos registros pero le asigna siempre el valor 1 al campo checkbox del primero de ellos, independientemente de cual sea el checkbox que haya activado.

Si sigo el segundo ejemplo, sólo me crea un registro y le asigna el valor 1 al campo checkbox, aunque en el formulario hubiera activado el checkbox 2.


Por cierto, detecté un error en el código del primer ejemplo:

donde puse
Código PHP:
GetSQLValueString(isset($_POST['check']) ? "true" """defined","1","0")); 
debe poner
Código PHP:
GetSQLValueString(isset($_POST['check'][$key]) ? "true" """defined","1","0")); 
  #6 (permalink)  
Antiguo 20/12/2011, 06:08
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Por favor ante pone este script en tu codigo, ejecutalo y mostrame tus resultados.
Código PHP:
<?php
$input 
$_POST['check'];
echo 
"<pre>";
print_r($input);
echo 
"</pre>";
//despues
for( $i 0$i<count($input); $i++)
{
echo 
$input[$i]."<br>";
}
?>
__________________
Mono programando!
twitter.com/eguimariano
  #7 (permalink)  
Antiguo 20/12/2011, 06:26
Avatar de loki_gz  
Fecha de Ingreso: febrero-2008
Mensajes: 48
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Me devuelve lo siguiente:

Cita:
Array
(
[0] => 1
)

1
  #8 (permalink)  
Antiguo 20/12/2011, 06:35
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Fijate ahora:
Código PHP:
<?php 
if(isset($_POST['check']))
{
$check $_POST['check']; 
echo 
"<pre>"
print_r($check); 
echo 
"</pre>"
//despues 
for( $i 0$i<count($check); $i++) 

echo 
$check[$i]."<br>"

}
if(isset(
$_POST['input']))
{
$input $_POST['input']; 
echo 
"<pre>"
print_r($input); 
echo 
"</pre>"
//despues 
for( $i 0$i<count($input); $i++) 

echo 
$input[$i]."<br>"

}
?>
test.php
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <title>Foros del web</title>
  4. <meta charset="iso-8859-1">
  5. </head>
  6. <form  id="form" name="form" method="post" action="test.php" >
  7.     <tr>
  8.         <td>input 1</td>
  9.         <td>
  10.             <input type="text" name="input[]" value="" />
  11.         </td>
  12.         <td align="center" valign="middle">
  13.             <input name="check[]" type="checkbox"/>
  14.         </td>
  15.     </tr>
  16.     <tr>
  17.         <td>input 2</td>
  18.         <td>
  19.             <input type="text" name="input[]" value="" />
  20.         </td>
  21.         <td align="center" valign="middle">
  22.             <input name="check[]" type="checkbox"/>
  23.         </td>
  24.  
  25.     </tr>
  26.     <tr>
  27.         <td>input 3</td>
  28.         <td>
  29.             <input type="text" name="input[]" value="" />
  30.         </td>
  31.         <td align="center" valign="middle">
  32.             <input name="check[]" type="checkbox"/>
  33.         </td>
  34.     </tr>
  35.     <tr>
  36.         <input type="hidden" name="MM_insert" value="form" />
  37.     <input type="submit" value="Insertar" />
  38.     </tr>
  39. </table>
  40. </form>
  41. </body>
  42. </html>
__________________
Mono programando!
twitter.com/eguimariano
  #9 (permalink)  
Antiguo 20/12/2011, 06:44
Avatar de loki_gz  
Fecha de Ingreso: febrero-2008
Mensajes: 48
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Lo sigue haciendo mal, ¿no?

El resultado que me da es este:

Cita:
Array
(
[0] => on
)

on

Array
(
[0] => prueba 1
[1] => prueba 2 (on)
[2] => prueba 3
)

prueba 1
prueba 2 (on)
prueba 3
Es decir, no interpreta 3 checkboxes distintos, sino que para él es uno sólo, y en cuanto activamos uno de los tres, para él ya está en on
  #10 (permalink)  
Antiguo 20/12/2011, 07:05
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Cita:
Iniciado por loki_gz Ver Mensaje
Lo sigue haciendo mal, ¿no?

El resultado que me da es este:



Es decir, no interpreta 3 checkboxes distintos, sino que para él es uno sólo, y en cuanto activamos uno de los tres, para él ya está en on
Algo parecido, en realidad cuando pones corchetes en el name del input, le estas diciendo a PHP que es un array, por defecto lo interpreta como tal.
los checkbox , solo es un valor Boleano. y por defecto solo ingresa en el array los True, no los false.
Mi consejo:

check1
check2
check3

No utilices corchetes en con los checkbox
__________________
Mono programando!
twitter.com/eguimariano
  #11 (permalink)  
Antiguo 20/12/2011, 07:10
Avatar de loki_gz  
Fecha de Ingreso: febrero-2008
Mensajes: 48
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Ok. Intentaré implementar un código siguiendo tu consejo.

Ya te contaré qué tal me fue
  #12 (permalink)  
Antiguo 23/12/2011, 06:57
Avatar de loki_gz  
Fecha de Ingreso: febrero-2008
Mensajes: 48
Antigüedad: 16 años, 2 meses
Puntos: 2
Respuesta: Problema insertando datos desde un array con checkboxes en MySQL

Bueno, pues por fin he dado en el clavo y he conseguido solucionarlo. El tema está en utilizar los corchetes, pero asignándole un número de serie consecutivo que luego evaluaría el loop cuando inserta (o actualiza) los registros.

Según el código de muestra que colgué al principio y con las modificaciones que he hecho, la cosa quedaría así:

prueba.php
Código PHP:
<?php
$editFormAction 
$_SERVER['PHP_SELF'];
if (isset(
$_SERVER['QUERY_STRING'])) {
  
$editFormAction .= "?" htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset(
$_POST["MM_insert"])) && ($_POST["MM_insert"] == "form")) {
  for(
$key=0;$key<sizeof($_POST['input']);$key++){
  
$insertSQL sprintf("INSERT INTO tabla (input, check) VALUES (%s, %s)",
                       
GetSQLValueString($_POST['input'][$key], "int"),
                       
GetSQLValueString(isset($_POST['check'][$key]) ? "true" """defined","1","0"));

  
mysql_select_db($database_db$db);
  
$Result1 mysql_query($insertSQL$db) or die(mysql_error());
}
}
?>
form.html
Código HTML:
<html>
<body>

<form  id="form" name="form" method="post" action="prueba.php"
<table>
    <tr>
        <td>input 1</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
<!-- Al nombre de cada check le asigno un número de serie correlativo comenzando por 0" -->
            <input name="check[0]" type="checkbox" value="1"/>
        </td>
    </tr>
    <tr>
        <td>input 2</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[1]" type="checkbox" value="1"/>
        </td>
    </tr>
    <tr>
        <td>input 3</td>
        <td>
            <input type="text" name="input[]" value="" />
        </td>
        <td align="center" valign="middle">
            <input name="check[2]" type="checkbox" value="1"/>
        </td>
    </tr>
    <tr>
        <input type="hidden" name="MM_insert" value="form" />
    <input type="submit" value="Insertar" />
    </tr>
</table>
</form>

</body>
</html> 
Salvo que me haya equivocado a la hora de copiar y pegar código, la cosa funciona, ¡probado!

Gracias por vuestra ayuda

Etiquetas: arrays, checkbox, mysql
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 00:45.