2015-10-25 4 views
1

Мне интересно, есть ли у кого-то запасные глаза на мгновение или два. Проблема, которую я вижу, лежит на моих иссетах. Он игнорирует первый исходный isset ($ lastName) и, кажется, всегда выбирает isset ($ title). Также я должен упомянуть, что значения отправляются из HTML-формы в ssearch с фамилией или заголовком в БД.HTML-значения формы представляют PHP и запрос

Мой вопрос: может ли кто-нибудь помочь с логической проблемой или есть другой способ сделать это? Я знаю его склонность к SQL-инъекции, но он находится в локальной базе данных, и я буду внимательно изучать это в ближайшее время. Если кто-то может делать предложения, мне определенно интересно их услышать.

В соответствии с предложением HTML-формы.

<form name="lookup" method="post" action="searchEmployeeList.php" autocomplete="off"> 
<fieldset> 
    <p>Conduct a search</p> 
    <table width="600"> 
     <tr> 
      <td width="150">Surname:</td> 
      <td> 
       <input type="text" name="lastName" value="" maxlength="25" placeholder="Employees surname"> 
      </td> 
     </tr> 
     <tr> 
      <td width="150">Title:</td> 
      <td> 
       <input type="text" name="title" value="" maxlength="25" placeholder="Job role"> 
      </td> 
     </tr> 
     <tr> 
      <td></td> 
      <!--Blank row--> 
      <td> 
       <input type="submit" name="submit" value="Search now"> 

       <input type="submit" name="show_all" value="Show all"> 
      </td> 
     </tr> 
    </table> 
</fieldset> 
</form> 

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

include 'DBConDetails.php'; 

if (isset($lastName)) { 

    $sql = "SELECT * FROM employee_data Where last_name = '".$_POST['lastName']. 
    "'"; 
} 
if (isset($_POST['title'])) { 

    $sql = "SELECT * FROM employee_data Where title = '".$_POST['title']. 
    "'"; 
} 

$result = mysqli_query($con, $sql); 

if ($result - > num_rows > 0) { 

    echo "<table id = 'searchResults'> <tr> 
     <td> ID < /td> <td> Name < /td> <td> Age < /td><td>Title</td > <td> Years of Service < /td> <td> Salary < /td> < /tr>"; 

    //multiple echos plainly for readability 
    while ($row = $result - > fetch_assoc()) { 
     echo '<tr>'; 
     echo '<td>' . $row["employee_id"] . '</td>'; 
     echo '<td>' . $row["first_name"] . ' ' . $row["last_name"] . '</td>'; 
     echo '<td>' . $row["age"] . '</td>'; 
     echo '<td>' . $row["title"] . '</td>'; 
     echo '<td>' . $row["yos"] . '</td>'; 
     echo '<td>' . $row["salary"] . '</td>'; 
     echo '</tr>'; 

    } 
} else { 

    echo "I'm afraid we could not find any matches, try editing your criteria."; 
} 
echo "</table>"; 


} 

Если кто-то сталкивались с подобной проблемой в будущем, вопрос лежит на оба, если утверждения истинности, которые приводят как к выполнению и последней перезаписи первого if() заявления. Должно заметить, что!

+0

предложение? конечно; разместите свою HTML-форму, чтобы оставить догадки из нее –

+0

Если вы введете LastName и Title, он всегда будет делать второй 'IF', который перезапишет первый !!! – RiggsFolly

+0

@Bastiaan Ваше предлагаемое редактирование http://stackoverflow.com/review/spected-edits/9976787 ** хуже! ** - * sigh. * –

ответ

0

Во-первых, вы переписав первого запроса/условного оператора.

То, что вы говорите, это «», если это установлено, сделайте это. Если это установлено, сделайте это ».

Что я чувствую, что вы , вероятно,, чтобы посмотреть, установлены ли оба эти параметра, передавая эти переменные в ваш запрос за один раз.

Такие, как и с помощью !empty() вместо isset():

