Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Bucle foreach dentro de una sentencia sql

Estas en el tema de Bucle foreach dentro de una sentencia sql en el foro de PHP en Foros del Web. Hola amigos/as, miren ya ni entiendo por que esta consulta sql no me funciona (lleva php). Por mas que la reviso me da error de ...
  #1 (permalink)  
Antiguo 20/03/2015, 05:14
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 10 meses
Puntos: 5
Bucle foreach dentro de una sentencia sql

Hola amigos/as, miren ya ni entiendo por que esta consulta sql no me funciona (lleva php).

Por mas que la reviso me da error de sintaxis y no se por que.

la consulta sql es un insert into, pero con un bucle foreach dentro y este bucle me da error de sintaxis.

Es extraño por que lo veo bien escrito.

Si pudieran echarme una mano lo agradeceria mucho.

Código PHP:
Ver original
  1. $sql="INSERT INTO " . $nombre_tabla . " (nombre, caracteristicas, antiguedad) VALUES ("
  2.    
  3. . foreach($array_datos as $datos) {$datos; } . 
  4.                      
  5. ")";
  #2 (permalink)  
Antiguo 20/03/2015, 05:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucle foreach dentro de una sentencia sql

Te da un error de sintaxis a que nivel? ¿MySQL o PHP?
Son cosas y soluciones diferentes.
Por lo pronto, todo eso construye muy mal la query. Recuerda que MySQL no entiende PHP.
Tienes que crear la query para que MySQL la entienda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 20/03/2015, 05:54
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 10 meses
Puntos: 5
Respuesta: Bucle foreach dentro de una sentencia sql

de php, ya que si quito todo el php y dejo solo la variable , no da error de sintaxis.

dicho de otro modo si pongo esto no da errror.

Código PHP:
Ver original
  1. $sql="INSERT INTO " . $nombre_tabla . " (nombre, caracteristicas, antiguedad) VALUES ("
  2.        
  3.     . $datos .
  4.                          
  5.     ")";
  #4 (permalink)  
Antiguo 20/03/2015, 05:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucle foreach dentro de una sentencia sql

No te dará error, pero a menos que $datos contenga la cadena completa de valores para los campos, te dará error de sintaxis al momento de ejecutar la query.

Mira, esto es lo que en tu anterior código no te dará error:
Código PHP:
$sql="INSERT INTO " $nombre_tabla " (nombre, caracteristicas, antiguedad) VALUES (";
foreach(
$array_datos as $datos) {$sql.= $datos; }
$sql.= ")"
pero eso tampoco te funcionará. Está mal construido.

No te funcionará porque la consulta debe quedar construida mas o menos así:
Código SQL:
Ver original
  1. INSERT INTO tabla (nombre, caracteristicas, antiguedad)
  2. VALUES ('edificio', 'kjhkkhjhjh kjhjh', 50);
y eso no se realiza con el codigo que propones. Con el tuyo, estos datos quedarían asi:
Código SQL:
Ver original
  1. INSERT INTO tabla (nombre, caracteristicas, antiguedad)
  2. VALUES (edificiokjhkkhjhjh kjhjh50);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 20/03/2015 a las 06:03
  #5 (permalink)  
Antiguo 20/03/2015, 06:17
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 10 meses
Puntos: 5
Respuesta: Bucle foreach dentro de una sentencia sql

Te entiendo perfectamente pero eso se soluciona asi creo:

Código PHP:
Ver original
  1. echo $sql="INSERT INTO " . $nombre_tabla . " (nombre, caracteristicas, antiguedad) VALUES (";
  2. foreach($array_datos as $datos) {$sql.= $datos . ", "; }
  3. $sql.= ")";

El asunto es que sigue sin funcionar aun indicando esto ", "

  #6 (permalink)  
Antiguo 20/03/2015, 06:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucle foreach dentro de una sentencia sql

No, no se soluciona así exactamente, porque dependiendo del tipo de dato, debe llevar o no apóstrofos...
No te olvides, por favor, que MySQL no entiende variables de PHP, por lo que no puede saber que cuando pones esto:
Código SQL:
Ver original
  1. INSERT INTO tabla (nombre, caracteristicas, antiguedad)
  2.     VALUES (edificio, kjhkkhjhjh kjhjh, 50)
;
los dos primeros quieres que se tomen como cadenas de texto. Para MySL serían nombres de columnas, lo que te daría un error de ejecución.

