2012-01-30 2 views
0

Я генерируя неизвестное количество флажков в моей форме, используя MySQL, это число всегда будет меняться,Обработка неизвестное количество флажков

$frinfoq = mysql_query($frinfo) or die (mysql_error()); 
    while($frow = mysql_fetch_assoc($frinfoq)) { 
     $username = $frow['username']; 
     $ct = $frow['country']; 
     $fruuid = $frow['uid']; 
     ?> 
    <tr><td><p><?php echo $username; ?></p></td><td><p><?php echo $ct; ?></p></td><td><form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" id="delf"><input type="hidden" value="<?php echo $fruuid; ?>" /><input type="checkbox" name="add[]" value="<?php echo $fruuid; ?>" id="a_t_game" /><form></td></tr> 


    <?php 
    } 
    ?> 

Когда форма передается и обрабатывается «create.php «он должен добавить только проверенных пользователей в таблицу mysql, строку для пользователя, я определяю (я не уверен, что это работает из-за проблемы, с которой я собираюсь добраться), которые проверяются следующим образом:

if($_POST['add'] == true) { 
    $user_uid = $_POST['add']; 
    } 

Затем я пытаюсь добавить строки следующим образом:

$arr = array($user_uid); 
foreach($arr as $user_uid) { 
$game = "INSERT INTO wd_game (game_uid,user_uid,lastmove,startcountry) VALUES ('$gid','$user_uid',now(),'none')"; 
$gameq = mysql_query($game) or die (mysql_error()); 
} 

Все входные данные прекрасно изолированы от пользовательского uid, который задан как «Массив». Он также создает только одну строку, и мне нужна строка для каждого пользователя.

Я знаю, что это проблема с обработкой моего массива, это довольно очевидно, но у меня нет самой туманной идеи о том, как ее исправить. Любая помощь/указатели будет большой помощью!

+1

Y U НЕТ ИСПОЛЬЗОВАТЬ ЛИНИИ ПЕРЕРЫВЫ ?! Пришлось писать. Серьезно, однако, нет ничего плохого в том, чтобы сломать ваши строки на несколько строк. –

+0

Пожалуйста, не используйте «== true» в операторах if. Они на 100% избыточны. –

+0

Вы знаете, что [отмеченные флажки не будут определены в данных POST/GET] (http://stackoverflow.com/questions/2520952/how-come-checkbox-state-is-not-always-passed-along- к PHP-скрипт)? –

ответ

0

$arr = array($user_uid); - ваша проблема. Попробуйте просто $arr = $user_uid;, или даже вырежьте посредника и просто используйте $arr = $_POST["add"];.


EDIT

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

Другое дело, что вам следует избегать любых данных, поступающих в базу данных, которые могут быть получены с пользовательского ввода (например, $ _POST). Вы должны использовать mysql_real_escape_string.

Третье, что форма с действием, указывающим на $_SERVER["PHP_SELF"], небезопасна. Он уязвим для межсайтового скриптинга (XSS). См. this blog для более подробного описания уязвимости.

Я предлагаю вам сделать что-то больше, как это:

<?php 

if ($_POST["add"]) 
{ 
    $arr = $_POST["add"]; 

    foreach ((array)$arr as $user_uid) 
    { 
     $game = "INSERT INTO wd_game (game_uid,user_uid,lastmove,startcountry) VALUES ('". mysql_real_escape_string($gid) ."','". mysql_real_escape_string($user_uid) ."', now(), 'none')"; 
     $gameq = mysql_query($game) or die (mysql_error()); 
    } 
} 

$frinfoq = mysql_query($frinfo) or die (mysql_error()); 

while($frow = mysql_fetch_assoc($frinfoq)) 
{ 
    $username = $frow['username']; 
    $ct = $frow['country']; 
    $fruuid = $frow['uid']; 
    echo " <tr> 
     <td> 
      <p>{$username}</p> 
     </td> 
     <td> 
      <p>{$ct}</p> 
     </td> 
     <td> 
      <form method=\"post\" action=\"". htmlentities($_SERVER['PHP_SELF']) ."\" id=\"delf\"> 
       <input type=\"hidden\" value=\"{$fruuid}\" /> 
       <input type=\"checkbox\" name=\"add[]\" value=\"{$fruuid}\" id=\"a_t_game\" /> 
      <form> 
     </td> 
    </tr>\n"; 
    } 
?> 
+0

Хорошо, что вы исправили этот код для меня, часть самого сервера, это еще одна форма, ее не должно было быть - удалили, теперь все работает, спасибо за советы, а также высоко ценим! – AviateX14

0

Ваша проблема здесь:

$arr = array($user_uid); 

в $ user_uid уже массив в $ _POST; добавление его в массив снова сделает его двумерным.

Попробуйте это.

if($_POST['add'] == true) { 
    $user_uid = $_POST['add']; 
} 
foreach($user_uid as $userId) { .... 
+0

Это вызывает ошибку: Недопустимый аргумент, предоставленный foreach() – AviateX14

0

Кажется, что $ user_uid уже массив, и вы обернув его в массиве (опять же), в результате многомерного массива. Рассмотрим тестирование $ user_uid, чтобы увидеть, если это массив:

if(!is_array($user_uid)) { 
    $arr = array($user_uid); 
} else { 
    $arr = $user_uid; 
} 

Тогда, я считаю, что ваш код будет делать то, что вы ожидаете.

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