Обработка данных из нескольких полей выбора - PullRequest
3 голосов
/ 05 ноября 2011

У меня есть поле множественного выбора, сконструированное как показано ниже:

<select name="deductions[]" multiple="multiple">
<option>Option 1</option>
<option>Option 2</option>
<option>.......</option>
</select>

Я хочу получить значения из указанного выше поля выбора в дб с помощью php post. Вот как я это сделал

<?php
$deds=$_POST['deductions'];
$deds_joined=join(',',$deds);
$sql=mysql_query("insert into mytable(deduction) values($deds_joined)");
/*code continues*/

Меня интересует получение значений вычетов в массив и сохранение их в дБ следующим образом: значение1, значение2, значение3.К сожалению, я не смог этого добиться. Вместо этого получается только одно значение предполагаемого массива.Ваша помощь будет высоко оценена. Спасибо.

Ответы [ 3 ]

3 голосов
/ 05 ноября 2011

Я пишу новый ответ здесь, потому что предыдущий ответ по существу неверен.Я оставлю исходный ответ ниже для исторических целей, но не буду его использовать.

Прежде всего:

Пожалуйста, не используйте 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')";
0 голосов
/ 03 января 2017

У меня была такая же проблема, и это помогло мне.собирать данные в форме

<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
    ?>
0 голосов
/ 05 ноября 2011

TRY

<?php
foreach ($_POST['deductions'] as $names)
{
        print "You are selected $names<br/>";
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...