【问题标题】:Search form with PDO使用 PDO 搜索表单
【发布时间】: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'];还是我在它上面/下面添加它?

标签: php search pdo


【解决方案1】:

问题出在形式上。方法是GET,但在你的php中你期望$_POST

所以这一行:

<form name="frmSearch" method="get" action="search.php">

应该是:

<form name="frmSearch" method="post" action="search.php">

更新

将您的代码更改为:

// 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();

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

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

【讨论】:

  • 感谢您的帮助。试过 $var1 = $_GET['var1'];并且还尝试更改 method="post" 但运气好。还有其他想法吗?再次感谢
  • 已更新上述代码以进行反射更改,但遗憾的是无法正常工作
  • 再次感谢您对此的帮助。我在我的页面上新收到“获取结果集中所有剩余的行”消息,但是当我搜索时没有显示结果。
  • 非常感谢,如果我使用 $var1 = $_POST['var1'];以及您建议的其他更改:) 刚刚得到 $var1 = str_replace(array('%','_'),'',$_POST['var1']); if (!$var){ exit('Invalid form value: '.$var1);} 上面的问题现在修复
  • 其实应该是GET方法,而不是POST
【解决方案2】:

我编写了这个方法并在我从事的每个项目中使用。试试看:)

public function searchForQueryString($queryString)
{
    $query = "SELECT * FROM `xxxx` WHERE (`xxxxxxx` like :queryString or `xxxxx` like :queryString) ";

    $sth = $this->prepare($query);
    $queryString = '%' . $queryString . '%';
    $sth->bindParam('queryString', $queryString, PDO::PARAM_STR);

    $sth->execute();

    $result = $sth->fetchAll(PDO::FETCH_OBJ);

    if(empty($result) or $result == false)
       return array();
    else
        return $result;
}

【讨论】:

    【解决方案3】:

    我修改了 Amir 的代码,它可以工作:

    protected $pdo;
    
    public function __construct($pdo)
    {
        $this->pdo = $pdo;
    }
    
    public function selectSearch($table, $search)
    
    {
        $statement = $this->pdo->prepare("select * from {$table} WHERE post_tags LIKE '%$search%'");
    
        $statement->execute();
    
        $result = $statement->fetchAll();
    
        if(empty($result) or $result == false){
            echo "<h1> No Result</h1>";
            return array();
        } else{
            return $result;
      }}
    
    
    if(isset($_POST['submit'])){
                $search = $_POST['search'];
    
                $data = $query->selectSearch('posts', $search);
            }
    

    【讨论】:

    • 恭喜,您刚刚在 Amir 的代码中添加了第一类 SQL INJECTION
    猜你喜欢
    • 2012-12-02
    • 2014-05-24
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2013-12-03
    • 2014-11-07
    • 2019-07-22
    • 2011-03-21
    相关资源
    最近更新 更多