2014-01-20 5 views
0

У меня есть следующий код:PHP - Извлечение переменных данных из формы

<form class="form-inline" role="form" method="post"> 
    <div class="table-responsive"> 
     <table> 
      <tr class="tr_top"> 
       <!-- <th class="th_left_top">Message:</th> --> 
       <td class="td_top"> 
        <textarea class="form-control" rows="3" name="msg" placeholder="<?php if (isset($_POST['encode'])) { echo htmlspecialchars($_POST['msg']);} else { echo " Your message here. ";} ?>" onfocus='this.select()'></textarea> 
       </td> 
      </tr> 
      <tr class="tr_mid"> 
       <!-- <th class="th_left_mid">Shift Parameter:</th> --> 
       <td class="td_mid"> 
        <input type=text class="form-control input_mid" name="offset" placeholder="<?php if (isset($_POST['encode'])) { echo htmlspecialchars($_POST['offset']);} else { echo " Enter a number. ";} ?>"> 
       </td> 
      </tr> 
      <tr class="tr_bottom"> 
       <!-- <th class="th_bottom empty"></th> --> 
       <td class="td_bottom"> 
        <input class="input_bottom btn btn-default" type="submit" name="encode" value="Encode"> 
        <input class="input_bottom btn btn-default" type="submit" name="decode" value="Decode"> 
        <input class="input_bottom btn btn-default" type=button value='Clear' onclick='this.form.elements.msg.value=""' </td> 
      </tr> 
     </table> 
    </div> 
    <!-- close table-responsive --> 
</form> 

<p>Original message: 

       <?php 

       $string = $_POST['msg']; 
       echo "<p class='string ital'>" . $string . "</p>"; 
       $newstring = $string; 

       $sp = $_POST['offset']; 
       //$offset = $sp % 26; 

       //$encode = $_POST['encode']; 
       $decode = $encode - $offset; 

       //echo "<p>sp = " . $sp . "</p>"; 
       //echo "<p>offset = " . $offset . "</p>"; 
       //echo "<p>decode = " . $decode . "</p>"; 

       for ($i=0; $i < strlen($string); $i++) { 
        $ascii = ord($string[$i]); 
        for ($j=0; $j < $sp; $j++) { 
         if ($ascii == 90) { //uppercase bound 
          $ascii = 65; //reset back to 'A' 
          } 
         else if ($ascii == 122) { //lowercase bound 
          $ascii = 97; //reset back to 'a' 
          } 
         else { 
          $ascii++; 
         } 
        } 
        $newstring[$i] = chr($ascii); 

       } 
       echo "<p>Encoded message:</p>"; 

       if (isset($_POST['encode'])) { 
        echo "<p class='string ital'>" . $newstring . "</p>"; 
       } elseif (isset($_POST['decode'])) { 
        echo "<p class='string ital'>" . $decode . "</p>"; 
       } else { 
        //echo "<p class='string ital'></p>"; 
        //echo "<p class='string ital'></p>"; 
       }    

       ?> 

То, что я ищу, чтобы сделать это пользователь вводит сообщение и номер в текстовом поле и вводе. Затем выполняется код, который сдвигает значения каждой буквы в строке. Я пытаюсь заставить заполнитель textarea печатать закодированное сообщение вместо заполнителя при нажатии «encode». Для ввода, я этого достиг с этим кодом:

заполнителя = «»

Для текстового поля, я пытаюсь получить переменный $ NewString для печати в качестве заполнителя. У меня есть:

заполнитель = ""

Я хочу $ _POST [ 'сбщ'], чтобы быть $ _POST [$ NewString], но это не будет работать.

Любые мысли о том, как это сделать?

+0

@ ZombieBunnies, да, точно. – winthropite

ответ

0

Я написал возможное решение для вашей проблемы - ознакомьтесь с кодом ниже. Вы можете найти рабочую копию этого кода на http://www.floris.us/SO/codeForm.php

Ключ к решению вашей конкретной проблемы находится прямо у основания; Я использую

<script type="text/javascript"> 
document.forms['codeForm'].codeMsg.value = <?php echo '"'.$newString.'"'; ?>; 
document.forms['codeForm'].msg.value = <?php echo '"'.$string.'"'; ?>; 
</script>  

принять значение переменной php и поместить его в область ввода формы.

