Mysql
 sql >> Base de données >  >> RDS >> Mysql

Gestion des données à partir de plusieurs champs de sélection

Avant tout :

Il est devenu plus important que jamais que vous suiviez ce conseil, ext/MySQL est désormais obsolète et son utilisation émettra E_DEPRECATED erreurs à partir de PHP 5.5, il sera un jour complètement supprimé du langage de base. Cela dit, ce qui suit s'applique à tous les pilotes pour toutes les bases de données.

Pour le reste de cette explication, je supposerai que vous ne pouvez pas utiliser MySQLi ou PDO pour une raison quelconque (notez que le seulement une raison satisfaisante ici est qu'ils ne sont pas disponibles, "je ne sais pas comment les utiliser" n'est pas une excuse) et que vous êtes obligé d'utiliser ext/MySQL. Si vous pouvez utiliser l'un des pilotes les plus récents, vous pouvez utiliser des instructions préparées, et rien de tout cela ne s'applique. Donc, avec cela à l'esprit...

Voyons ensuite ce qui ne va pas avec la réponse précédente. Cela se concentre sur l'échappement de l'entrée de l'utilisateur. Il utilise mysql_real_escape_string() est une manière qui n'a vraiment aucun sens. Cela devrait être utilisé pour échapper un seul littéral de chaîne, et absolument rien d'autre, jamais. Il ne peut pas être utilisé pour échapper efficacement des nombres, et il ne peut pas être utilisé pour échapper des parties de SQL qui ne sont pas seulement des valeurs.

Les deux extraits de code suivants montrent la bonne façon de procéder, en fonction de la nature des données et, surtout, de leur type.

Voici ce que nous ferions si les valeurs étaient des chaînes (généralement un CHAR ou VARCHAR champ):

// 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)";

Mais souvent, dans ce scénario, les valeurs seraient simplement des nombres, et dans ce cas, tout ce que nous devons faire est de nous assurer que PHP les représente avec le bon type de données, car elles seront automatiquement sécurisées lorsqu'elles seront reconverties en chaînes pour être utilisé dans la requête :

// 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)";

Ce code suppose évidemment que les données sont de type entier, les flottants peuvent facilement être manipulés en changeant simplement le (int) convertir en (float) .

Il convient également de noter que l'approche par chaîne peut également être utilisée avec succès et en toute sécurité pour les valeurs numériques, car MySQL convertira également les valeurs dans le type correct. Mais en général, il est préférable et plus efficace de transmettre les données avec la représentation de type correcte dans la requête.