Mysql
 sql >> база данни >  >> RDS >> Mysql

Обработка на данни от поле за множествен избор

Първо и най-важно:

Стана по-важно от всякога да следвате този съвет, ext/MySQL вече е остарял и използването му ще излъчва E_DEPRECATED грешки, започващи с PHP 5.5, един ден ще бъде напълно премахнат от основния език. Като каза това, следното се отнася за всички драйвери за всички бази данни.

За останалата част от това обяснение ще предполагам, че не можете да използвате MySQLi или PDO по някаква причина (обърнете внимание, че само задоволителна причина тук е, че те не са налични, "не знам как да ги използвам" не е извинение) и че сте принудени да използвате ext/MySQL. Ако можете да използвате някой от по-новите драйвери, тогава можете да използвате подготвени оператори и нищо от това не се прилага. И така, имайки това предвид...

След това нека да разгледаме какво не е наред с предишния отговор. Това се съсредоточава около избягването на въвеждането на потребителя. Той използва mysql_real_escape_string() е начин, който наистина няма никакъв смисъл. Това трябва да се използва за избягване на единичен низов литерал и абсолютно нищо друго, никога. Не може да се използва за ефективно избягване на числа и не може да се използва за екраниране на части от SQL, които не са само стойности.

Следните два кодови фрагмента показват правилния начин да направите това, в зависимост от това какви са данните и най-важното от техния тип.

Ето какво бихме направили, ако стойностите са низове (обикновено CHAR или VARCHAR поле):

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

Но често в този сценарий стойностите биха били просто числа и в този случай всичко, което трябва да направим, е да се уверим, че PHP ги представя с правилния тип данни, тъй като те ще бъдат автоматично безопасни, когато бъдат преобразувани обратно в низове, за да бъдат използвано в заявката:

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

Този код очевидно предполага, че данните са от целочислен тип, floats могат лесно да се обработват чрез просто промяна на (int) прехвърляне към (float) .

Също така си струва да се отбележи, че низовият подход може безопасно и успешно да се използва и за числови стойности, тъй като MySQL също ще преобразува стойностите в правилния тип. Но като цяло е по-добре и по-ефективно данните да се предават с правилното представяне на типа в заявката.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:SQL грешка:1140, SQLState:42000

  2. Как да използвам подготвен израз за заявка за избор в Java?

  3. Използване на Java за установяване на сигурна връзка с MySQL Amazon RDS (SSL/TLS)

  4. Не може да се спре MySQL на OS X 10.10

  5. Грешка:Съществува пространство за таблици за таблица xxx. Моля, ИЗХВЪРЛЕТЕ пространството за таблици преди ИМПОРТ