Y si le pones a todo apostrofos, puedes afectar la performance de los datos numéricos, ya que obligas a MySQL a hacer conversiones implícitas, y se generarán errores de datos si la variable llega vacía sin que te des cuenta.
En inserciones simples no lo notarás, pero en las masivas puede costarte performance.

No es difícil hacer eso dinámico, pero tiene que ser hecho con cuidado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 20/03/2015, 07:29
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 10 meses
Puntos: 5
Respuesta: Bucle foreach dentro de una sentencia sql

gnzsoloyo, de veras se me estan agotando las ideas, entiendo perfectamente lo que me explicas.

Dare un paso atras para tener una mejor perspectiva, vamos a ver:

Tengo este array:

Código PHP:
Ver original
  1. $array_datos = array('$nombre', '$caracteristicas', '$antiguedad');

El cual necesito meter estos valores dentro de la consulta array:

y tengo esto, que a primera impresion lo veo bien en todos los sentidos, pero que no funciona:

Código PHP:
Ver original
  1. function InsertarDatos($nombre_tabla, $array_datos)
  2.  
  3. $sql="INSERT INTO " . $nombre_tabla . " (nombre, caracteristicas, antiguedad) VALUES (";
  4.       foreach($array_datos as $datos) {
  5.       $sql.=  $datos . ", "; }
  6.       $sql.= ")";
  7.  
  8. }

Bien dicho esto hago un "echo" para ver donde podria estar el error y la posible solucion:

y me dice esto:

