sql >> Databasteknik >  >> RDS >> Mysql

Hantera data från flervalsfält

Först och främst:

Det har blivit viktigare än någonsin att du följer detta råd, ext/MySQL har nu fasats ut och att använda det kommer att avge E_DEPRECATED fel som börjar med PHP 5.5, kommer det en dag att tas bort helt från huvudspråket. Med det sagt gäller följande för alla drivrutiner för alla databaser.

För resten av denna förklaring kommer jag att anta att du inte kan använda MySQLi eller PDO av någon anledning (observera att den enda tillfredsställande anledning här är att de inte är tillgängliga, "Jag vet inte hur man använder dem" är ingen ursäkt) och att du tvingas använda ext/MySQL. Om du kan använda någon av de nyare drivrutinerna kan du använda förberedda satser, och inget av detta gäller. Så med det i åtanke...

Låt oss sedan ta en titt på vad som är fel med det föregående svaret. Detta handlar om att undvika användarinmatning. Den använder mysql_real_escape_string() är ett sätt som egentligen inte är meningsfullt. Detta bör användas för att undkomma en enda sträng bokstavligen, och absolut inget annat, någonsin. Det kan inte användas för att effektivt escape-nummer, och det kan inte användas för escape-de delar av SQL som inte bara är värden.

Följande två kodavsnitt visar det korrekta sättet att göra detta, beroende på vilken data det är och, framför allt, dess typ.

Så här skulle vi göra om värdena är strängar (vanligtvis en CHAR eller VARCHAR fältet):

// 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 ofta i det här scenariot skulle värdena helt enkelt vara siffror, och i det här fallet behöver vi bara se till att PHP representerar dem med rätt datatyp, eftersom de automatiskt blir säkra när de konverteras tillbaka till strängar för att vara används i frågan:

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

Denna kod förutsätter uppenbarligen att data är av heltalstyp, flöten kan enkelt hanteras genom att helt enkelt ändra (int) kasta till (float) .

Det är också värt att notera att strängmetoden kan användas säkert och framgångsrikt även för numeriska värden, eftersom MySQL också konverterar värdena till rätt typ. Men i allmänhet är det bättre och mer effektivt att skicka in data med rätt typrepresentation i frågan.



  1. Hur räknar man antalet förekomster av en viss delsträng i en SQL-varchar?

  2. Använda Substr med Instr för att extrahera en sträng i Oracle

  3. Vad är meningen med SELECT ... FOR XML PATH(' '),1,1)?

  4. LISTAGG() Funktion i Oracle