Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Umgang mit Daten aus Mehrfachauswahlfeldern

In erster Linie:

Es ist wichtiger denn je geworden, dass Sie diesem Rat folgen, ext/MySQL ist jetzt veraltet und seine Verwendung wird E_DEPRECATED ausgeben Fehler, die mit PHP 5.5 beginnen, wird es eines Tages vollständig aus der Kernsprache entfernt. Das Folgende gilt jedoch für alle Treiber für alle Datenbanken.

Für den Rest dieser Erklärung gehe ich davon aus, dass Sie MySQLi oder PDO aus irgendeinem Grund nicht verwenden können (beachten Sie, dass die nur ein befriedigender Grund dafür ist, dass sie nicht verfügbar sind, "Ich weiß nicht, wie ich sie benutzen soll" ist keine Entschuldigung) und dass Sie gezwungen sind, ext/MySQL zu verwenden. Wenn Sie einen der neueren Treiber verwenden können, können Sie vorbereitete Anweisungen verwenden, und nichts davon trifft zu. Also, in diesem Sinne...

Schauen wir uns als Nächstes an, was an der vorherigen Antwort falsch ist. Dies konzentriert sich darauf, Benutzereingaben zu umgehen. Es verwendet mysql_real_escape_string() ist ein Weg, der wirklich keinen Sinn macht. Dies sollte verwendet werden, um ein einzelnes Zeichenfolgenliteral zu maskieren, und absolut nichts anderes. Es kann nicht verwendet werden, um Zahlen effektiv zu maskieren, und es kann nicht verwendet werden, um Teile von SQL zu maskieren, die nicht nur Werte sind.

Die folgenden zwei Code-Snippets zeigen den richtigen Weg, dies zu tun, abhängig davon, um was für Daten es sich handelt und, was entscheidend ist, ihren Typ.

Folgendes würden wir tun, wenn die Werte Zeichenfolgen sind (normalerweise ein CHAR oder VARCHAR Feld):

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

Aber in diesem Szenario wären die Werte oft einfach Zahlen, und in diesem Fall müssen wir nur sicherstellen, dass PHP sie mit dem richtigen Datentyp darstellt, da sie automatisch sicher sind, wenn sie wieder in Zeichenfolgen umgewandelt werden in der Abfrage verwendet:

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

Dieser Code geht offensichtlich davon aus, dass die Daten vom Typ Integer sind, Gleitkommazahlen können leicht gehandhabt werden, indem einfach der (int) geändert wird in (float) umwandeln .

Es ist auch erwähnenswert, dass der String-Ansatz auch sicher und erfolgreich für numerische Werte verwendet werden kann, da MySQL die Werte auch in den richtigen Typ konvertiert. Aber im Allgemeinen ist es besser und effizienter, die Daten mit der richtigen Typdarstellung innerhalb der Abfrage zu übergeben.