[Resuelto] problema para declarar variables de un formulario

Iniciado por gAb1, 12 Noviembre 2015, 06:38 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

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 (php) [Seleccionar]
$list = array('use', 'type', 'status', 'bhk', 'baths', 'size', 'location', 'price', 'description');
foreach($list as $name) {
   if ($name != 'description')
       $var = "\$" . $name . "=filter_input(INPUT_POST, '" . $name . "', FILTER_SANITIZE_NUMBER_INT);";
   else if ($name == 'description')
       $var = "\$" . $name . "=filter_input(INPUT_POST, '" . $name . "', FILTER_SANITIZE_STRING);";
   eval($var);  // que nadie use esto lol
}

$area_1 = $size['area1'] != '' ? $size['area1'] : 0;
$area_2 = $size['area2'] != '' ? $size['area2'] : 0;
$city   = $location['city'];
$zone   = $location['zone'];
$sale   = $price['sale'] != '' ? $price['sale'] : 0;
$rent   = $price['rent'] != '' ? $price['rent'] : 0;


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 (php) [Seleccionar]
if ($stmt = $mysqli->prepare('INSERT INTO property (use, type, status, bhk, baths, area_1, area_2, city, zone, sale_price, monthly_price, description) VALUES ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?')) {
   $stmt->bind_param('iiiiiiiiiiis', $use, $type, $status, $bhk, $baths, $area1, $area2, $city, $zone, $sale, $rent, $description);
   $stmt->execute();

   $id = $mysqli->insert_id;

   if ($sale != 0) {
       if ($stmt = $mysqli->prepare('INSERT INTO for_sale VALUES ?')) {
           $stmt->bind_param('i', $id);
           $stmt->execute();
       }
   }

   if ($rent != 0) {
       if ($stmt = $mysqli->prepare('INSERT INTO for_rent VALUES ?')) {
           $stmt->bind_param('i', $id);
           $stmt->execute();
       }
   }
} else echo "Statement failed: " . $mysqli->error . "<br>";


Y el error:

CitarStatement 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!

MinusFour


use, type, status


Son palabras reservadas de MySQL, necesitas escaparlas con comillas:


`use`, `type`, `status`


También necesitas paréntesis en VALUES.

gAb1

Sigue dando el mismo error, solo que con las comillas que le puse:

CitarStatement 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 (php) [Seleccionar]
prepare('INSERT INTO property ("use", "type", "status", bhk, baths, area_1, area_2, city, zone, sale_price, monthly_price, description) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')


MinusFour

Cita de: gAb1 en 12 Noviembre 2015, 16:48 PM
Sigue dando el mismo error, solo que con las comillas que le puse:

Código (php) [Seleccionar]
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

gAb1

#4
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 (php) [Seleccionar]
    $list = array('use', 'type', 'status', 'bhk', 'baths', 'size', 'location', 'price', 'description');
    foreach($list as $name) {
        if ( $name != 'description' ) {
            if( is_array( $_POST[$name] ) ) {
                $$name = filter_input( INPUT_POST , $name, FILTER_SANITIZE_NUMBER_INT , FILTER_REQUIRE_ARRAY );
            } else {
                $$name = filter_input( INPUT_POST , $name, FILTER_SANITIZE_NUMBER_INT );
            }
        } else if ( $name == 'description' ) {
            $$name = filter_input( INPUT_POST , $name, FILTER_SANITIZE_STRING );
        }
    }