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.