<html> 
<form class="form-inline" name="codeForm" role="form" method="post"> 
    <div class="table-responsive"> 
     <table> 
      <tr class="tr_top"> 
       <!-- <th class="th_left_top">Message:</th> --> 
       <td class="td_top"> 
        Plain text message<br> 
        <textarea class="form-control" rows="3" name="msg" 
         <?php 
         if (isset($_POST['encode'])) { 
         echo 'value = "'.htmlspecialchars($_POST['msg']).'"'; 
         } 
         else { 
         echo 'placeholder = "Your message here"'; 
         } 
         ?> 
         onfocus='this.select()'> 
         </textarea> 
       </td> 
       <td class="td_top"> 
        Coded message<br> 
        <textarea class="form-control" rows="3" name="codeMsg" 
        <?php 
        if (isset($_POST['decode'])) { 
         echo "value=".htmlspecialchars($_POST['codeMsg']); 
        } 
        else { 
         echo 'placeholder = "Encoded message here. "'; 
        } 
        ?> 
        onfocus='this.select()'> 
        </textarea> 
        </td> 
      </tr> 
      <tr class="tr_mid"> 
       <td class="td_mid"> 
        <input type=text class="form-control input_mid" name="offset" 
        <?php 
        if (isset($_POST['encode'])) { 
         echo 'value = "'.htmlspecialchars($_POST['offset']).'"'; 
        } 
        else { 
         echo 'placeholder = "Enter a number:"'; 
        } 
        ?> 
        > 
       </td> 
      </tr> 
      <tr class="tr_bottom"> 
       <!-- <th class="th_bottom empty"></th> --> 
       <td class="td_bottom"> 
        <input class="input_bottom btn btn-default" type="submit" name="encode" value="Encode"> 
        <input class="input_bottom btn btn-default" type="submit" name="decode" value="Decode"> 
        <input class="input_bottom btn btn-default" type=button value='Clear' onclick='this.form.elements.msg.value=""' </td> 
      </tr> 
     </table> 
    </div> 
    <!-- close table-responsive --> 
</form> 

<?php 
    $string = defaultKey($_POST, 'msg', ''); 
    $offset = defaultKey($_POST, 'offset', 0); 
    $newString = defaultKey($_POST, 'codeMsg', ''); 
    if(isset($_POST['encode'])) { 
    $newString = caesar($string, $offset); 
    } 
    if(isset($_POST['decode'])) { 
    $string = caesar($newString, -$offset); 
    } 


function caesar($input, $offset) { 
    $output = array(); 
    foreach(str_split($input) as $k=>$i) { 
    if (ctype_alpha($i)) { 
     $oldChar = strtoupper($i); 
     $newChar = chr(((ord($oldChar) - ord('A')) + $offset) % 26 + ord('A')); 
     if($i!=strtoupper($i)) { $newChar = strtolower($newChar); } 
    } 
    else { 
     $newChar = $i; 
    } // don't do anything with punctuation 
    $output[$k]=$newChar; 
    } 
    $output = implode($output); 
    return $output; 
} 

function defaultKey($arr, $key, $default) { 
    if(isset($arr[$key])) { 
    return $arr[$key]; 
    } 
    return $default; 
} 

?> 
<script type="text/javascript"> 
document.forms['codeForm'].codeMsg.value = <?php echo '"'.$newString.'"'; ?>; 
document.forms['codeForm'].msg.value = <?php echo '"'.$string.'"'; ?>; 
</script>  
</html> 
0

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

enter image description here

Проблема заключается в том, что вам действительно нужно, чтобы убедиться, что «закодированы» строка не содержит каких-либо непечатаемые символы. Кажется, что вы внедряете Caesar cypher - чтобы сделать это эффективно, я бы использовал modulo арифметику (вы использовали операцию modulo по смещению в вашем коде, а затем прокомментировали ее). Таким образом

$oldChar = strtoupper($input); 
$newChar = (($oldChar - ord('A')) + $offset) % 26 + ord('A'); 

Если вы хотите, вы можете добавить строку

if($input!=strtoupper($input)) $newChar = strtolower($newChar); 

(функция, насколько я знаю, PHP не имеет встроенный "ISUPPER()" ...)

Примечание. Это разрушает все знаки пунктуации и т. Д. Если вы не начинаете с проверки того, что у вас есть действительный символ, вы можете ввести все виды странных символов (в приведенном ниже примере пространство стало запятой ...). Как бы то ни было, если ваш исходный код имел значение ascii 123 в нем, вы были бы тосты.

+0

На данный момент я в порядке с непечатаемыми символами. Я могу это исправить. Я действительно ищу, что на POST для заполнителя будет закодированная строка. При этом я ценю ваш код; это пригодится. – winthropite

+0

Итак, есть ли у кого-нибудь идеи? – winthropite

+0

@winthropite - Чтобы перефразировать ваш вопрос: вы хотите сделать запрос POST, используя содержимое переменной php в качестве содержимого POST (а не содержимого формы). Правильно ли я это понял? Как вы хотите вызвать этот запрос - одним нажатием кнопки? Вы можете подумать о том, чтобы перефразировать ваш вопрос (или даже попросить новый), чтобы вы не отвлекали людей от деталей, которые не имеют значения для проблемы, которую вы действительно хотите решить. Даже тогда, чего вы пытаетесь достичь? Очиститель («более чистый») ваш вопрос, тем легче дать хороший ответ ... – Floris

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