我在链接中使用此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实现相同的结果?
答案 0 :(得分: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 *
替换为所述列。
理想情况下,准备好的声明很适合。
旁注:不要将mysqli_
等不同的MySQL API与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
旁注:只应在暂存时进行显示错误,而不是生产。
另外,请确保输入中没有引入任何空格,否则您的查询可能会失败。
trim()
。答案 1 :(得分: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.