Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Enviar 2 datos en un mismo campo

Estas en el tema de Enviar 2 datos en un mismo campo en el foro de PHP en Foros del Web. Buenas. Tengo una base de datos de peliculas las cuales tienen un ID y su título. La idea es mostrar todo el listado de las ...
  #1 (permalink)  
Antiguo 17/03/2017, 19:57
sjj
 
Fecha de Ingreso: octubre-2008
Mensajes: 213
Antigüedad: 15 años, 5 meses
Puntos: 12
Enviar 2 datos en un mismo campo

Buenas. Tengo una base de datos de peliculas las cuales tienen un ID y su título. La idea es mostrar todo el listado de las mismas con un input vacío para completar la cantidad a encargar en una nota de pedido. Ya he logrado insertar en la base de datos la cantidad que envío por el input pero no puedo asociarla al ID de la película. Les paso mi código por si alguien puede darme una mano:

Aquí cargo los datos

Código PHP:
$con mysql_connect("localhost","user","pass"
  or die(
"Problemas en la conexion");
mysql_select_db("base"$con)or
  die(
"Problemas en la seleccion de la base de datos"); 
$result mysql_query("SELECT Titulo, ID from catalogo order by Titulo"$con); 

echo 
"<table border = '1' > \n";
echo 
"<tr><td><b>Titulo</td><td><b>Cantidad</td></tr> \n";
while (
$row mysql_fetch_row($result)){ 
        
$id=$row[1];
       echo 
"<tr><td size='15%'>$row[0]</td><td><input name=cant[]></td><td><input name=id value=$id></td></tr> \n"
}
echo 
"</table> \n"
Y aquí los inserto en la base

Código PHP:
if ( !empty($_POST["cant"]) && is_array($_POST["cant"]) ) { 
    foreach ( 
$_POST["cant"] as $cant ) { 
             
            if (
$cant>0){

$con=mysql_connect("localhost","user","pass"
  or die(
"Problemas en la conexion");
mysql_select_db("base",$con) or
  die(
"Problemas en la seleccion de la base de datos");
$id=$_POST["id"];
mysql_query("insert into pedidosi(ID, Cantidad) values('$id','$cant')"
   
$conexion) or die("Problemas en el select".mysql_error());
}            
}
    } 
La cantidad se inserta correctamente en la base, pero respecto al ID siempre me inserta el último. Lo que yo quiero hacer es asociar la cantidad al ID de la película que estoy completando.

Muchas gracias!
  #2 (permalink)  
Antiguo 17/03/2017, 20:32
Avatar de petit89  
Fecha de Ingreso: marzo-2011
Mensajes: 1.135
Antigüedad: 13 años, 1 mes
Puntos: 170
Respuesta: Enviar 2 datos en un mismo campo

creo que tienes mal estructurada la base de datos...

si tienes un ID en pedidos es el que se entenderia como ID del pedido(registro) que supongo lleva autoincrement.... deberias tener otra columna llamada por ejemplo id_pelicula donde almacenarias la ID de la pelicula que quieres asociar
__________________
█ WebHosting / Reseller a bajo costo | Uptime Garantizado | Soporte en Español e Ingles
¿Te sirvió la respuesta? Deja un +1 (Triangulo negro al lado derecho)
  #3 (permalink)  
Antiguo 17/03/2017, 22:16
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Enviar 2 datos en un mismo campo

Para hacer eso tendras que cambiar la configuracion del campo ID y quitarle el autoincremento, pero despues asegurate de que todas las ID vayan a ser unicas (a menos que también le quites el primary key a ID) y para eso puedes crear una funcion que evite que se repitan los ID.

Aunque si lo haces así, vas a tener problemas en el futuro.

Lo ideal seria que tuvieras una estructura así en esa tabla:

ID - primary key/ autoincrement
PeliculaID
Cantidad

De esa manera en tu query cambia ID por Pelicuala ID y tema resuelto.
  #4 (permalink)  
Antiguo 18/03/2017, 16:40
sjj
 
Fecha de Ingreso: octubre-2008
Mensajes: 213
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Enviar 2 datos en un mismo campo

Les agradezco la ayuda. El campo ID no es auto increment sino un código interno e irrepetible de 6 cifras. Tal vez sean medio confusos los nombres de los campos pero ID hace siempre referencia al ID de la película y no tiene relación con el número de pedido.

Tal vez expresé mal lo que preciso hacer.

1 - Recupero todos los datos de mi catalogo en forma de tabla por lo que la cantidad de filas a visualizar será dinámica dependiendo de la cantidad de registros que tenga el catálogo. Al lado de cada registro viene un input para completar la cantidad. Por ejemplo:

El Padrino .....
Titanic .....
Avatar .....

2 - Envío los datos y quiero insertar en mi tabla sólo aquellos para los que la cantidad fue completada. La cantidad puedo recuperarla sin problemas pero el inconveniente está para saber relacionar esa cantidad con cada película. Al momento de recuperar el título de la película, siempre me ingresa el valor del último registro listado (Avatar en este caso), en lugar de aquel que se corresponde con el input que fue rellenado con un valor mayor a 0.

Muchas gracias.
  #5 (permalink)  
Antiguo 19/03/2017, 04:38
 
Fecha de Ingreso: diciembre-2009
Mensajes: 92
Antigüedad: 14 años, 4 meses
Puntos: 13
Respuesta: Enviar 2 datos en un mismo campo

Ahora en la segunda página estás recibiendo un array 'cant' y un solo valor 'id'. Si cambias:
Código PHP:
echo "<tr><td size='15%'>$row[0]</td><td><input name=cant[]></td><td><input name=id value=$id></td></tr> \n";
por
echo "<tr><td size='15%'>$row[0]</td><td><input name=cant[]></td><td><input name=id[] value=$id></td></tr> \n"
recibirás un array 'cant' con las cantidades y un array 'id' con los id de las pelis.

También puedes esconder el campo id poniendo 'hidden'
Código PHP:
<input name=id value=$id hidden
Si vas a usar este código para algo un poco serio deberías tener en cuenta estos problemas:

1. No pongas el '$con=mysql_connect("localhost","user","pass")' dentro del bucle, estás abriendo la conexión con la BDD mil veces.
2. Las funciones mysql que estás usando están obsoletas, usa mysqli que permite evitar sql injection.
3. Tienes problemas de inyección sql por ejemplo:
Un usuario normal te ingresa cantidad de película '000001': 123
La query resultante es:
Código PHP:
mysql_query("insert into pedidosi(ID, Cantidad) values('000001','123')"); 
Pero viene un usuario gracioso y te ingresa cantidad de película '000001': '); DROP DATABASE;//
La query resultante es:
Código PHP:
mysql_query("insert into pedidosi(ID, Cantidad) values('000000',''); DROP DATABASE; //'); 
y te borra la base de datos. mysqli te resuelve esto mediante bind_param()

Page1.php
Código PHP:
<?php

$mysqli 
= new mysqli("localhost""usuario""password""nombreBDD");


if (
$mysqli->connect_errno) {
    
printf("Connect failed: %s\n"$mysqli->connect_error);
    exit();
}


$result $mysqli->query("SELECT Titulo, ID from catalogo order by Titulo");

if ( 
$result === false ) {
    
printf("Query error: %s\n"mysqli_error($mysqli));
    exit();
}


echo 
'<form method="post" action="page2.php" id="form_pelis">';
echo 
"<table border = '1' > \n";
echo 
"<tr><td><b>Titulo</td><td><b>Cantidad</td></tr> \n";

while (
$row $result->fetch_object()){ 
          
       echo 
"<tr><td size='15%'>$row->Titulo</td><td><input name=cant[] type=number min=0 value=0></td><input name=id[] value=$row->ID hidden></tr> \n"
}

echo 
"</table> \n";
echo 
"</form>";
echo 
'<button type="submit" form="form_pelis" value="Submit">Submit</button>';

Page2.php
Código PHP:
<?php

$mysqli 
= new mysqli("localhost""usuario""password""nombreBDD");


if (
$mysqli->connect_errno) {
    
printf("Connect failed: %s\n"$mysqli->connect_error);
    exit();
}



if ( !empty(
$_POST["cant"]) && is_array($_POST["cant"]) ) { 

    for ( 
$i 0$i count($_POST["cant"]); $i++ ) {
        
$id $_POST["id"][$i];
        
$cant $_POST["cant"][$i];
        
        if ( 
$cant ) {

            
$stmt $mysqli->prepare("INSERT INTO pedidosi(ID, Cantidad) values(?, ?)");
            
$stmt->bind_param("sd"$id$cant);
            
$stmt->execute();

        }    
    }

}
Saludos.
  #6 (permalink)  
Antiguo 21/03/2017, 19:01
sjj
 
Fecha de Ingreso: octubre-2008
Mensajes: 213
Antigüedad: 15 años, 5 meses
Puntos: 12
Respuesta: Enviar 2 datos en un mismo campo

Muchísimas gracias por tu ayuda! Debo meterme con el mysqli, te agradezco por los códigos.

Etiquetas: campo, mysql, select, sql
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 05:45.