Próbuję dowiedzieć się, czy można zarejestrować akcję w wyszukiwaniu PHP.

Mam 3 proste strony:

  1. Zaloguj się, aby uwierzytelnić mojego użytkownika
  2. funkcja wyszukiwania
  3. stronę, na której zostanie wyświetlony mój formularz wyszukiwania i wynik

Chcę wiedzieć, kto co wyszukiwał (na przykład użytkownik „Bob” wyszukał o 11:22 adres e-mail „Jan”)

Włączyłem dzienniki MySQL, które nie pozwalają mi uzyskać tego typu informacji. Czy mogę to zrobić w PHP?

Oto funkcja wyszukiwania:

<?php
//DB Connect
define('DB_HOST', 'xxxx');
define('DB_NAME', 'xxxx');
define('DB_CHARSET', 'utf8');
define('DB_USER', 'xxxx');
define('DB_PASSWORD', 'xxxx');
try {
  $pdo = new PDO(
    "mysql:host=" . DB_HOST . ";charset=" . DB_CHARSET . ";dbname=" . DB_NAME,
    DB_USER, DB_PASSWORD, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false ]
  );
} catch (Exception $ex) {
  die($ex->getMessage());
}

Echo "Hi ".$_SESSION['username'];

// SEARCH
$stmt = $pdo->prepare("SELECT * FROM `Users` WHERE `user_name` LIKE ? OR `user_mail` LIKE ?");
$stmt->execute(["%" . $_POST['search'] . "%", "%" . $_POST['search'] . "%"]);

$results = $stmt->fetchAll();
if (isset($_POST['ajax'])) {
  echo json_encode($results);
}
?>

I stronę wyników

<?php
// Initialize the session
session_start();

// Check if the user is logged in, if not then redirect him to login page
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true){
    header("location: login.php");
    exit;
}
?>

<?php

/* [SEARCH FOR USERS] */
if (isset($_POST['search'])) {
  require "search.php";
}

/* [DISPLAY HTML] */ ?>
<!DOCTYPE html>
<html>
  <body>
    <!-- [SEARCH FORM] -->
    <form method="post">
      <h1>
        Search user email from username
      </h1>
      <h1>

      </h1>
      <input type="text" name="search" required/>
      <input type="submit" value="Search"/>
    </form>

    <!-- [SEARCH RESULTS] -->
    <?php

    if (isset($_POST['search'])) {
      if (count($results) > 0) {
        foreach ($results as $r) {
         printf("<br> Username : %s <br> eMail :  %s</div>", $r['user_name'], $r['user_mail']);
        }
      } else {
        echo "No results found";
      }
    }
    ?>
  </body>
</html>

Strona logowania nie jest zbyt interesująca.

0
Kreg 20 listopad 2019, 02:00
Możesz użyć error_log z $message_type=3 który będzie logował komunikaty do pliku określonego przez użytkownika
 – 
Nick
20 listopad 2019, 02:17
3
Tak. Możesz to zrobić za pomocą PHP. Możesz utworzyć tabelę z kolumnami, powiedzmy - nazwa użytkownika, czas_wyszukiwania i informacje_wyszukiwania. Następnie po przesłaniu przycisku wyszukiwania wstaw odpowiednie wartości do tabeli przed wyświetleniem wyniku wyszukiwania. Możesz teraz utworzyć kolejną stronę, na której kto szuka tego, co będzie wyświetlane
 – 
hans-könig
20 listopad 2019, 02:30
Jest to całkowicie możliwe, a projekt monolog sprawia, że ​​tego rodzaju rzeczy są bardzo łatwe. Odradzałbym używanie tabeli bazy danych do informacji związanych z logami. Jest ok na krótką metę bez ogromnej liczby użytkowników, ale szybko stanie się wąskim gardłem. RDBMS służą do organizowania danych i relacji między nimi. Nie jest zbyt dobrze przystosowany do rejestrowania tekstu w nieskończoność. Jakiś rodzaj rozwiązania NoSQL będzie znacznie lepszym wyborem, na myśl przychodzi elastyczne wyszukiwanie. Jeśli korzystasz z RDBMS, upewnij się, że typ danych tekstowych nie jest załadowany do pamięci.
 – 
Alex Barker
20 listopad 2019, 02:57
Dzięki wszystkim tak naprawdę nie znam PHP. Myślę więc, że dla mnie najłatwiejszym sposobem jest przestrzeganie zalecenia hans-königa; utwórz tabelę do przechowywania tych informacji. Dziękuję
 – 
Kreg
20 listopad 2019, 15:37

1 odpowiedź

To byłoby możliwe w każdym języku. Musisz tylko przechowywać wyszukiwania w tabeli DB.

W najprostszym przypadku utwórz tabelę z 3 kolumnami - user_name, search_term, search_time.

Dodaj ten kod przed lub po sekcji //SEARCH.

//STORE SEARCH
$stmt = $pdo->prepare("INSERT INTO `Searches_Table` (user_name, search_term, search_time) VALUES (?, ?, NOW())");
$stmt->execute([$_SESSION['username'], $_POST['search']]);

Możesz oczywiście dodać dodatkowe sprawdzanie błędów. Sugeruję również użycie user_id, ale nie widziałem go w Twoim kodzie. Jeśli jeszcze tego nie zrobiłeś, zapisz user_id w $_SESSION i INSERT to zamiast. W ten sposób, jeśli user_name kiedykolwiek się zmieni, nadal możesz łatwo połączyć go z użytkownikiem.

0
Alex 21 listopad 2019, 04:16