if (!empty($_POST['lastName']) && !empty($_POST['title'])) { 

    $lastName = $_POST['lastName']; 
    $title = $_POST['title']; 

    $sql = "SELECT * FROM employee_data 
      Where last_name = '" . $lastName . "' 
      AND title = '" . $title . "'"; 
} 

Если цель здесь, чтобы проверить один ИЛИ другой (который выглядит так), вы можете изменить приведенный выше код и с помощью OR оператора:

if (!empty($lastName) || !empty($title)) { 

    $lastName = $_POST['lastName']; 
    $title = $_POST['title']; 

    $sql = "SELECT * FROM employee_data 
      Where last_name = '" . $lastName . "' 
      OR title = '" . $title . "'"; 
} 

и избавлении от:

if (isset($title)) { 

    $sql = "SELECT * FROM employee_data Where title = '" . $title . "'"; 
} 

Sidenote: Оператор OR - || также может использоваться в условном выражении PHP. && - AND; выберите тот, который подходит для того, чего вы хотите достичь.

Если мое высказывание выдает вам ошибку из-за того, что MySQL жалуется, например, апострофы, вам нужно будет избежать ваших данных с помощью mysqli_real_escape_string().

Sidenote: Если вы собираетесь использовать вышеприведенное, сначала убедитесь, что вы подключены к базе данных и поместили include 'DBConDetails.php'; в качестве своей первой строки над чем-либо. Обычно это хорошо, когда нужно подключиться.

Плюс, ваш код подвержен SQL-инъекции. Используйте подготовленное заявление:

Плюс, нет открытия PHP тега перед тем if (isset($_POST['lastName'])) { заявления; если это ваш фактический код.

Это следует читать как

<?php 
    if (isset($_POST['lastName'])) { 
... 

Сноски:

DBConDetails.php неизвестно, какие MySQL API вы используете. Вам нужно использовать тот же API из подключения к запросам. Различные API MySQL не смешиваются.

Проверка на наличие ошибок против вашего запроса также:


Если вы хотите, чтобы отделить действия ваших кнопок отправки

<input type="submit" name="submit" value="Search now"> 
<input type="submit" name="show_all" value="Show all"> 

Вам нужно будет использовать отдельные условные операторы и использовать атрибут связанного имени.

I.e.:

if (isset($_POST['submit'])) { 
// do something, as in include other conditionals, code etc. 
} 

и

if (isset($_POST['show_all'])) { 
// do something, as in include other conditionals, code etc. 
} 
+0

ушли, чтобы приготовить/поужинать. Ping me later –

+1

Это решило проблему, в то время как я не использовал! Empty(), это дало мне возможность редактировать инструкции isset() и sql, которые дали мне результаты, которые я хотел. Я смотрел, чтобы проверить один или другой, так что вы были правы в том, чтобы прикрывать это предположение. У меня есть условные утверждения, основанные на атрибутах форм. Также закрывающий PHP-тег был включен чуть ниже в код, я прошу прощения за это. Спасибо миллион за дополнительный материал, как всегда. – morrisstu

+0

@morrisstu Рад это услышать. * Приветствия * –

1

Я думаю, что нужно проверять:

isset($_POST['lastName']); 

вместо

isset($lastName); 

Поскольку последний был бы установлен, но быть равно некоторому неопределенное значение (может быть пустой строкой?). То же самое относится к вашей переменной заголовка.

0

Во-первых, я думаю, что это лучше, чтобы проверить на if ($_SERVER['REQUEST_METHOD'] == 'POST')

См: $_POST vs. $_SERVER['REQUEST_METHOD'] == 'POST'

После этого, вы можете проверить $_POST переменные с isset и, возможно, это может быть полезно, чтобы проверить переменные с strlen слишком , Когда вы используете strlen, с trim вы можете удалить ненужные пробелы.

Пример:

<?php 
if($_SERVER['REQUEST_METHOD'] == "POST") { 

    if(isset($_POST['lastName']) && strlen(trim($_POST['lastName'])) > 0) { 
     // Do some action 
    } 
} 
?> 
Смежные вопросы