2016-03-06 3 views
1

Я работаю над проектом, который берет 4 поля от пользователя для фильтрации запроса, поступающего из базы данных mysql.Каков наилучший способ фильтрации запроса с использованием пользовательских входов

Пользователь вводит диапазон дат, поиск имени и/или результат игры. Запрос может работать, пока все поля не заполняются и должны работать, когда заполняются все поля.

Мне нужно написать программу, которая делает все это, но единственный способ, которым я могу это сделать, - написать кучу операторов if, чтобы узнать, заполнил ли пользователь или не заполнил каждый элемент отдельной формы. Должен быть лучший, более эффективный способ сделать это.

<form method="post" action="extra.php"> 
Date Range From: 
<input type="text" id="dateFrom" name="dateFrom" value=""/> 
To: 
<input type="text" id="dateTo" name="dateTo" value=""/> 
<br/> 
Name Search: 
<input type="text" id="nameSearch" name="nameSearch" value=""/> 
<br/> 
Game Result: 
<select name="gameResult"> 
    <option value="any">Any</option> 
    <option value="p1">Player 1</option> 
    <option value="p2">Player 2</option> 
    <option value="draw">Draw</option> 
</select> 
<input type="submit" id="submit"> 
</form> 




<?php 
include('../inclass/db_connect.php'); 

if(isset($_POST['dateFrom']) && ($_POST['dateTo']) && ($_POST['nameSearch']) && ($_POST['gameResult'])){ 
    $dateFrom = $_POST['dateFrom']; 
    $dateTo = $_POST['dateTo']; 
    $nameSearch = $_POST['nameSearch']; 
    $gameResult = $_POST['gameResult']; 

    $result =$pdo->prepare("SELECT matchDate, player1, player2, result, eco FROM matches WHERE (matchDate BETWEEN '$dateFrom' AND '$dateTo') AND (player1 LIKE '$nameSearch%') OR (player2 LIKE '$nameSearch%') AND (result ='1') ORDER BY matchDate desc LIMIT 250"); 

    $result->execute(); 

     ?> 
<table border="1"> 
    <tr> 
     <th>Match Date</th> 
     <th>Player 1</th> 
     <th>Player 2</th> 
     <th>Result</th> 
     <th>ECO Code</th> 
     <th>Match Details</th> 
    </tr> 
<?php 
for($i=0; $row = $result->fetch(); $i++){ 
    ?> 
    <tr> 
     <td><?php echo $row['matchDate']; ?></td> 
     <td><?php echo $row['player1']; ?></td> 
     <td><?php echo $row['player2']; ?></td> 
     <td><?php echo $row['result']; ?></td> 
     <td><?php echo $row['eco']; ?></td> 
     <td><a href="details.php" id=".$row['id'].">Details</a></td> 
    </tr> 

<?php 
} 
?> 
</table> 
<?php 
} 

http://cps276.net/zgambrell/04/extra.php

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

+0

Нет, нет другого способа, просто 'if's –

+0

, поэтому мне нужно написать заявление индивидуума if (isset) для каждого отдельного результата, который может произойти? – Zgbrell

+0

Есть ли способ, которым я могу поместить свою таблицу в функцию или класс, а затем, когда мне нужно, чтобы она была опубликована, вместо повторной записи всей таблицы снова и снова, я могу просто вызвать вызов функции, поэтому у меня есть только написать код для таблицы вовремя? – Zgbrell

ответ

0

Итак, вы хотите разрешить заполнение хотя бы одного из полей?

Один из способов, которым я мог подумать, - поместить все значения в ассоциативный массив и пройти через него и проверить, было ли поле пустым или нет.

Пример:

// put all of the values into an array 
$searchForm = [ 
    'dateFrom' = $_POST['dateFrom'], 
    'dateTo' = $_POST['dateTo'], 
    'nameSearc' = $_POST['nameSearch'], 
    'gameResult' = $_POST['gameResult'], 
]; 

// loop through the array and see if the fields are not empty 
foreach($searchForm as $inputField) { 
    // if the fieldsa re not empty 
    if(!empty($inputField)) 
    { 
     // put them into a new array 
     $searchValues = $inputField 
    } 
} 
// check the number of elements of the array 
if(count($searchValues) === 0) { 
    // return back to the page and show an error that at least one field is required. 
} 

// execute the query here 

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

Я понятия не имею, будет ли это работать, но это должно дать вам представление о том, что вы можете сделать, чтобы сократить инструкции if (isset()).

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