sql >> Database >  >> RDS >> Mysql

Omgaan met gegevens uit veld met meerdere selecties

Eerst en vooral:

Het is belangrijker dan ooit geworden dat u dit advies opvolgt, ext/MySQL is nu verouderd en het gebruik ervan zal E_DEPRECATED uitstralen. fouten die beginnen met PHP 5.5, zal het op een dag volledig uit de kerntaal worden verwijderd. Dat gezegd hebbende, geldt het volgende voor alle stuurprogramma's voor alle databases.

Voor de rest van deze uitleg ga ik ervan uit dat u om de een of andere reden MySQLi of PDO niet kunt gebruiken (merk op dat de alleen bevredigende reden hier is dat ze niet beschikbaar zijn, "Ik weet niet hoe ik ze moet gebruiken" is geen excuus) en dat je gedwongen bent om ext/MySQL te gebruiken. Als u een van de nieuwere stuurprogramma's kunt gebruiken, kunt u voorbereide instructies gebruiken en dit is allemaal niet van toepassing. Dus met dat in gedachten...

Laten we vervolgens eens kijken wat er mis is met het vorige antwoord. Dit draait om het ontsnappen aan gebruikersinvoer. Het gebruikt mysql_real_escape_string() is een manier die echt nergens op slaat. Dit zou moeten worden gebruikt om te ontsnappen aan een enkele tekenreeks letterlijk, en absoluut niets anders, ooit. Het kan niet worden gebruikt om effectief te ontsnappen aan getallen, en het kan niet worden gebruikt om delen van SQL te escapen die niet alleen waarden zijn.

De volgende twee codefragmenten tonen de juiste manier om dit te doen, afhankelijk van wat de gegevens zijn en, cruciaal, het type ervan.

Dit is wat we zouden doen als de waarden strings zijn (meestal een CHAR of VARCHAR veld):

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

Maar vaak zijn de waarden in dit scenario gewoon getallen, en in dit geval hoeven we er alleen maar voor te zorgen dat PHP ze vertegenwoordigt met het juiste gegevenstype, omdat ze automatisch veilig zijn wanneer ze terug worden geconverteerd naar strings die moeten worden gebruikt in de zoekopdracht:

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

Deze code gaat er uiteraard van uit dat de gegevens van het type integer zijn, floats kunnen eenvoudig worden afgehandeld door simpelweg de (int) te wijzigen casten naar (float) .

Het is ook vermeldenswaard dat de tekenreeksbenadering ook veilig en met succes kan worden gebruikt voor numerieke waarden, omdat MySQL de waarden ook naar het juiste type zal converteren. Maar over het algemeen is het beter en efficiënter om de gegevens door te geven met de juiste typeweergave binnen de query.



  1. Hernoem een ​​primaire sleutel in SQL Server (T-SQL)

  2. php eenmaal uitvoeren en tweemaal invoegen in mysql-database

  3. Wat is het verschil tussen utf8mb4- en utf8-tekensets in MySQL?

  4. PHP:afbeelding ophalen uit MySQL met PDO