Først og fremmest:
Det er blevet vigtigere end nogensinde før, at du følger dette råd, ext/MySQL er nu blevet forældet, og brugen af det vil udsende E_DEPRECATED
fejl, der begynder med PHP 5.5, vil det en dag blive fuldstændig fjernet fra kernesproget. Når det er sagt, gælder følgende for alle drivere til alle databaser.
For resten af denne forklaring vil jeg antage, at du ikke er i stand til at bruge MySQLi eller PDO af en eller anden grund (bemærk, at den eneste tilfredsstillende grund her er, at de ikke er tilgængelige, "jeg ved ikke, hvordan man bruger dem" er ikke en undskyldning), og at du er tvunget til at bruge ext/MySQL. Hvis du er i stand til at bruge en af de nyere drivere, så kan du bruge forberedte udsagn, og intet af dette gælder. Så med det i tankerne...
Lad os derefter tage et kig på, hvad der er galt med det forrige svar. Dette centrerer sig om at undslippe brugerinput. Den bruger mysql_real_escape_string()
er en måde, der virkelig ikke giver nogen som helst mening. Dette skal bruges til at undslippe en enkelt streng bogstaveligt, og absolut intet andet, nogensinde. Det kan ikke bruges til effektivt at escapede tal, og det kan ikke bruges til escapede dele af SQL, som ikke kun er værdier.
De følgende to kodestykker viser den korrekte måde at gøre dette på, afhængigt af, hvad dataene er og, altafgørende, dens type.
Her er, hvad vi ville gøre, hvis værdierne er strenge (normalt en CHAR
eller VARCHAR
felt):
// 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)";
Men ofte i dette scenarie vil værdierne simpelthen være tal, og i dette tilfælde er alt, hvad vi skal gøre, at sikre, at PHP repræsenterer dem med den korrekte datatype, da de automatisk vil være sikre, når de konverteres tilbage til strenge for at blive brugt i forespørgslen:
// 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)";
Denne kode forudsætter naturligvis, at dataene er af en heltalstype, floats kan nemt håndteres ved blot at ændre (int)
cast til (float)
.
Det er også værd at bemærke, at strengtilgangen også sikkert og med succes kan bruges til numeriske værdier, fordi MySQL også konverterer værdierne til den korrekte type. Men generelt er det bedre og mere effektivt at videregive dataene med den korrekte typerepræsentation i forespørgslen.