2015-05-31 2 views
1

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

В настоящее время я назначаю десять отдельных переменных для каждого переключателя, но это звучит как кодировка грубой силы. Кто-нибудь имеет более эффективный способ сделать это? Вот мой текущий код ниже.

//these variables hold which radio button the user selected 
$answerChoice1 = $_POST['test1']; //pulls value of radio button named test 1 
$answerChoice2 = $_POST['test2']; 
$answerChoice3 = $_POST['test3']; 
$answerChoice4 = $_POST['test4']; 
$answerChoice5 = $_POST['test5']; 
$answerChoice6 = $_POST['test6']; 
$answerChoice7 = $_POST['test7']; 
$answerChoice8 = $_POST['test8']; 
$answerChoice9 = $_POST['test9']; 
$answerChoice10 = $_POST['test10']; 

$questionID1 = $_POST['theId1']; //pulls the 'bid' of the question asked 
$questionID2 = $_POST['theId2']; 
$questionID3 = $_POST['theId3']; 
$questionID4 = $_POST['theId4']; 
$questionID5 = $_POST['theId5']; 
$questionID6 = $_POST['theId6']; 
$questionID7 = $_POST['theId7']; 
$questionID8 = $_POST['theId8']; 
$questionID9 = $_POST['theId9']; 
$questionID10 = $_POST['theId10']; 

$sqlAnswer1 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID1 . "\" "; //sql statement for selecting the questions that were generated 
$sqlAnswer2 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID2 . "\" "; //on the page 
$sqlAnswer3 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID3 . "\" "; 
$sqlAnswer4 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID4 . "\" "; 
$sqlAnswer5 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID5 . "\" "; 
$sqlAnswer6 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID6 . "\" "; 
$sqlAnswer7 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID7 . "\" "; 
$sqlAnswer8 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID8 . "\" "; 
$sqlAnswer9 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID9 . "\" "; 
$sqlAnswer10 = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID10 . "\" "; 

Посмотрите, как неудобный и уродливый, этот код есть? Также под этими операторами sql у меня есть десять отдельных запросов для каждого оператора. Есть идеи?

+0

HTTP: // PHP.net/manual/en/language.types.array.php –

+0

Кроме того, это подвержено SQL-инъекции. Пожалуйста, подумайте об использовании [PDO и подготовленных заявлений] (http://php.net/manual/en/intro.pdo.php). –

+0

Также попробуйте '' – mplungjan

ответ

2

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

for ($i = 1; $i <= 10; $i++) 
{ 
    $answerChoice = $_POST["test$i"]; 
    $questionID = $_POST["theId$i"]; //pulls the 'bid' of the question asked 

    $sqlAnswer = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID . "\" "; 

    // Execute the other stuff within the loop as well, if it is per question. 
} 

Примечания: Я сфокусировал сниппаю по оптимизации сниппают как есть, потому что это то, что вы просили для, но он все еще уязвим для SQL-инъекции. Если кто-то подделывает запрос, который имеет некоторые странные вещи в $_POST["theId1"], этот материал будет частью вашего SQL-запроса и может повредить вашу базу данных!

О массивах

Нормальный

// You can declare an array like this: 
$answerChoices = array(); 
for ($i = 1; $i <= 10; $i++) 
{ 
    // Using the bracked notation, you can append an item to an array. 
    // You don't even have to specify an index. It will just start at 0. 
    $answerChoices[] = $_POST["test$i"]; 

    // You *can* specify an index, though. Using -1 here to be in sync with the 0-based array above. 
    $questionIDs[$i - 1] = $_POST["theId$i"]; //pulls the 'bid' of the question asked 

    // You don't have to declare the array first. If you just add an item, PHP will 
    // create the array for you. 
    $sqlAnswers[] = "SELECT * FROM `math` WHERE `bid` = \"" . $questionID . "\" "; 
} 

Вы можете цикл через них, как это:

foreach ($sqlAnswers as $i => $sqlAnswer) { 

    echo $sqlAnswer; // This variable is generated in the foreach loop. 

    echo $answerChoices[$i]; // For the other arrays you can use the index. 
} 

Конечно, смешивая, как доступ массивов, как и выше, может быть запутанным. К счастью, вы можете использовать обычный цикл, используя целочисленный индекс, а также:

for ($i = 0; $i < count($answerChoices); $i++) 
{ 
    echo $answerChoices[$i]; 
    echo $sqlAnswers[$i]; 
} 

Уплотненного

Вы можете массивы гнезда тоже. И вы можете использовать строки как индексы. Таким образом, вы можете структурировать свои данные немного лучше, поэтому еще проще использовать его в остальной части вашего кода.

$quizData = array(); 
for ($i = 1; $i <= 10; $i++) 
{ 
    $questionID => $_POST["theId$i"]; 

    // Not the best way, but for now a simple way to make your code a little 
    // safer, if question id is indeed an integer. 
    $questionID = (int)$questionID; 

    // Question, answer and SQL are stored in an array with string keys. 
    // That array is stored in $quizData, so it will be an array of arrays. 
    $quizData[] = array(
    'answerChoice' => $_POST["test$i"], 
    'questionID' => $questionID, 
    'sqlAnswer' => "SELECT * FROM `math` WHERE `bid` = \"" . $questionID . "\" "; 
} 

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

Проверить этот цикл:

print_r($quizData); // Show the whole array in all its glory. ;) 

foreach ($quizData as $questionData) 
{ 
    print_r($questionData); // All data for a single question 

    echo $questionData['questionID']; // Just one property of a question. 
} 

Следующий вариант был бы объекты, но я думаю, что я выдвигаю сферу вопроса. ;)

+0

Вы можете просто выбросить $ i в кавычки? Разве вам не нужно было бы конкатенировать переменную или это не нужно? Кроме того, спасибо за ответ. –

+0

Если вы используете двойные кавычки, PHP будет анализировать переменные внутри них. С одинарными кавычками это не работает. Конкатенация тоже будет работать, используйте для этого оператор '.':' $ _POST ['theId'. $ Я] '. – GolezTrol

+0

Прохладный человек, попробуй попробовать эту петлю. Спасибо, мой код должен выглядеть намного аккуратно. –

1

Если вы хотите больше контролировать переменные, я бы предложил вам поместить ваши POST-вары в массив.

$answerChoice = array($_POST["test1"], $_POST["test2"], etc...) , а затем использовать for loop перебрать массив

for ($i = 1; $i <= 10; $i++){ 
$answerChoice[i] 
//more code 
} 

Это позволяет ориентироваться на определенные варианты ответов с легкостью

+0

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

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