Ниже приведен код ниже, но как я могу это сделать, если результаты не найдены, он выводит сообщение вместо пустого.
Я думаю, мне удалось создать поисковый запрос для моей базы данных. Его единственный очень простой поиск, но он почему-то не работает. Любой совет будет оценен им, но все же новым для 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; }