2015-10-19 2 views
1

Ok. Таким образом, у меня есть форма, которая должна получать информацию о пользователе, в том числе информацию о этнической принадлежности, которая должна храниться в массиве, чтобы допускать множественные выборы, но она также должна быть необязательной, чтобы никто не делал никаких выборовPHP: значение NULL в ARRAY, сохраненное как строка в таблице

вход страница Этническое происхождение (Выберите все, что применимо):

<input type="checkbox" name="ethnicity[]" value="Indian"> American Indian or Alaska Native<br> 
    <input type="checkbox" name="ethnicity[]" value="Asian"> Asian<br> 
    <input type="checkbox" name="ethnicity[]" value="African-American"> Black or African-American<br> 
    <input type="checkbox" name="ethnicity[]" value="Pacific"> Native Hawaiian or other Pacific Islander<br> 
    <input type="checkbox" name="ethnicity[]" value="White"> White<br> 

на моей странице ProcessData все затем хранится в переменных

$email = filter_input (INPUT_POST, 'email'); 
$passwordUser = filter_input (INPUT_POST, 'passwordUser'); 
$phone = filter_input (INPUT_POST, 'phone'); 

$sex = filter_input (INPUT_POST, 'sex'); 
if ($sex == NULL) { 
    $sex = 'unknown'; 
} 

$age = filter_input (INPUT_POST, 'age'); 
$state = filter_input (INPUT_POST, 'state'); 

$ethnicity = filter_input (INPUT_POST, 'ethnicity', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_REQUIRE_ARRAY); 
if ($ethnicity !== NULL) { 

} else { 
    'No answer selected.'; 
} 
include 'insertData.php'; 

и на странице insertData все из информация затем вставляется в таблицы.

include 'database.php'; 

