Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Manipulando dados de vários campos de seleção


Em primeiro lugar:

Tornou-se mais importante do que nunca que você siga este conselho, ext/MySQL agora está obsoleto e usá-lo emitirá E_DEPRECATED erros começando com o PHP 5.5, um dia ele será completamente removido da linguagem principal. Dito isto, o seguinte se aplica a todos os drivers para todos os bancos de dados.

Para o resto desta explicação, assumirei que você não pode usar MySQLi ou PDO por algum motivo (observe que o somente razão satisfatória aqui é que eles não estão disponíveis, "eu não sei como usá-los" não é uma desculpa) e que você é forçado a usar ext/MySQL. Se você puder usar qualquer um dos drivers mais recentes, poderá usar instruções preparadas e nada disso se aplica. Então, pensando nisso...

Em seguida, vamos dar uma olhada no que está errado com a resposta anterior. Isso se concentra em escapar da entrada do usuário. Ele usa mysql_real_escape_string() é uma maneira que realmente não faz o menor sentido. Isso deve ser usado para escapar de uma única string literal e absolutamente nada mais. Ele não pode ser usado para escape de números de forma eficaz e não pode ser usado para partes de SQL com escape que não são apenas valores.

Os dois trechos de código a seguir mostram a maneira correta de fazer isso, dependendo de quais são os dados e, principalmente, de seu tipo.

Aqui está o que faríamos se os valores fossem strings (geralmente um CHAR ou 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)";

Mas muitas vezes neste cenário, os valores seriam simplesmente números e, neste caso, tudo o que precisamos fazer é garantir que o PHP os represente com o tipo de dados correto, pois eles estarão automaticamente seguros quando forem convertidos novamente em strings para serem usado na consulta:
// 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)";

Este código obviamente assume que os dados são do tipo inteiro, floats podem ser facilmente manipulados simplesmente alterando o (int) converter para (float) .

Também vale a pena notar que a abordagem de string pode ser usada com segurança e sucesso também para valores numéricos, porque o MySQL também converterá os valores para o tipo correto. Mas, em geral, é melhor e mais eficiente passar os dados com a representação de tipo correta dentro da consulta.