Я пишу новый ответ здесь, потому что предыдущий ответ по существу неверен.Я оставлю исходный ответ ниже для исторических целей, но не буду его использовать.
Прежде всего:
Пожалуйста, не используйте mysql_*
функции в новом коде .Они больше не поддерживаются и официально устарели .Смотрите красное поле ?Узнайте вместо этого подготовленных операторов и используйте PDO или MySQLi - , эта статья поможет вам решить, какие,Если вы выберете PDO, вот хороший урок .
Следование этому совету стало как никогда важным, 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)";
Этот код, очевидно, предполагает, что данные имеют целочисленный тип, с плавающей запятой можно легко работать, просто изменив приведение (int)
к (float)
.
Стоит также отметитьчто строковый подход можно безопасно и успешно использовать и для числовых значений, поскольку MySQL также преобразует значения в правильный тип.Но в целом лучше и эффективнее передавать данные с правильным представлением типа в запросе.
Предыдущий ответ для исторической справки
Iдумаю, что проблема в вашем запросе, и вы должны сделать это вместо этого:
$deds = $_POST['deductions'];
$deds_joined = mysql_real_escape_string(join('),(',$deds));
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";
$sql = mysql_query($query);
Таким образом, конечный запрос будет выглядеть так:
INSERT INTO mytable (deduction) VALUES (1), (2), (3)
Вместо
INSERT INTO mytable (deduction) VALUES (1,2,3)
Первый пример - правильный синтаксис для вставки нескольких строк, как вы, похоже, пытаетесь сделать, поскольку вы указываете только одно имя столбца.В качестве альтернативы, если вы пытаетесь вставить значения в виде строки, разделенной запятой, вы должны сделать это:
$deds_joined = mysql_real_escape_string(join(',',$deds));
$query = "INSERT INTO mytable (deduction) VALUES ('$deds_joined')";