PHP: сохранение нескольких значений флажков в SQL

Я пытаюсь создать форму, которая записывает несколько значений флажков в одну запись SQL. У меня пока есть код, но я понятия не имею, что я делаю неправильно.

Вот что у меня есть: (моя таблица с флажками)

<table> 
  <tr>
    <td><input id="vlaams-brabant" type="checkbox" name="Regio[]" value="Vlaams-Brabant"/> Vlaams-Brabant</td>
    <td><input id="waals-brabant" type="checkbox" name="Regio[]" value="Waals-Brabant"/> Waals-Brabant </td>
  </tr>
  <tr>    
    <td><input id="oost-vlaanderen" type="checkbox" name="Regio[]" value="Oost-Vlaanderen"/> Oost-Vlaanderen </td>
    <td><input id="west-vlaanderen" type="checkbox" name="Regio[]" value="West-Vlaanderen"/> West-Vlaanderen </td>
  </tr>
  <tr>
    <td><input id="Limburg" type="checkbox" name="Regio[]" value="Limburg"/> Limburg </td>
    <td><input id="Antwerpen" type="checkbox" name="Regio[]" value="Antwerpen"/> Antwerpen</td>
  </tr>
  <tr>
    <td><input id="Luik" type="checkbox" name="Regio[]" value="Luik"/> Luik </td>
    <td><input id="Henegouwen" type="checkbox" name="Regio[]" value="Henegouwen"/> Henegouwen </td>
  </tr>
  <tr>
    <td><input id="Luxemburg" type="checkbox" name="Regio[]" value="Luxemburg"/> Luxemburg </td>
    <td><input id="Namen" type="checkbox" name="Regio[]" value="Namen"/> Namen </td>
  </tr>
  <tr>
    <td><input id="België" type="checkbox" name="Regio[]" value="Heel België"/> Heel België </td>
    <td><input id="Internationaal" type="checkbox" name="Regio[]" value="Internationaal"/> Internationaal </td>
  </tr>
  <tr>
    <td><input id="Brussel" type="checkbox" name="Regio[]" value="Brussel Hoofdstedelijk Gewest"/> Brussel Hoofdstedelijk Gewest </td>
  </tr>
</table>

Вот мой PHP-код (имейте в виду, что это всего лишь часть более крупного кода, у меня уже есть другие текстовые поля и т. д.):

$adds['nameCom'] = $conn->real_escape_string($_POST['nameCom']);
    $adds['name'] = $conn->real_escape_string($_POST['name']);
    $adds['number'] = $conn->real_escape_string($_POST['number']);
    $adds['email'] = $conn->real_escape_string($_POST['email']);
    $adds['activiteit'] = $conn->real_escape_string($_POST['activiteit']);
    $adds['Regio'] = $conn->real_escape_string($_POST['Regio']);

    // query voor INSERT INTO
    $sql = "INSERT INTO `data` (`nameCom`, `name`, `number`, `email`, `activiteit`, `Regio`) 
    VALUES ('". $adds['nameCom']. "', '". $adds['name']. "', '". $adds['number']. "', '". $adds['email']. "', '". $adds['activiteit']. "', '" . implode(',', $adds['Regio']) ."')"; 

    // Performs the $sql query on the server to insert the values
    if ($conn->query($sql) === TRUE) {
      echo 'Uw gegevens werden opgeslagen, bedankt!';

Implode выдает следующую ошибку: Предупреждение: implode() [function.implode]: Неверные аргументы переданы в C:\xamplite\htdocs\LPtest\insert.php в строке 38

ЕСЛИ КТО-ТО МОЖЕТ ПОМОЧЬ МНЕ В ТО, ЧТО Я ДЕЛАЮ ЗДЕСЬ НЕПРАВИЛЬНО, ЭТО БУДЕТ БОЛЬШОЕ ПРИЗНАТЕЛЬНО! Заранее спасибо!


person CodeSigns    schedule 27.03.2013    source источник
comment
каков результат real_escape_string над массивом Regio? Я думаю, что он определен только для строк.... и возвращает строку, которая не является массивом, который можно взорвать...   -  person V-X    schedule 27.03.2013
comment
Какой код в строке 38?   -  person bestprogrammerintheworld    schedule 27.03.2013


Ответы (3)


Как следует из названия функции, real_escape_string работает только со строками. Поэтому вы должны вызывать эту функцию для каждого значения массива $_POST['Regio']:

$Regio = array();
$adds['Regio'] = "";

if(count($_POST['Regio']) > 0) {
  foreach($_POST['Regio'] as $key=>$value)
    $Regio[] = $conn->real_escape_string($value);
}

$adds['Regio'] = implode(',', $Regio);

Это должно работать.

person Mihai Matei    schedule 27.03.2013
comment
лучшая практика - $adds['Regio']=array(); перед циклом - person Waygood; 27.03.2013
comment
+1 Вы также можете сделать это в одну строку $adds['Regio'] =$conn->real_escape_string(implode(',', $_POST['Regio'])); НО ваш код показывает задействованную обработку - person Waygood; 27.03.2013
comment
Однако я понимаю, к чему вы клоните: каким должен быть мой код в операторе вставки, если я использую код Матея Михая? $sql = "INSERT INTO data` (nameCom, name, number, email, activiteit, Regio) ЗНАЧЕНИЯ ('. $adds['nameCom']. ', '. $adds['name']. ', '. $adds['number'] . ', '. $adds['email']. ', '. $adds['activiteit']. ', '. $my_implode['Regio'] .'); ` Вот так? - person CodeSigns; 27.03.2013
comment
Если вы используете именно мой код... вам нужно добавить только $adds['Regio'] в оператор вставки - person Mihai Matei; 27.03.2013
comment
я все еще получаю сообщение об ошибке в вашем операторе foreach: Предупреждение: указан недопустимый аргумент для foreach() в C:\xampplite\htdocs\LPtest\insert.php в строке 37, тем не менее, я ценю вашу помощь , я на несколько шагов дальше в своей миссии! - person CodeSigns; 27.03.2013
comment
Это потому, что вы не установили ни одного флажка. Чтобы предотвратить это, вы должны проверить, содержит ли ваш массив какое-либо значение. Смотрите мой новый отредактированный ответ! - person Mihai Matei; 27.03.2013
comment
Это не так, я уже редактировал код с функцией подсчета. такая же ошибка все еще возникает. Я попросил внешней помощи, и я собираюсь решить свою проблему с помощью раскрывающихся списков, но я благодарю вас за ваше время, вы были очень полезны, спасибо! - person CodeSigns; 27.03.2013

$_POST['regio'] — это многомерный массив. Вы должны использовать foreach, чтобы получить из него отдельные значения.

person CaptainCarl    schedule 27.03.2013

Вы должны использовать foreach..

HTML-код:

<input id="id1" type="checkbox" name="Regio[id1]"/>
<input id="id2" type="checkbox" name="Regio[id2]"/>
<input id="id3" type="checkbox" name="Regio[id3]"/>

PHP-код:

$chkBoxes = $_POST['Regio'];
foreach ($chkBoxes as $key => $val) {
     // you code here
}
person mehdi    schedule 27.03.2013