INSERT INTO coches (nombre, caracteristicas, antiguedad) VALUES (
Warning: Invalid argument supplied for foreach() in on line 46

Acto seguido veo el foreach y lo veo bien pero no logro ver el error.

(
  #8 (permalink)  
Antiguo 20/03/2015, 08:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucle foreach dentro de una sentencia sql

Te estás complicando la vida.
Código PHP:
function InsertarDatos($nombre_tabla$array_datos)
 {
$sql="INSERT INTO " $nombre_tabla " (nombre, caracteristicas, antiguedad) VALUES ('";
$sql.=  implode("', '"$array_datos);
$sql.= ")"

foreach() no es la función adecuada porque necesitas saber anticipadamente cuantos ciclos recorrerá a fin de excluir la coma después del último valor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 20/03/2015, 08:08
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Bucle foreach dentro de una sentencia sql

El error te dice que la variable que usas en el foreach() no es un array, así que $array_datos seguramente no es lo que tu crees que es.

Eso depende de cómo ejecutas el método InsertarDatos() precisamente, ¿podrías mostrar el código completo de cómo lo haces o hay que adivinar?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 20/03/2015, 09:13
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 10 meses
Puntos: 5
Respuesta: Bucle foreach dentro de una sentencia sql

gnzsoloyo, el codigo que has puesto con el implode , lo he probado y no funciona no inserta.

Dice:

Warning: implode(): Invalid arguments passed in on line 43


pateketrueke, este es el codigo que tengo:

archivo 1:

Código HTML:
Ver original
  1. <form method="POST" action="2---insertar_parte_2.php">
  2.        
  3.             <input type="text" name="nombre" placeholder="Nombre"/>
  4.            
  5.             </br></br>
  6.        
  7.             <input type="text" name="caracteristicas" placeholder="Caracteristicas"/>
  8.            
  9.             </br></br>
  10.        
  11.             <input type="text" name="antiguedad" placeholder="antiguedad"/>
  12.            
  13.             </br></br>
  14.            
  15.             <input type="submit" value="Insertar">
  16.                                  
  17.         </form>


archivo 2:

Código PHP:
Ver original
  1. include 'OperacionesMysql.php';
  2.  
  3.     $op = new OperacionesMysql();
  4.        
  5.  
  6.    
  7.     $nombre = $_POST['nombre'];
  8.     $caracteristicas = $_POST['caracteristicas'];  
  9.     $antiguedad = $_POST['antiguedad'];
  10.  
  11.  
  12.    
  13.     //CAMPOS OBLIGATORIOS QUE NO PUEDEN ESTAR VACIOS..................................................
  14.    
  15.     if ($nombre == '' or $caracteristicas == '' or $antiguedad == '')
  16.    
  17.         {
  18.             header('Location:2---insertar_parte_1.php');           
  19.         }
  20.        
  21.         else
  22.        
  23.         {  
  24.             //Lineas para solo poner el nombre de la tabla en el archivo "OperacionesMysql.php"
  25.             $nombre_tabla = $op->nombre_tabla; 
  26.            
  27.             $op->InsertarDatos($_POST['nombre'], $_POST['caracteristicas'], $_POST['antiguedad'], $nombre_tabla);                              
  28.                        
  29.             header('Location:2---insertar_parte_1.php');


archivo 3:

Código PHP:
Ver original
  1. class OperacionesMysql
  2.        
  3.         {
  4.    
  5.             private $servidor = 'localhost';
  6.             private $usuario = 'root';
  7.             private $pass = '';
  8.             private $basedatos = 'vehiculos';  
  9.    
  10.             public $nombre_tabla = 'coches';
  11.    
  12.             //public $nombre, $caracteristicas, $antiguedad;
  13.            
  14.             public $array_datos = array('$nombre', '$caracteristicas', '$antiguedad');
  15.  
  16.  
  17.  
  18.  
  19.  
  20.             public function ConectarBbdd()
  21.            
  22.             {
  23.                 $con = mysqli_connect($this->servidor, $this->usuario, $this->pass, $this->basedatos) or
  24.                 die ('Lo siento pero no conecta a la BBDD');
  25.                
  26.                 return $con;       
  27.             }
  28.  
  29.  
  30.  
  31.  
  32.  
  33.             function InsertarDatos($nombre_tabla, $array_datos)
  34.            
  35.                 {          
  36.                                    
  37.                 echo $sql="INSERT INTO " . $nombre_tabla . " (nombre, caracteristicas, antiguedad) VALUES (";
  38.                       foreach($array_datos as $datos) {
  39.                       $sql.=  $datos . ", "; }
  40.                       $sql.= ")";  
  41.                    
  42.                
  43.                    
  44.                     $con = $this->ConectarBbdd();
  45.                    
  46.                     mysqli_query($con, $sql) or die ('Lo siento pero no se inserta en BBDD' . mysqli_error($con));                                                         
  47.                 }  
  48.  
  49. }
  #11 (permalink)  
Antiguo 20/03/2015, 09:19
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Bucle foreach dentro de una sentencia sql

Mira bien lo que programas:
Código PHP:
Ver original
  1. function InsertarDatos($nombre_tabla, $array_datos)

Ahí especificas sólo dos argumentos, así que el chiste se explica solo:

Código PHP:
Ver original
  1. $op->InsertarDatos($_POST['nombre'], $_POST['caracteristicas'], $_POST['antiguedad'], $nombre_tabla);

Claramente no respetas la firma que tu mismo declaraste en dicho método.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 20/03/2015, 10:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Bucle foreach dentro de una sentencia sql

Cita:
Iniciado por mensajeescrito Ver Mensaje
gnzsoloyo, el codigo que has puesto con el implode , lo he probado y no funciona no inserta.

Dice:

Warning: implode(): Invalid arguments passed in on line 43
¿En serio?
Código PHP:
//Enter your code here, enjoy!
$nombre_tabla "tabla";
$array_datos = array('nombre''caracteristicas''antiguedad');
              
$sql="INSERT INTO " $nombre_tabla " (nombre, caracteristicas, antiguedad) VALUES ('";
$sql.=  implode("', '"$array_datos);
$sql.= "')"
echo 
$sql
Esto da por resultado (probado):
Código SQL:
Ver original
  1. INSERT INTO tabla (nombre, caracteristicas, antiguedad) VALUES ('nombre', 'caracteristicas', 'antiguedad')

Ásí que NO, mi código no está mal.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 20/03/2015, 10:38
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 10 meses
Puntos: 5
Respuesta: Bucle foreach dentro de una sentencia sql

gnzsoloyo, eureka funciona ya.

En el fondo los dos teniamos razon , el codigo que me dijiste con el implode funciona y a la vez no me funcionaba.

La razon es que el codigo funciona pero en el otro archivo como decia

tenia por un lado:

Código PHP:
Ver original
  1. function InsertarDatos($nombre_tabla, $array_datos)


y por otro:
Código PHP:
Ver original
  1. $op->InsertarDatos($_POST['nombre'], $_POST['caracteristicas'], $_POST['antiguedad'], $nombre_tabla);


y esto ultimo debia estar asi:

Código PHP:
Ver original
  1. $array_datos = array($_POST['nombre'], $_POST['caracteristicas'], $_POST['antiguedad']);           
  2.    
  3.             $op->InsertarDatos($nombre_tabla, $array_datos);

Dicho de otra manara para cuando me dijiste lo del implode, todavia no habia cambiado este ultimo codigo.

Ahora ya funciona todo como un reloj suizo.

Mil gracias a los dos por la paciencia. y la ciencia adquirida

Etiquetas: bucle, foreach, sentencia, sql, tabla
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 21:29.