>我在链接中使用此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.