簡體   English   中英

搜索 MySQL PDO PHP

[英]Search into MySQL PDO PHP

我有 JSON ' https://jsonplaceholder.typicode.com/todos/ ',我從那里獲取數據並填充 MySQL。 然后我連接到 MySQL 並顯示數據。 我制作了一個搜索框和按鈕來在我的表格中進行搜索,並且效果很好。 結果我將它顯示在 mt php 頁面的表格中。 但我有一個問題。 這就是我將 JSON 數據插入 MySQL 的方式,這里是我將 DB 中的數據顯示到我的 php 頁面的表格:

     function getDati()
        {
            $url = 'https://jsonplaceholder.typicode.com/todos/';
            $cURL = curl_init();
            curl_setopt($cURL, CURLOPT_URL, $url);
            curl_setopt($cURL, CURLOPT_HTTPGET, true);
            curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);

            curl_setopt($cURL, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'Accept: application/json'
            ));

            $result = curl_exec($cURL);
            curl_close($cURL);
            $all_items = json_decode($result);
            return $all_items;
        }
    //DB CONECTION
    class Database
    {
        private $db_host;
        private $db_name;
        private $db_username;
        private $db_password;

        public function dbConnection()
        {
            $this->db_host = 'localhost';
            $this->db_name = 'items';
            $this->db_username = '*****';
            $this->db_password = '****';
            try {
                $conn = new PDO('mysql:host=' . $this->db_host . ';dbname=' . $this->db_name, $this->db_username, $this->db_password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                return $conn;
            } catch (PDOException $e) {
                echo "Connection error " . $e->getMessage();
                exit;
            }
        }
    }
//connecto to DB to displayit into my php page
<?php
            $database = new Database;
            $db = $database->dbConnection();
            $stmt = $db->query("SELECT * FROM posts ");
            $stmt->execute();
            ?>
 <table class="table table-hover">
                    <hr>
                    <div style="text-align: center"> <label class="badge badge-light" style="font-size:30px; background-color: #2196F3;">All Items</label></div>
                    <hr>
                    <thead>
                        <tr>
                            <th>User ID</th>
                            <th>ID</th>
                            <th>Title</th>
                            <th>Compiled</th> 
                        </tr>
                    </thead>
                    <?php foreach ($stmt as $item) : ?>
                        <tr>
                            <td><?php echo $item['userId'] ?> </td>
                            <td><?php echo $item['id'] ?> </td>
                            <td><?php echo $item['title'] ?></td>
                            <td><?php echo $item['completed'] ? 'Compiled' : 'Not Compiled' ?></td> //completed is boolean so I used "? 'Compiled' : 'Not Compiled'" to not be displayed 0 or 1 
</tr>
                    <?php endforeach ?>
                </table>

這是搜索框和按鈕的 HTML 代碼:

<form method="post" class="form-inline my-2 my-lg-0 navbar navbar-expand-lg navbar-light bg-dark">
            <input name="search" class="form-control mr-sm-2" placeholder="Search" aria-label="Search">
            <button name="submit-search" class="btn  my-2 my-sm-0 bg-white" type="submit">Search</button>
        </form>

以及函數 Search() 的代碼:

function search()
{
    $keyword = '%' . $_POST['search'] . '%';
    $database = new Database;
    $db = $database->dbConnection();
    $stmt = $db->query("SELECT * FROM posts WHERE id LIKE '$keyword' OR userId LIKE '$keyword' OR title LIKE '$keyword'  OR completed LIKE  '$keyword'");
    $stmt->execute();
 <div class="container" style=" margin-top:5%;">
        <table class=" table table-hover" id="search-table" style="font-size: 18px;">
            <hr>
            <div style="text-align:center;"> <label style="text-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1), 10px 10px 10px rgba(0, 0, 0, 0.2); font-size:30px;border-radius: 45px; "> Results from search : </label></div> <br>
            <tr>
                <th>User ID:</th>
                <th> ID: </th>
                <th> Title: </th>
                <th> Compiled: </th>
            </tr>

            <?php while ($row = $stmt->fetch()) : ?>
                <tr>
                    <td> <?php echo $row['userId'] ?> </td>
                    <td> <?php echo $row['id'] ?> </td>
                    <td> <?php echo $row['title'] ?> </td>
                    <td> <?php echo $row['completed'] ? 'Compiled' : 'Not Compiled' ?> </td>
                </tr>
            <?php endwhile ?>
        </table>
    </div>
<?php } ?>

問題是 JSON 文件有一個包含 200 個對象的數組,而這 200 個對象具有userId, id, title, completed等屬性。 Completed是布爾類型,在 MySQL 中它被保存為 0 或 1(假/真)。 所以很明顯,當我在搜索框中輸入Completed 或 Not completed 時,它什么也沒有。

在搜索框中鍵入已完成或未完成時,如何顯示 MySQL 表中所有已完成或未完成的項目。

更新:我從 2 個輸入進行 HTML 搜索:

<div class="container bg-light " style=" margin-top:8%; width:30%;" id="searcform">
    <form method="post">
        <div class="text-center">
            <label class="h3 font-weight-bold">SEARCH BY:</label>
        </div>
        <hr>
        <div class="form-group">
            <label for="formGroupExampleInput">User ID: </label>
            <input type="text" name="userId" class="form-control" id="formGroupExampleInput" required>
        </div>
        <div class="form-group ">
            <label for="formGroupExampleInput2">Title</label>
            <input type="text" name="title" class="form-control" id="formGroupExampleInput2" required>
        </div>
        <button type="submit" name="search-btn2" class="btn btn-primary">Search</button>
        <hr>
    </form>
</div>

PHP 從 2 個輸入中搜索:

if (isset($_POST['search-btn2'])) {

    $values = [];
    $conditions = [];
    $conditions[] = "1";  /* trivial condition that is True */

    $userId = $_POST['userId'];
    if ($userId != '') {
        $values[] = $userId;
        $conditions[] = "userId = ?";
    }
    $title = $_POST['title'];
    if ($title  != '') {
        $values[] = $title;
        $conditions[] = "title like concat('%', ?, '%')";
    }

    $database = new Database;
    $db = $database->dbConnection();
    $cond = join(' AND ', $conditions);
    $sql = "SELECT * FROM posts WHERE $cond";
    $stmt = $db->prepare($sql);
    $stmt->execute($values);
}
?>

我建議您的搜索框為用戶可以提供的每個參數包含一個單獨的輸入小部件。

您應該使用<select> HTML 標記來指定已completed搜索參數,如下所示:

<select name="completed">
    <option value=''>-- Select a Completion Value --</option>
    <option value="0">Not Completed</option>
    <option value="1">Completed</option>
</select>

您可以為id參數添加一個<select>標簽:

<select name="id">
    <option value=''>-- Select an id value --</option>
    <option value="id-value-1">id-value-1</option>
    <option value="id-value-2">id-value-2</option>
    . . .
    <option value="id-value-N">id-value-N</option>
</select>

以上必須在循環中初始化。 或者你可以有一個簡單的文本框,用戶必須在其中輸入感興趣的行的 id。

您應該有文本輸入字段 userId 和 title:

User Id: <input type="text" name="userId">
Title: <input type="text" name="title">

你的 PHP 代碼應該是:

$values = [];
$conditions = [];
$conditions[] = "1";
$completed = $_POST['completed'];
if ($completed != '') {
    $values[] = $completed;
    $conditions[] = "completed = ?";
}
$id = $_POST['id'];
if ($id != '') {
    $values[] = $id;
    $conditions[] = "id = ?";
}
$userId = $_POST['userId'];
if ($userId != '') {
    $values[] = $userId;
    $conditions[] = "userId = ?";
}
$title = $_POST['title'];
if ($title  != '') {
    $values[] = $title;
    $conditions[] = "title like concat('%', ?, '%')";
}
$cond = join(' AND ', $conditions);
$db = $database->dbConnection();
$stmt = $db->prepare("SELECT * FROM posts WHERE $cond");
$stmt->execute($values);

請注意,上面的代碼使用了准備好的語句來防止 SQL 注入攻擊。 如果您可以確保始終至少指定一個輸入條件,使得$conditions數組不為空,則可以從 SELECT 語句中刪除1條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM