【问题标题】:Use POST method to display data from database PHP使用 POST 方法显示数据库 PHP 中的数据
【发布时间】:2016-05-11 19:19:01
【问题描述】:

我在链接中使用此 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 相同的结果?

【问题讨论】:

  • 您必须使用表单(最简单的方式)通过 POST 方法发送参数。仅发送可能更改的参数 - 例如您的类别。然后使用准备好的语句以免受到攻击。
  • 您应该在 PHP 中构建查询。从 URL 发送查询非常不安全。如果有人发现这个并加载了proizvodi.php?upit=delete from Proizvodi,你的整个数据表就消失了;或者更糟糕的是,将所有文本更改为链接。

标签: php html post


【解决方案1】:

这将使您大致了解如何执行此操作。

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 * 替换为上述列。

理想情况下,准备好的语句很适合使用。

旁注:不要将不同的 MySQL API(例如 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

旁注:显示错误应该只在暂存阶段完成,而不是在生产阶段。

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

【讨论】:

  • 哇,这看起来不错。我会研究一下。
  • @BloodDrunk 享受吧! ;-) 干杯
  • 非常感谢!昨晚我遇到了麻烦,现在我终于设法让它工作了。希望现在这对 SQL 注入来说比以前更安全了(肯定是……):我还有很多东西要学。
  • @BloodDrunk 不客气,很高兴我能帮上忙,干杯!
【解决方案2】:

对于SELECT 查询,您无需使用POST。您可以,但它确实更适合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.

【讨论】:

  • 我尝试使用它,但它没有返回任何结果 hm。可能是查询错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2015-04-06
相关资源
最近更新 更多