Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: gAb1 en 12 Noviembre 2015, 06:38 am



Título: [Resuelto] problema para declarar variables de un formulario
Publicado por: gAb1 en 12 Noviembre 2015, 06:38 am
Estoy tratando de automatizar el proceso usando un foreach y pasandole una lista de todos los elementos del formulario, pero algunos son array y no estoy seguro si lo estoy haciendo bien. mysqli prepare me esta dando un error ("near col1, col2, etc").

Así es como lo estoy haciendo:

Código
  1. $list = array('use', 'type', 'status', 'bhk', 'baths', 'size', 'location', 'price', 'description');
  2. foreach($list as $name) {
  3.    if ($name != 'description')
  4.        $var = "\$" . $name . "=filter_input(INPUT_POST, '" . $name . "', FILTER_SANITIZE_NUMBER_INT);";
  5.    else if ($name == 'description')
  6.        $var = "\$" . $name . "=filter_input(INPUT_POST, '" . $name . "', FILTER_SANITIZE_STRING);";
  7.    eval($var);  // que nadie use esto lol
  8. }
  9.  
  10. $area_1 = $size['area1'] != '' ? $size['area1'] : 0;
  11. $area_2 = $size['area2'] != '' ? $size['area2'] : 0;
  12. $city   = $location['city'];
  13. $zone   = $location['zone'];
  14. $sale   = $price['sale'] != '' ? $price['sale'] : 0;
  15. $rent   = $price['rent'] != '' ? $price['rent'] : 0;
  16.  

El problema viene cuando le hago un echo a los array, imprime 0 o nada. Y me he asegurado varias veces de rellenar el input...

Creo que el problema está en que no se puede usar filter_input() con arrays, pero no estoy seguro.

Este es el codigo con el que se guardan los datos en la db:

Código
  1. if ($stmt = $mysqli->prepare('INSERT INTO property (use, type, status, bhk, baths, area_1, area_2, city, zone, sale_price, monthly_price, description) VALUES ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?')) {
  2.    $stmt->bind_param('iiiiiiiiiiis', $use, $type, $status, $bhk, $baths, $area1, $area2, $city, $zone, $sale, $rent, $description);
  3.    $stmt->execute();
  4.  
  5.    $id = $mysqli->insert_id;
  6.  
  7.    if ($sale != 0) {
  8.        if ($stmt = $mysqli->prepare('INSERT INTO for_sale VALUES ?')) {
  9.            $stmt->bind_param('i', $id);
  10.            $stmt->execute();
  11.        }
  12.    }
  13.  
  14.    if ($rent != 0) {
  15.        if ($stmt = $mysqli->prepare('INSERT INTO for_rent VALUES ?')) {
  16.            $stmt->bind_param('i', $id);
  17.            $stmt->execute();
  18.        }
  19.    }
  20. } else echo "Statement failed: " . $mysqli->error . "<br>";

Y el error:

Citar
Statement failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'use, type, status, bhk, baths, area_1, area_2, city, zone, sale_price, monthly_p' at line 1

Por ultimo estoy buscando una manera de introducir la id del anuncio en las tablas "for_sale" y "for_rent" dependiendo si se ha introducido un precio en $price['sale'] y $price['rent']. ¿Sabeis alguna manera limpia de hacerlo? ¿O creeis que es mejor crear dos columnas más en la tabla property para indicar si se vende o alquila?

Gracias!


Título: Re: problema para declarar variables de un formulario
Publicado por: MinusFour en 12 Noviembre 2015, 15:51 pm
Código:
use, type, status

Son palabras reservadas de MySQL, necesitas escaparlas con comillas:

Código:
`use`, `type`, `status`

También necesitas paréntesis en VALUES.


Título: Re: problema para declarar variables de un formulario
Publicado por: gAb1 en 12 Noviembre 2015, 16:48 pm
Sigue dando el mismo error, solo que con las comillas que le puse:

Citar
Statement failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"use", "type", "status", bhk, baths, area_1, area_2, city, zone, sale_price, mon' at line 1

Código
  1. prepare('INSERT INTO property ("use", "type", "status", bhk, baths, area_1, area_2, city, zone, sale_price, monthly_price, description) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')



Título: Re: problema para declarar variables de un formulario
Publicado por: MinusFour en 12 Noviembre 2015, 17:17 pm
Sigue dando el mismo error, solo que con las comillas que le puse:

Código
  1. prepare('INSERT INTO property ("use", "type", "status", bhk, baths, area_1, area_2, city, zone, sale_price, monthly_price, description) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')



Es porque necesitas usar la comilla que he puesto o habilitar ANSI_QUOTES... aunque esto vuelve strings con doble comilla identificadores en lugar de strings. La verdad no lo recomiendo, usa los backticks (`).

https://dev.mysql.com/doc/refman/5.6/en/identifiers.html


Título: Re: problema para declarar variables de un formulario
Publicado por: gAb1 en 12 Noviembre 2015, 20:29 pm
Ah cierto!  Gracias.

Lo de declarar las variables y los arrays esta bien asi, no?

Siento haber preguntado eso, era muy facil pero se me olvido poner la opción para filtrar los arrays.

Código
  1.    $list = array('use', 'type', 'status', 'bhk', 'baths', 'size', 'location', 'price', 'description');
  2.    foreach($list as $name) {
  3.        if ( $name != 'description' ) {
  4.            if( is_array( $_POST[$name] ) ) {
  5.                $$name = filter_input( INPUT_POST , $name, FILTER_SANITIZE_NUMBER_INT , FILTER_REQUIRE_ARRAY );
  6.            } else {
  7.                $$name = filter_input( INPUT_POST , $name, FILTER_SANITIZE_NUMBER_INT );
  8.            }
  9.        } else if ( $name == 'description' ) {
  10.            $$name = filter_input( INPUT_POST , $name, FILTER_SANITIZE_STRING );
  11.        }
  12.    }