Mysql
 sql >> Database >  >> RDS >> Mysql

Gestione dei dati da più campi di selezione

Innanzitutto:

È diventato più importante che mai seguire questo consiglio, ext/MySQL è stato ora deprecato e il suo utilizzo emetterà E_DEPRECATED errori che iniziano con PHP 5.5, un giorno verrà completamente rimosso dal linguaggio principale. Detto questo, quanto segue si applica a tutti i driver per tutti i database.

Per il resto di questa spiegazione presumo che tu non sia in grado di utilizzare MySQLi o PDO per qualche motivo (nota che solo motivo soddisfacente qui è che non sono disponibili, "non so come usarli" non è una scusa) e che sei costretto a usare ext/MySQL. Se sei in grado di utilizzare uno dei driver più recenti, puoi utilizzare le istruzioni preparate e nulla di tutto ciò si applica. Quindi, con questo in mente...

Quindi diamo un'occhiata a cosa c'è che non va nella risposta precedente. Questo è incentrato sull'escape dell'input dell'utente. Usa mysql_real_escape_string() è un modo che davvero non ha alcun senso. Questo dovrebbe essere usato per sfuggire a una singola stringa letterale e assolutamente nient'altro, mai. Non può essere utilizzato per eseguire l'escape di numeri in modo efficace e non può essere utilizzato per eseguire l'escape di parti di SQL che non sono solo valori.

I seguenti due frammenti di codice mostrano il modo corretto per farlo, a seconda dei dati e, soprattutto, del loro tipo.

Ecco cosa faremmo se i valori fossero stringhe (di solito 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)";

Ma spesso in questo scenario, i valori sarebbero semplicemente numeri, e in questo caso tutto ciò che dobbiamo fare è assicurarci che PHP li rappresenti con il tipo di dati corretto, poiché saranno automaticamente al sicuro quando verranno riconvertiti in stringhe per essere utilizzato nella query:

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

Questo codice ovviamente presuppone che i dati siano di tipo intero, i float possono essere gestiti facilmente semplicemente cambiando il (int) trasmettere a (float) .

Vale anche la pena notare che l'approccio stringa può essere utilizzato in modo sicuro e con successo anche per valori numerici, poiché MySQL convertirà anche i valori nel tipo corretto. Ma in generale è meglio e più efficiente passare i dati con la rappresentazione del tipo corretta all'interno della query.