Обработка данных из нескольких полей выбора

У меня есть поле с несколькими полями, как показано ниже:

<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/>"; } ?>