【发布时间】:2020-10-09 01:58:16
【问题描述】:
下面的代码现在可以工作了,但是我怎样才能做到,所以如果没有找到结果,它会回显一条消息而不是空白。
我想我已经成功地为我的数据库创建了一个搜索查询。它只是一个非常基本的搜索,但由于某种原因它似乎不起作用。任何建议都将不胜感激,我对 pdo 还是新手(非常新!善待!)。
也没有用户提交的数据被插入到数据库中,所以我想我可以排除 xss 假设它的 SQL 注入是免费的?据我了解PDO是哪个?加上我使用一个没有写访问权限的独立数据库用户。
为安全起见,已将数据替换为 xxx
文件名为search.php
*已更新以反映建议的更改 *第二次更新以反映所提供的帮助 *第三次更新
<html>
<head>
</head>
<body>
<form name="frmSearch" method="post" action="search.php">
<table width="599" border="1">
<tr>
<th>Keyword
<input name="var1" type="text" id="var1">
<input type="submit" value="Search"></th>
</tr>
</table>
</form>
<?php
$nameofdb = 'xxxxxx';
$dbusername = 'xxxxxxxxxxxxxx';
$dbpassword = 'xxxxxxxxxxxxx';
// Connect to MySQL via PDO
try {
$dbh = new PDO("mysql:dbname=$nameofdb;host=localhost", $dbusername, $dbpassword);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$var1 = str_replace(array('%','_'),'',$_POST['var1']);
if (!$var1)
{
exit('Invalid form value: '.$var1);
}
$query = "SELECT * FROM xxxxx WHERE xxxxxx LIKE :search OR xxxxx LIKE :search";
$stmt = $dbh->prepare($query);
$stmt->bindValue(':search', '%' . $var1 . '%', PDO::PARAM_INT);
$stmt->execute();
/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:\n");
$result = $stmt->fetchAll();
foreach( $result as $row ) {
echo $row["id"];
echo $row["title"];
}
?>
</body>
</html>
【问题讨论】:
-
请注意,即使您使用的是准备好的语句,我仍然可以让您的脚本通过在表单(MySQL 通配符)中不填写任何内容(
_或%)来返回整个数据库。无论是否使用准备好的语句,您都可以很好地检查用户输入 -
您好,谢谢,我该怎么做?我曾经使用 mysqli_real_escape_string 但我失去了 int PDO 世界!
-
简单检查:
$var1 = str_replace(array('%','_'),'',$_POST['var1']); if (!$var){ exit('Invalid form value: '.$var1);} -
我是否在正确的位置添加了这个?谢谢大家的帮助。
-
嗨 Elias 我现在有这个脚本可以使用 $var1 = $_POST['var1'];但不是 $var1 = str_replace(array('%','_'),'',$_POST['var1']); if (!$var){ exit('Invalid form value: '.$var1);} 这是否替换了 $var1 = $_POST['var1'];还是我在它上面/下面添加它?