У меня есть поле с несколькими полями, как показано ниже:
<select name="deductions[]" multiple="multiple"> <option>Option 1</option> <option>Option 2</option> <option>.......</option> </select>
Я хочу получить значения из вышеуказанного поля select в db, используя php post.Это так я сделал это
<?php $deds=$_POST['deductions']; $deds_joined=join(',',$deds); $sql=mysql_query("insert into mytable(deduction) values($deds_joined)"); /*code continues*/
Я заинтересован в том, чтобы получить значения дедукции в массив и сохранить его в db таким образом: value1, value2, value3. К сожалению, я не смог этого добиться. Вместо этого получается только одно значение предполагаемого массива. Ваша помощь будет высоко оценена. Спасибо.
Я пишу здесь новый ответ, потому что предыдущий ответ по сути ошибочен. Я оставлю исходный ответ ниже для исторических целей, но не использую его.
Прежде всего:
Пожалуйста, не используйте функции
mysql_*
в новом коде . Они больше не поддерживаются и официально устарели . См. Красную рамку ? Узнайте о подготовленных инструкциях и используйте PDO или MySQLi – эта статья поможет вам решить, какой из них. Если вы выберете PDO, вот хороший учебник .
Стало более важным, чем когда-либо, следовать этому совету, ext / mysql теперь устарел, и с его помощью будут E_DEPRECATED
ошибки 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)
cast to (float)
.
Также стоит отметить, что строковый подход можно безопасно и успешно использовать для числовых значений, так как MySQL также преобразует значения в правильный тип. Но в целом лучше и эффективнее передавать данные с правильным представлением типа в запросе.
Предыдущий ответ для справки
Я думаю, проблема связана с вашим запросом, и вы должны делать это вместо этого:
$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')";
У меня была та же проблема, и это помогло мне. собирать данные в форме
<form action="page.php" method="post"> <select name="requests[]" multiple="multiple=" class="selectpicker"> <option value="one">one</option> <option value="two">two</option> <option value="three">three</option> <option value="four">four</option> <option value="five">five</option> <option value="six">six</option> </select> <input type="submit" value="submit" /> </form>
используя это как ваш page.php
<?php $contents = ob_get_contents(); //used this this to generate a variable that can be posted ?> <?php ob_start(); ?> <?php $requests=$_POST['requests']; if ($requests){ foreach ($requests as $request){echo $request,','."";} } ?> <?php $contents = ob_get_contents();//a variable that was generated ?> <?php $h =$contents; // just renaming $sql = "INSERT INTO mytable (requests) VALUES (:h)";//dont forget to connect to you database $q = $db->prepare($sql); $q->execute(array(':h'=>$h)); header("location: mypage.php?"); //redirect to a page after posting into mytable ?>
ПЫТАТЬСЯ
<?php foreach ($_POST['deductions'] as $names) { print "You are selected $names<br/>"; } ?>