sql >> Base de Datos >  >> RDS >> Mysql

Manejo de datos de campo de selección múltiple

En primer lugar:

Se ha vuelto más importante que nunca que siga este consejo, ext/MySQL ahora está obsoleto y su uso emitirá E_DEPRECATED errores que comienzan con PHP 5.5, algún día se eliminará por completo del lenguaje central. Dicho esto, lo siguiente se aplica a todos los controladores para todas las bases de datos.

Para el resto de esta explicación, asumiré que no puede usar MySQLi o PDO por alguna razón (tenga en cuenta que solo una razón satisfactoria aquí es que no están disponibles, "No sé cómo usarlos" no es una excusa) y que está obligado a usar ext/MySQL. Si puede usar cualquiera de los controladores más nuevos, entonces puede usar declaraciones preparadas, y nada de esto se aplica. Entonces, con eso en mente...

A continuación, echemos un vistazo a lo que está mal con la respuesta anterior. Esto se centra en escapar de la entrada del usuario. Utiliza mysql_real_escape_string() es una manera que realmente no tiene sentido alguno. Esto debe usarse para escapar de un literal de una sola cadena, y absolutamente nada más, nunca. No se puede usar para escapar números de manera efectiva, y no se puede usar para escapar partes de SQL que no son solo valores.

Los siguientes dos fragmentos de código muestran la forma correcta de hacer esto, según los datos y, lo que es más importante, su tipo.

Esto es lo que haríamos si los valores son cadenas (generalmente un CHAR o VARCHAR campo):

// First create an array of individually escaped values with quotes added
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = "'".mysql_real_escape_string($ded)."'";
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

Pero, a menudo, en este escenario, los valores serían simplemente números y, en este caso, todo lo que debemos hacer es asegurarnos de que PHP los represente con el tipo de datos correcto, ya que serán automáticamente seguros cuando se vuelvan a convertir en cadenas para ser utilizado en la consulta:

// First convert the array values to integers
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = (int) $ded;
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

Este código obviamente asume que los datos son de tipo entero, los flotantes se pueden manejar fácilmente simplemente cambiando el (int) convertir a (float) .

También vale la pena señalar que el enfoque de cadena también se puede usar de manera segura y exitosa para valores numéricos, porque MySQL también convertirá los valores al tipo correcto. Pero, en general, es mejor y más eficiente pasar los datos con la representación de tipo correcta dentro de la consulta.