0

Tengo el siguiente error:

Fatal error: Uncaught Error: Call to undefined function mysql_query()

Línea 37:

$sql = mysql_query("INSERT INTO cabanasaccesorios VALUES (".$idcabana.", ".$value.")");

Explicación:

Tengo un formulario donde quiero guardar los checkboxs seleccionados en una tabla de una base de datos en MySQL.

Código PHP:

$con = mysqli_connect("localhost", "root", "root", "osmarrural");
        if (mysqli_connect_errno()){
            echo "Error en la conexión a MySQL: " .mysqli_connect_error();
        }
        mysqli_query($con, "INSERT INTO cabanas (nombre, capacidad, descripcion, precio) VALUES ('".$nombre."', ".$capacidad.", '".$descripcion."', ".$precio.")");

        //Autogeneramos el siguiente ID a la anterior consulta/registro.
        $idcabana = mysqli_insert_id($con);

        //Guardamos los checkboxs seleccionados.
        if($_POST["accesorios"] != ""){
            if(is_array($_POST["accesorios"])){
                //Realizamos la búsqueda/ciclo.
                while(list($key, $value) = each ($_POST["accesorios"])){
                    $sql = mysql_query("INSERT INTO cabanasaccesorios VALUES (".$idcabana.", ".$value.")");
                }
            }
        }

Código HTML:

       <b>Accesorios:</b><br/>
            <label for="secador">Secador:</label>
            <input type="checkbox" id="secador" name="accesorios[]" value="1" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <label for="calefaccion">Calefaccion: </label>
            <input type="checkbox" id="calefaccion" name="accesorios[]" value="2" />
            <br/><br/>
            <label for="jacuzzi">Jacuzzi: </label>
            <input type="checkbox" id="jacuzzi" name="accesorios[]" value="3" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <label for="tv">TV: </label>
            <input type="checkbox" id="tv" name="accesorios[]" value="4" />
            <br/><br/>
            <label for="internet">Internet: </label>
            <input type="checkbox" id="internet" name="accesorios[]" value="5" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <label for="microondas">Microondas: </label>
            <input type="checkbox" id="microondas" name="accesorios[]" value="6" />

Aunque me de el error anterior, ¿es buen código el utilizado para almacenar los accesorios o es incorrecto?

Añado imagen de la bbdd para que podáis ver las tablas: introducir la descripción de la imagen aquí

omaza1990
  • 2,722
  • 32
  • 82
  • 143
  • 1
    Debiera ser `mysqli_query` en vez de `mysql_query`, si estás usando PHP 7 la extensión `mysql` ya no existe – ffflabs Dec 11 '17 at 11:53
  • @amenadiel indicó el motivo del error. Para responder a esta parte de tu pregunta: *... ¿es buen código el utilizado para almacenar los accesorios o es incorrecto?* La respuesta es **No, no es buen código**. Es código vulnerable que pone en riesgo no solamente los datos, sino que [podría permitir que intrusos entren en tu sistema a través de una consulta SQL](https://es.stackoverflow.com/q/108520/29967). Las consultas que pasan valores desde el exterior a la base de datos son extremadamente peligrosas. Deberías dar seguridad a tu código implementando consultas preparadas. – A. Cedano Dec 11 '17 at 14:37
  • @amenadiel Pon tu respuesta como "Respuesta" así puedo votarla y cerrar la pregunta. Tu aclaración de mysqli_query me lo solucionó. – omaza1990 Dec 11 '17 at 20:53

1 Answers1

1

Debiera ser mysqli_query en vez de mysql_query, si estás usando PHP 7 la extensión mysql ya no existe

Donde dice:

while(list($key, $value) = each ($_POST["accesorios"])){
    $sql = mysql_query("INSERT INTO cabanasaccesorios VALUES (".$idcabana.", ".$value.")");
}

debe decir

while(list($key, $value) = each ($_POST["accesorios"])){
    $sql = mysqli_query("INSERT INTO cabanasaccesorios VALUES (".$idcabana.", ".$value.")");
}

Y te sugiero usar sentencias preparadas. Eso de interpolar las variables directamente te deja expuesto a una inyección SQL

Ejemplo con sentencia preparada:

En vez de

$sql = mysqli_query("INSERT INTO cabanasaccesorios VALUES (".$idcabana.", ".$value.")");

puedes usar (suponiendo que $idcabana y $value son integers).

$stmt = $con->prepare("INSERT INTO cabanasaccesorios VALUES (?,?);");
$stmt->bind_param('ii', $idcabana, $value);
$stmt->execute();

Al usar bind_param, el primer parámetro especifica el tipo de variables que quieres bindear (en este caso ii es "integer integer").

ffflabs
  • 21,223
  • 25
  • 48