使用 POST 方法显示来自数据库 PHP 的数据


Use POST method to display data from database PHP

>我在链接中使用此SQL查询从数据库中检索数据

<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 实现的相同的结果?

这将使您对如何执行此操作有一个大致的了解。

网页表单:

<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 *

理想情况下,准备好的陈述很好用。

  • http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
  • http://php.net/pdo.prepared-statements(如果你想研究PDO(。

旁注:不要将不同的MySQL API混合使用,例如mysqli_与PDO。它们只是不混合在一起。

还要针对您的查询检查错误:

  • http://php.net/manual/en/mysqli.error.php

or die(mysqli_error($conn))添加到mysqli_query()

将错误报告添加到文件顶部,这将有助于查找错误

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code

旁注:显示错误只能在暂存中完成,而不应在生产中完成。

此外,请确保输入中没有引入空格,否则查询可能会失败。

  • 对输入使用 trim()

您无需将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.