Форма поиска с PDO

Ниже приведен код ниже, но как я могу это сделать, если результаты не найдены, он выводит сообщение вместо пустого.

Я думаю, мне удалось создать поисковый запрос для моей базы данных. Его единственный очень простой поиск, но он почему-то не работает. Любой совет будет оценен им, но все же новым для pdo (очень новый! Будь добр!).

Кроме того, никакие пользовательские данные не вставляются в базу данных, поэтому я думаю, что могу исключить xss, предположив, что SQL-инъекция бесплатна? Какой из того, что я понимаю, PDO? плюс им, используя автономного пользователя БД без доступа на запись.

Замените данные на xxx для обеспечения безопасности

файл называется search.php

* обновлено, чтобы отразить предложенные изменения * 2-е обновление, чтобы отразить предоставленную помощь * 3-е обновление

<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> 

Проблема в форме. метод GET но в вашем php вы ожидаете $_POST

Итак, эта строка:

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

должно быть:

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

ОБНОВИТЬ

Измените это:

 // Connect to MySQL via PDO try { $dbh = new PDO("mysql:dbname=$nameofdb;host=localhost", $dbusername, $dbpassword); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } $var1 = $_POST['var1']; $query = "SELECT * FROM xxxxx WHERE xxxx LIKE ? OR xxxxx LIKE ?"; $params = array("%$var1%"); $stmt = $handle->prepare($query); $stmt->execute($params); 

к этому:

 // 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 = $_POST['var1']; $query = "SELECT * FROM xxxxx WHERE xxxx LIKE :search OR xxxxx LIKE :search"; $stmt = $dbh->prepare($query); $stmt->bindValue(':search', '%' . $var1 . '%', PDO::PARAM_INT); $stmt->execute(); 

ОБНОВЛЕНИЕ 2

Я просто вижу, что вы используете $handle для соединения, но вы определяете $dbh . Я думаю, если вы измените $handle на $dbh он будет работать

обновить 3

измените эту строку:

 $result = $sth->fetchAll(); 

к этому:

 $result = $stmt->fetchAll(); 

ОБНОВЛЕНИЕ 4

Чтобы проверить, нет ли строки и дать сообщение, вы можете сделать это следующим образом:

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

Я написал этот метод и использую в каждом проекте, над которым я работаю. попробуй 🙂

 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; }