2017-02-22 4 views
0

Я пытаюсь создать простую панель поиска, которая позволяет пользователю выполнять поиск с использованием идентификатора пользователя для возврата определенного пользователя.Создание запроса панели поиска базы данных

Мне нужно включить защиту от SQL-инъекций.

В настоящее время страница загружает пустой экран, но когда я обновляю страницу, я получаю ответ «Нет результатов».

Любая помощь приветствуется. Я читал много сообщений о барах поиска, но мне ничего не помогает.

вот код:

<html> 
<head> 
<title></title> 
</head> 
<body> 
<form action="search.php" method="POST"> 
    <input type="text" name="search" /> 
    <input type="submit" value="Search" /> 
</form> 
</body> 



<?php 
//search.php 
    include("DbConnect.php"); 

    $search = $_POST['search']; 

    $safesearch = mysqli_real_escape_string($search); 

    $Query = "SELECT user_id 
      FROM users 
      WHERE user_id = '$safesearch'"; 

    $Result = mysqli_query($DB,$Query);  

    $NumResults = mysqli_num_rows($Result); 

    if ($NumResults==1) 
    {  
     echo "<h1>results: ".$Result."</h1>"; 
    }else{ 
     echo "<h1>No Results found</h1>"; 
    } 
?> 
+1

ваше смешивание MySQL и MySQLi – nogad

+0

Спараметрировать запрос. – chris85

+0

sortwd проблема sql-sqli, и это не исправило проблему. –

ответ

0

Вы должны иметь при (Исеть ($ _ POST [ «отправить»] {} вокруг вашего кода, так что срабатывает только если они ищут и не тогда, когда страница загружается .

Если вы делаете какой-либо вставки, выберите или обновление с SQL заявления, которые будут иметь переменные в них вы должны использовать подготовленные заявления.

используйте подготовленное заявление, что это намного более безопасным, чем вы» re делаю:

<?php 
//search.php 
    include("DbConnect.php"); 

    $search = $_POST['search']; 

    $safesearch = mysql_real_escape_string($search); 

    $Query = "SELECT user_id 
      FROM users 
      WHERE user_id = ?"; 

    $stmt = $connectionVariableName->prepare($query); 
    $stmt->bind_param("s",$safesearch); 
    $stmt->execute(); 
    $stmt->bind_result($result); 
    $stmt->fetch(); 
    $num_rows = $stmt->num_rows; 
    $stmt->close(); 

    if ($num_rows > 0) 
    {  
     echo "<h1>results: ".$result."</h1>"; 
    }else{ 
     echo "<h1>No Results found</h1>"; 
    } 
?> 

http://php.net/manual/en/mysqli.prepare.php

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

+0

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

+0

Перейдите на сайт php.net, который я отправил, и он покажет вам, что именно вам нужно сделать. Если вам нужна безопасность, вам все равно нужно выучить подготовленные заявления. Я верю в вас :) Но чтобы остановить ошибку обновления, поставьте ваш php-код в isset, как я уже сказал. Это говорит о том, что этот код запускается только при нажатии кнопки «Отправить» (поиск). – clearshot66

0

Вы хотите парциальной фразу Полагаю, я ищу.

Тогда ваш запрос должен выглядеть следующим образом:

$Query = "SELECT user_id 
      FROM users 
      WHERE user_id LIKE '%$safesearch%'"; 

не очень хорошо знаком с PHP, но, кажется, символ% не является специальным символом в языке (поправьте меня, если я ошибаюсь), если это случайно - убежать.

Чтобы сделать это чувствительно к регистру -

$safesearch = strtolower($safesearch); 

$Query = "SELECT user_id 
       FROM users 
       WHERE lowercase(user_id) LIKE '%$safesearch%'";