2016-02-02 3 views
0

Я использую этот SQL запрос в ссылке для извлечения данных из базы данныхметода использования POST для отображения данных из PHP базы данных

<div class="nav-laptop"><a href="proizvodi.php?upit=SELECT Slika, Naziv, Opis, Cijena FROM Proizvodi WHERE Kategorija='Laptop' ORDER BY Proizvodac Asc;">Laptop</a> 

и отобразить его с помощью

$sql = $_REQUEST['upit']; 

$result = $conn->query($sql); 

if ($result->num_rows > 0) { 
    echo "<div class='proizvodi'>"; 
    // output data of each row 
    $result->data_seek(0); 
    while($row = $result->fetch_assoc()) { 
     echo "<div class='row'>"; 
      foreach($row as $key => $value){ 
       echo "<div class='" . $key . "'>" . $value . "</div>"; 
      } 
     echo "</div>"; 
     echo "<hr />"; 
    } 
    echo "</div>"; 
} 
else { 
    echo "<div class='search-query-none'><img src='index/no result.png' width='754' height='198' /></div>"; 
} 

я понял, что это очень уязвимое и что я должен использовать метод POST, чтобы скрыть параметры из URL. Я пробовал читать онлайн-форумы, но я не нашел ничего, что помогло бы мне преобразовать это в POST-способ получения данных. Итак, как я могу использовать метод POST для достижения того же результата, что и сейчас, используя GET?

+0

вам нужно будет использовать форму (самый простой способ) для отправки параметров через метод POST. Только отправьте параметры, которые могут измениться - как категория в вашем случае. А затем используйте подготовленные заявления, чтобы они не были уязвимыми. – Jeff

+1

Вы должны построить запрос в PHP. Отправка запросов с URL-адреса очень небезопасна. Если кто-то нашел это и загрузил 'proizvodi.php? Upit = удалить из Proizvodi', вся ваша таблица данных исчезла; или, возможно, хуже изменили весь текст на ссылки. – chris85

+0

Взгляните на http://stackoverflow.com/questions/16036041/can-a-html-button-preform-a-post-request и/или https://developer.mozilla.org/en-US/ Docs/Web/Руководство/HTML/Формы/Sending_and_retrieving_form_data. – chris85

ответ

3

Это даст вам общее представление о том, как это сделать.

форма HTML:

<form method="post" action="your_handler.php"> 
    <input type = "text" name = "search_query"> 
    <input type = "submit" name = "submit" value = "Search"> 
</form> 

SQL/PHP и при условии успешного соединения с использованием MySQLi API.

$conn = mysqli_connect("your_host", "user", "password", "db"); 

if (!$conn) { 
    echo "Error: Unable to connect to MySQL." . PHP_EOL; 
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; 
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; 
    exit; 
} 

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

    if(!empty($_POST['search_query'])){ 

    $search_query = mysqli_real_escape_string($conn, $_POST['search_query']); 

    $result = mysqli_query($conn, "SELECT * FROM TABLE WHERE col = '$search_query' "); 

    if(!$result) { echo "Error: " . mysqli_error($conn); } 

    if ($result->num_rows > 0) { 

      while($row = $result->fetch_assoc()) { 
       // perform what you want here 
       // and check for errors on your query 
      } 

     } 
    } 

} 

Вы также можете заменить SELECT * на указанные столбцы.

В идеале, подготовленное заявление приятно работать.

Sidenote: Не смешивайте различные API-интерфейсы MySQL, такие как mysqli_ с PDO. Они просто не смешиваются.

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

Добавить or die(mysqli_error($conn)) в mysqli_query().

Добавить error reporting в начало файла (ов), который поможет найти ошибки.

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// Then the rest of your code 

Sidenote: Отображение ошибок не должно быть сделано только в постановке, и никогда производства.

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

  • Использование trim() для ввода.
+0

Ничего себе, это выглядит красиво. Я рассмотрю его. – BloodDrunk

+0

@BloodDrunk Наслаждайтесь! ;-) * Cheers * –

+0

Большое вам спасибо! У меня были проблемы с ним прошлой ночью, и теперь мне удалось заставить его работать наконец. Надеюсь, это намного безопаснее от SQL-инъекции сейчас, чем раньше (определенно ..): У меня есть хелла много, чтобы учиться. – BloodDrunk

2

Не нужно использовать POST для запроса SELECT. Вы можете, но он действительно лучше подходит для INSERT/UPDATE/DELETE, что фактически меняет ваши данные. Возможное преимущество использования такой ссылки для результатов поиска заключается в том, что она может быть сохранена, добавлена ​​в закладки, отправлена ​​по электронной почте и т. Д., Если представление формы не может.Но вы правы, что весь ваш запрос в такой ссылке определенно чрезвычайно уязвим.

Вместо того чтобы передавать весь запрос по ссылке, вы можете просто передать параметры, например:

<a href="proizvodi.php?kategorija=Laptop">Laptop</a> 

Затем в коде отображения вы можете использовать подготовленное заявление и безопасно связать параметр:

$kategorija = $_GET['kategorija']; 

$sql = 'SELECT Slika, Naziv, Opis, Cijena FROM Proizvodi 
     WHERE Kategorija=? ORDER BY Proizvodac'; 

$stmt = $conn->prepare($sql); 
$stmt->bind_param("s", $kategorija); 
$stmt->execute(); 
// etc. 
+0

Я пробовал использовать это, но он не возвращает результат hm. Вероятно, ошибка запроса. – BloodDrunk

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