带有 PDO 的搜索表单

use*_*967 -2 php search pdo

下面的代码现在可以工作了,但是如果没有找到结果,我该如何制作它,它会回显一条消息而不是空白。

我想我已经设法为我的数据库创建了一个搜索查询。它只是一个非常基本的搜索,但由于某种原因它似乎不起作用。任何建议都将不胜感激,我还是 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>
Run Code Online (Sandbox Code Playgroud)

Per*_*rry 5

问题出在形式上。该方法GET只是在您期望的 php 中$_POST

所以这一行:

<form name="frmSearch" method="get" action="search.php">
Run Code Online (Sandbox Code Playgroud)

应该:

<form name="frmSearch" method="post" action="search.php">
Run Code Online (Sandbox Code Playgroud)

更新

将您的代码更改为:

// Connect to MySQL via PDO
$dbh = new PDO("mysql:dbname=$nameofdb;host=localhost", $dbusername, $dbpassword);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$var1 = $_POST['var1'];

$query = "SELECT * FROM xxxxx WHERE xxxx LIKE :search OR xxxxx LIKE :search";
$stmt = $dbh->prepare($query);
$stmt->bindValue(':search', '%' . $var1 . '%',);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

要检查是否没有线路并给出消息,您可以这样做:

$result = $stmt->fetchAll();
if ($result) { 
    foreach( $result as $row ) {
        echo $row["id"];
        echo $row["title"];
    }
} else {
    echo 'There is nothing to show';
}
Run Code Online (Sandbox Code Playgroud)