try { 
$query = "INSERT INTO accounts 
      (ageGroup, emailAddress, gender, password, phoneNumber, stateAbbr) 
      VALUES 
      (:ageGroup, :emailAddress, :gender, :passwordUser, :phoneNumber, :stateAbbr)"; 

$statement = $db->prepare($query); 
$statement->bindValue(':ageGroup', $age); 
$statement->bindValue(':emailAddress', $email); 
$statement->bindValue(':gender', $sex); 
$statement->bindValue(':passwordUser', $passwordUser); 
$statement->bindValue(':phoneNumber', $phone); 
$statement->bindValue(':stateAbbr', $state); 
$statement->execute(); 
$statement->closeCursor(); 


foreach ($ethnicity as $result) { 
    $query = "INSERT INTO customerethnicity 
      (emailAddress, ethnicity) 
      VALUES 
      (:emailAddress, :ethnicity)"; 

    $statement = $db->prepare($query); 
    $statement->bindValue(':ethnicity', $result); 
    $statement->bindValue(':emailAddress', $email); 
    $statement-> 
    execute(); 
    $statement->closeCursor(); 
} 
echo "Account created successfully!"; 
    } catch (PDOException $e) { //Catches and handles db errors to prevent site crash 

    $title = 'Error'; 
    $caption = 'System message:'; 
    $message = $e->getMessage() . '<br><br> An error has occurred. Please check the information entered and try again.'; 

    include 'Database_error.php'; 

База данных использует две таблицы, связанные по электронной почте и по электронной почте и этнической вместе создают новые строки в таблице, разработанной специально для этнической принадлежности. Остальная часть информации хранится в другой таблице. Все ПОЧТИ работает. Я могу иметь пол пустым, и он хранит «неизвестный» в таблице, но я не могу оставить этикетные флажки непроверенными и иметь такое же «неизвестное» значение, вставленное в таблицу вместо NULL, не получая это сообщение:

Предупреждение: неверный аргумент поставляются для Еогеасп() в C: \ XAMPP \ HTDOCS \ FormData \ insertData.php на линии 26

Account created successfully! 

это на линии 26: foreach ($ethnicity as $result) {

Счет успешно создан сообщение тестера p, и если я посмотрю в таблице, я вижу, что вся другая введенная информация отображается в таблице учетных записей, но ничего не отображается в таблице customerethnicity. Если я заполню информацию или даже если оставил другие значения пустым и выберет только одну или несколько этнических групп, тогда все будет работать. Проблема в том, что этническая принадлежность не выбрана. Мне нужно показать значение, обозначая, что ничего не выбрано.

+0

Вопрос: Если выбрано только 1 этническая принадлежность: будет ли это еще массив? – Thomas

+0

Если выбрано только 1, оно отображается правильно в таблице customerethnicity с адресом электронной почты и одним из них, которые отображаются в одной строке. Если есть несколько вариантов, то есть несколько строк, которые используют один и тот же адрес электронной почты. Проблема в том, что, если нет выбора, все еще выполняется, но я получаю предупреждающее сообщение, и никакой записи в этой таблице не производится. Другое прекрасно. – Kr4ckl3s

ответ

0

извинения за задержку, но в конечном итоге решение, что я в конечном итоге с помощью был этот :

$ethnicity = filter_input (INPUT_POST, 'ethnicity', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_REQUIRE_ARRAY); 
if ($ethnicity !== NULL) { 


} else { 
    $ethnicity = array('unknown'); 
} 
include 'insertData.php'; 
?> 

Публиковать это в надежде, что это может оказаться полезным для кого-то еще.

0

Есть ли условие в отключенном случае добавьте идентификатор для флажков и иметь что-то вроде этого:
if (document.getElementById('yourCheckBoxID').checked) { alert("checked"); } else { alert("Please check"); }

+0

", но он также должен быть факультативным, так что никто не обязан делать какой-либо выбор" – VolkerK

+0

@VolkerK Хмм, в этом случае я думаю, что ему нужна группа радиолюбителей, а не флажки. –

+0

Использование переключателей, потому что некоторые люди идентифицируют себя с несколькими этническими группами, а для тех, кто хочет идентифицировать его, должен быть вариант. Он предназначен для того, чтобы разрешить выбор этнических групп или один или несколько выбранных. Радио-кнопка не обеспечивает такую ​​гибкость. Вот почему он находится внутри цикла foreach. Чтобы каждый выбор мог отображаться в одном и том же электронном письме пользователя по отдельным строкам, если выбрано более одного. – Kr4ckl3s

0

Вы могли бы просто проверить, является ли «это» $ethnicity массив, прежде чем пытаться повторять его.

if (is_array($ethnicity)) { 
    $query = ' 
     INSERT INTO customerethnicity 
      (emailAddress, ethnicity) 
     VALUES 
      (:emailAddress, :ethnicity) 
    '; 

    $statement = $db->prepare($query); 
    $statement->bindParam(':ethnicity', $result); 
    $statement->bindParam(':emailAddress', $email); 

    foreach ($ethnicity as $result) { 
     $statement->execute(); 
     ... 

sscce:

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false, 
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false, 
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION 
)); 
setup($pdo); // creating temporary tables for the example 

// the array is more or less what you got from your filter_input script 
// doInsert will extract it, so the code in that function looks like your second script 
doInsert($pdo, array(
    'age'=>'21-39', 
    'email'=>'emailA', 
    'sex'=>'m', 
    'passwordUser'=>'1234', 
    'phone'=>'5678', 
    'state'=>'neverneverland', 
    'ethnicity'=>['de','fr','au'] 
)); 

doInsert($pdo, array(
    'age'=>'80+', 
    'email'=>'emailB', 
    'sex'=>'m', 
    'passwordUser'=>'abcd', 
    'phone'=>'9876', 
    'state'=>'midleearth', 
    'ethnicity'=>null 
)); 

// example for querying the data 
// not sure if that's a really good way to do it; but ...just an example ;-) 
showUser($pdo, 'emailA'); 
showUser($pdo, 'emailB'); 

function doInsert($db, $params) { 
    extract($params); 

    try { 
     $db->beginTransaction(); // that should answer your second question, see http://docs.php.net/pdo.transactions 
     $query = " 
      INSERT INTO soFoo 
       (ageGroup, emailAddress, gender, password, phoneNumber, stateAbbr) 
      VALUES 
      (:ageGroup, :emailAddress, :gender, :passwordUser, :phoneNumber, :stateAbbr) 
     "; 
     $statement = $db->prepare($query); 
     $statement->bindValue(':ageGroup', $age); 
     $statement->bindValue(':emailAddress', $email); 
     $statement->bindValue(':gender', $sex); 
     $statement->bindValue(':passwordUser', $passwordUser); 
     $statement->bindValue(':phoneNumber', $phone); 
     $statement->bindValue(':stateAbbr', $state); 
     $statement->execute(); 
     $statement->closeCursor(); 

     if (is_array($ethnicity)) { 
      $query = ' 
       INSERT INTO soBar 
        (emailAddress, ethnicity) 
       VALUES 
        (:emailAddress, :ethnicity) 
      '; 

      $statement = $db->prepare($query); 
      $statement->bindParam(':ethnicity', $result); 
      $statement->bindParam(':emailAddress', $email); 

      foreach ($ethnicity as $result) { 
       $statement->execute(); 
      } 
     } 

     $db->commit(); 
    } 
    catch(Exception $e) { 
     $db->rollBack(); 
     throw $e; 
    } 
} 

function showUser($db, $email) { 
    $statement = $db->prepare(' 
     (
      SELECT 
       ageGroup,gender,stateAbbr 
      FROM 
       soFoo 
      WHERE 
       emailAddress=:e1 
     ) 
     UNION ALL 
     (
      SELECT 
       ethnicity,null,null 
      FROM 
       soBar 
      WHERE 
       emailAddress=:e2 
     ) 
    '); 
    $statement->bindValue(':e1', $email); 
    $statement->bindValue(':e2', $email); 
    $statement->execute(); 

    $user = $statement->fetch(); 
    if (!$user) { 
     echo 'no user with email=', $email, "\r\n"; 
    } 
    else { 
     printf("%s %s %s\r\n", $user['ageGroup'], $user['gender'], $user['stateAbbr']); 
     $eth = $statement->fetch(); 
     if (!$eth) { 
      echo ' unknown ethnicity'; 
     } 
     else { 
      do { 
       echo ' ', $eth['ageGroup'], "\r\n"; 
      } 
      while(($eth=$statement->fetch())); 
     } 
    }  
} 


function setup($pdo) { 
    $pdo->exec(' 
     CREATE TEMPORARY TABLE soFoo (
      id int auto_increment, 
      ageGroup varchar(32), 
      emailAddress varchar(32), 
      gender varchar(32), 
      password varchar(32), 
      phoneNumber varchar(32), 
      stateAbbr varchar(32), 
      primary key(id), 
      unique key(emailAddress) 
     ) 
    '); 

    $pdo->exec(' 
     CREATE TEMPORARY TABLE soBar (
      id int auto_increment, 
      emailAddress varchar(32), 
      ethnicity varchar(32), 
      primary key(id), 
      unique key(emailAddress, ethnicity) 
     ) 
    '); 
} 

печатает

21-39 m neverneverland 
    au 
    de 
    fr 
80+ m midleearth 
    unknown ethnicity 
+0

позволит мне фактически положить строку в таблицу вместо NULL, чтобы запись была прикреплена к письму, чтобы показать, что выбор не был сделан? – Kr4ckl3s

+0

@ VolkerK заявление вставки не должно быть после foreach? – Thomas

+0

Да, когда вы запрашиваете этнические группы, и никакая запись не возвращается, добавьте любую строку, которая вам нравится. Если вы запрашиваете данные из всех таблиц в одном запросе с помощью JOIN, используйте LEFT JOIN и проверьте значение NULL в поле этнической принадлежности. – VolkerK

0

вы можете использовать

if(isset($_POST['ethnicity'])){ 

    foreach ($ethnicity as $result) { 

    .... 
    } 
} 
+1

Немного объяснений было бы хорошо. – MaggsWeb

Смежные вопросы