PHP - Insertar varios campos vacíos

 
Vista:
sin imagen de perfil
Val: 67
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Andrés (22 intervenciones) el 15/11/2020 03:58:31
Saludos, en un formulario que debe llenar el usuario tengo varios campos opcionales que pueden ser llenados o no por el usuario para ser insertados en una base de datos, el problema es que no consigo que eso suceda, tengo 4 campos opcionales marca, modelo, edicion y telefono2

El usuario podría o no llenar cualquiera de esos campos, pero no consigo que se cumpla la primera condición con el primer insert, solo pasa al segundo insert así llene cualquiera de los que pueden ser nulos. Aquí mis consultas para insertar:

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
<?php
session_start();
include "./conexion.php";
if(!isset($_SESSION['datos_logueo'])){header("location: ./index.php");}
$arreglousuario = $_SESSION['datos_logueo'];
$id = $arreglousuario['id_usuario'];
 
if(isset($_POST['nombre']) && isset($_POST['descripcion'])
&& isset($_POST['precio']) && isset($_POST['inventario']) && isset($_POST['ubicacion'])
&& isset($_POST['telefono1'])){
 
 
  $fecha = new DateTime();
  if(!empty($_POST['marca']) || !empty($_POST['modelo']) || !empty($_POST['edicion']) || !empty($_POST['telefono2'])){
    $sql1 = $conexion->query("insert into publicacion
    (nombre,marca,modelo,edicion,descripcion,precio,inventario,ubicacion,telefono1,
    telefono2,fecha_publicacion,estatus_publicacion,id_usuario,id_estado,
    id_categoria,id_subcategoria) values
                        (
                        '".$_POST['nombre']."',
                        '".$_POST['marca']."',
                        '".$_POST['modelo']."',
                        '".$_POST['edicion']."',
                        '".$_POST['descripcion']."',
                        ".$_POST['precio'].",
                        ".$_POST['inventario'].",
                        '".$_POST['ubicacion']."',
                        ".$_POST['telefono1'].",
                        ".$_POST['telefono2'].",
                        '{$fecha->format('YmdHis')}',
                        '1',
                        $id,
                        '".$_POST['estado']."',
                        '".$_POST['categoria']."',
                        '".$_POST['subcategoria']."'
                      )
                        ")or die ($conexion->error);
                       header("Location: ../admin/publicacion.php?success");
        }else{
 
          $fecha = new DateTime();
          $sql2 = $conexion->query("insert into publicacion
          (nombre,descripcion,precio,inventario,ubicacion,telefono1,
          fecha_publicacion,estatus_publicacion,id_usuario,id_estado,
          id_categoria,id_subcategoria) values
                              (
                              '".$_POST['nombre']."',
                              '".$_POST['descripcion']."',
                              ".$_POST['precio'].",
                              ".$_POST['inventario'].",
                              '".$_POST['ubicacion']."',
                              ".$_POST['telefono1'].",
                              '{$fecha->format('YmdHis')}',
                              '1',
                              $id,
                              '".$_POST['estado']."',
                              '".$_POST['categoria']."',
                              '".$_POST['subcategoria']."'
                            )
                              ")or die ($conexion->error);
                             header("Location: ../admin/publicacion.php?success");
 
    }
}
 
?>


Gracias de antemano
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
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por joel (1269 intervenciones) el 15/11/2020 11:47:10
Hola Andrés, porque no haces el insert con todos los campos, tanto si el usuario los ha rellenado como si no los has rellenado?? el resultado siempre sera el mismo, no?

Si ha llenado valores, los pones, si no ha llenado valores tambien los pones... al final si no ha puesto ningún valor quedaran vacíos igualmente.
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: 67
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Andrés (22 intervenciones) el 15/11/2020 16:00:33
Hola Joel, gracias por responder, pues si ya intentado haciendo el insert con todos los datos, pero es que si dejo alguno vacío en el formulario de esos 4 que son opcionales no se ejecuta el insert y me da un error:


You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' '20201115155647', '1', ' at line 15
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Mauro (1036 intervenciones) el 16/11/2020 13:45:32
Tienes un problema en la condición del if. Al usar || (Or) basta con que cualquiera de los campos no esté vacío para que la condición se cumpla, es decir, la única forma de que pase por el else es que TODOS estén vacíos a la vez.

En principio deberías cambiar el || por &&.

De cualquier modo, para evitar hacer una maraña de combinaciones, te recomiendo que armes el SQL en forma dinámica.

Algo así como:

1
2
3
4
5
6
7
8
9
10
11
12
13
$insert = "INSERT INTO publicacion (";
$values = " VALUES (";
 
foreach ( $_POST as $key => $value ) {
   $insert .= "$key, ";
   $values .= " '$value', ";
}
 
// Eliminar las ultimas comas y cerrar los parentesis
$insert = substr($insert, 0, -2).')';
$values = substr($values, 0, -2).')';
 
$sql = $insert.$values;

Y con eso puedes ejecutar la consulta
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
sin imagen de perfil
Val: 67
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Andrés (22 intervenciones) el 16/11/2020 19:43:01
Hola Mauro, gracias por responder, si ya los he hecho con && y cuando intento insertar un valor de los campos opcionales no lo hace, salta al else de una vez y así llene cualquiera de los input opcionales siempre entra en NULL a la bd.

No entiendo muy bien el código que me colocas si podrías explicarlo mejor lo agradecería.
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Mauro (1036 intervenciones) el 16/11/2020 23:07:01
Hola Andrés:

Claro, intentaré explicarlo un poco.

Lo que estoy haciendo es crear dos cadenas que iré formando utilizando los elementos enviados a través del formulario (el array $_POST).

Estas cadenas se unirán al final (en la línea 13) formando una sentencia SQL completa, algo como:

1
INSERT INTO publicacion(nombre, marca, modelo) VALUES ('NOMBRE1', 'MARCA1', 'MODELO1')

Una vez formado el sql completo sólo resta ejecutarlo.

La idea es que los campos que sean opcionales no estarán en el arreglo $_POST ya que el navegador no los enviará.

En caso de que esto no resulte así podrías verificar que $value no esté vacío antes de agregarlo (a $insert y a $value).

Las líneas 10 y 11 simplemente están ahí porque si te fijas, dentro del foreach se agrega una , luego de cada campo, de modo que el último llevará una coma que, de no removerse, generará un SQL incorrecto, algo como:

1
INSERT INTO publicacion(nombre, marca, modelo, ) VALUES ('NOMBRE1', 'MARCA1', 'MODELO1', )

Espero haber sido claro, si no es así pregunta nomás ;)
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: 67
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Andrés (22 intervenciones) el 18/11/2020 01:42:32
Gracias por responder, ok he entendido mejor pero me sigue quedando la duda aquí

1
2
$insert = "INSERT INTO publicacion (";
$values = " VALUES (";


aquí estás creando los arreglos en la línea 1 y 2 y no me queda clara la sintaxis, es decir ese insert debería llevar los nombres de los campos y values debería llevar los nombres de los input que viajan por post, entonces ¿dónde cierras el parentesis del insert y el de values? ¿y con que campos llenas la consulta y los values, ó es que los estás dejando vacíos solo por cuestiones de acortar el ejemplo?, esas son mis dudas.
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Mauro (1036 intervenciones) el 18/11/2020 13:23:00
Las variables que ves en las líneas 1 y 2 son strings, no arreglos. Cuidado con esto.

Lo que estoy intentando es armar un string que contenga todo el SQL que quiero enviar al servidor, la diferencia con el tuyo es que, en lugar de armar un string literal, lo estoy armando con la concatenación de varias partes.

Nota como se junta todo en la línea 13.

El string que debes enviar a $conexion->query es precisamente $sql, los anteriores son auxiliares.

Los cierres de paréntesis se realizan en las líneas 10 y 11, junto con la eliminación de las comas sobrantes.

Para entenderlo mejor te sugiero que realices una prueba de escritorio o, si lo prefieres más tecnológico, usa un debugger.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 67
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Andrés (22 intervenciones) el 18/11/2020 14:09:37
Gracias nuevamente, entiendo pero sigo sin comprender que valores estás pasando en los strings
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 Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Insertar varios campos vacíos

Publicado por Mauro (1036 intervenciones) el 18/11/2020 16:21:19
La clave de esto está en la sintaxis del foreach y el hecho de que $_POST es un arreglo asociativo.

Cada campo que viene del HTML tiene un nombre (asignado en el formulario) y un valor (ingresado por el usuario).

Del lado del php toda esa información se estructura en el arreglo $_POST, de modo que cada clave corresponde al nombre de un input y el valor asociado (en el par $key => $value ) a lo ingresado por el visitante.

De modo que en el primer string ($insert) quedan los nombres de los campos de tu tabla y en el segundo ($values) los valores ingresados por el usuario.

Un punto que tal vez me olvide de aclarar es que los inputs del formulario deben tener nombres que coincidan con los campos de tu base de datos, de otro modo esto fallara.

Escribi este articulo que puede ayudarte: https://academy.leewayweb.com/como-insertar-en-mysql-desde-php/
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