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:
$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:
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!
use, type, status
Son palabras reservadas de MySQL, necesitas escaparlas con comillas:
`use`, `type`, `status`
También necesitas paréntesis en VALUES.
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
prepare('INSERT INTO property ("use", "type", "status", bhk, baths, area_1, area_2, city, zone, sale_price, monthly_price, description) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')
Cita de: gAb1 en 12 Noviembre 2015, 16:48 PM
Sigue dando el mismo error, solo que con las comillas que le puse:
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
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.
$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 );
}
}