• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP-przełączanie pomiędzy stornami bez uzycia formularzy

42 Warsaw Coding Academy
0 głosów
800 wizyt
pytanie zadane 17 października 2023 w PHP przez KotLuminos Początkujący (270 p.)

Witam :D

Mam projekt strony kolegi:

<?php
  session_start();
  if(isset($_GET["podstrona"]))
  {
    $_SESSION["aktualnapodstorna"] = $_GET["podstrona"];
  }
  else
  {
    $_SESSION["aktualnapodstorna"] = "home";
  }

  /*if(isset($_REQUEST['loguj']))
  {
    $_SESSION["aktualnapodstorna"] = 'loguj';
  }
  if(isset($_REQUEST['rejestr']))
  {
    echo "ok";
    $_SESSION["aktualnapodstorna"] = 'rejestr';
  }*/
  if(isset($_REQUEST['wyloguj']))
  {
    $_SESSION["aktualnapodstorna"] = 'account';
    unset($_SESSION['zalogowano']);
    unset($_SESSION['imie']);
    unset($_SESSION['nazwisko']);
    unset($_SESSION['telefon']);
    unset($_SESSION['email']);
  }
  $site = $_SESSION["aktualnapodstorna"];
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./Styles/style.css">
    <script src="./script/spis.js" type="text/javascript"></script>
    <link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet">
    <link rel="script" href="formularz.php">
    <title>Sklep Internetowy - Pandoras Furnitures</title>
    
</head>

<body>
<header>
      <!-- Logotyp firmy -->
    <h1 class="logo">PANDORA<span class="logo_text">FURNITURES</span></h1>
        <p>Sklep meblowy i nie tylko</p>
        
    </header>
  <!-- Lista zakładek z podstronami -->
    <nav>
			<ul>
				<li><a href = "./?podstrona=home">Strona główna</a></li>
				<li><a href = "./?podstrona=list">Produkty</a></li>
				<li><a href = "./?podstrona=contact">Kontakt</a></li>
				<li><a href = "./?podstrona=account">Konto</a></li>
			</ul>
		</nav>
<!-- Srkypt PHP odpowiedzialny za przełączanie stron przy użyciu Ciasteczek -->
    <?php
          switch ($site) 
          {
          case 'home':
            require_once("./Content/main.php");
            break;
          case 'list':
            require_once("./Content/search.php");
            break;
          case 'contact':
            require_once("./Content/contact.php");
            break;
          case 'account':
            if(isset($_SESSION['zalogowano']))
            {
              require_once("./Content/account-login.php");
            }
            else
            {
              require_once("./Content/account.php");
            }
          break;
          case 'loguj':
            require_once("./Content/login.php");
            break;
          case 'rejestr':
            require_once("./Content/register.php");
            break;
          case 'zmienhaslo':
            require_once("./Content/zmianahasla.php");
            break;
          case 'kitchenpage':
            require_once("./Content/KategorieMebli/kitchen.php");
            break;
          case 'bathroompage':
            require_once("./Content/KategorieMebli/bathroom.php");
            break;
          case 'livingroompage':
            require_once("./Content/KategorieMebli/livingroom.php");
            break;
          case 'bedroompage':
            require_once("./Content/KategorieMebli/bedroom.php");
            break;
          case 'gardenpage':
            require_once("./Content/KategorieMebli/garden.php");
            break;
          case 'garagepage':
            require_once("./Content/KategorieMebli/garage.php");
            break;
                  
          default :
            require_once("./Content/main.php");
            break;
        }
		?>


      <!-- Footer -->
      <footer>
      <p>&copy; Dane Osobowe. Wszystkie prawa zastrzeżone.</p>
      <p> </p>
      <p>Wszelkie zamówienia nie są przez Naszą firmę realizowane. Należy we własnym zakresie zorganizować transport zakupionych towarów.</p>
    </footer>

    <div class="modal" id="modal">
        <div class="modal-content">
          <img id="modal-image" src="" alt="Modal Image">
        </div>
    </div>
</body>

</html>

I mam problem z tym fragmentem kodu:

<nav>
			<ul>
				<li><a href = "./?podstrona=home">Strona główna</a></li>
				<li><a href = "./?podstrona=list">Produkty</a></li>
				<li><a href = "./?podstrona=contact">Kontakt</a></li>
				<li><a href = "./?podstrona=account">Konto</a></li>
			</ul>
		</nav>

bo używa ta metoda metody get-a naszemu nauczycielowi niepodoba się ta metoda.
Szukałem rozwiązania, i chcę zrobić tak,by zamiast href,był onClick = "funkcja('wartość np: home')"  i ta wartość z JS została przekazana do zmiennej $_POST["podstrona"](zorbie to samo co z $_GET["podstorna"],ale z $_POST).Wiem że do teog można użyć ajax'a-ale nie ogarniam go(Jestem tez otwarty na inne rozwiązania,grunt by działało)
Nie moge zamiast <a> dać <input type = "submit" ...> w formularzu,bo keidy przełacza na podstorne concact.php-to się zawiesza bo wymaga wypełnienia forularza kontaktowego w nim.




 

komentarz 17 października 2023 przez overcq Pasjonat (22,540 p.)

Mógłbyś użyć bardziej rozbudowanej wersji tego, co poniżej. Na przykład ‘linki’ mógłbyś metodą “fetch” pobrać ze skryptu ‘php’ i dynamicznie zbudować sekcję “nav”.

const links = [];
function get_link( e
){  const parent = e.parentNode;
    for( let i = 0; i !== parent.children.length; i++ )
        if( parent.children[i] === e )
            return links[i];
}
function click( ev
){  ev.preventDefault();
    const link = document.createElement( "INPUT" );
    link.name = "link";
    link.value = get_link( ev.target );
    const form = document.createElement( "FORM" );
    form.method = "POST";
    form.action = "/";
    form.append(link);
    document.body.append(form);
    form.submit();
}
document.addEventListener( "DOMContentLoaded", () =>
  {   const es = document.getElementsByTagName( "NAV" )[0].getElementsByTagName( "LI" );
      for( const e of es )
      {   const a = e.firstElementChild;
          a.addEventListener( "click", click );
      }
  }
);

 

1
komentarz 17 października 2023 przez szymi_power Nowicjusz (180 p.)

@KotLuminos, zacznijmy od początku, tak, aby była jasność co trzeba dopracować, aby nauczyciel zaakceptował rozwiązanie (bo jak rozumiem to jest właśnie problemem tutaj).

Pytanie: co dokładnie nie podoba się nauczycielowi? Samo stwierdzenie, że nie podoba mu się użycie GET jest zbyt lakoniczna. Nie podoba się bo co? Jaki jest powód, propozycje, za i przeciw propozycji vs to co jest zrobione itp. Wtedy możemy przejść do szukania rozwiązań i implementacji.

komentarz 18 października 2023 przez VBService Ekspert (256,600 p.)
edycja 18 października 2023 przez VBService

@szymi_power;

co dokładnie nie podoba się nauczycielowi? Samo stwierdzenie, że nie podoba mu się użycie GET jest zbyt lakoniczna 

yes

@KotLuminos;

Szukałem rozwiązania, i chcę zrobić tak,by zamiast href,był onClick = "funkcja('wartość np: home')"  i ta wartość z JS została przekazana do zmiennej $_POST["podstrona"](zorbie to samo co z $_GET["podstorna"]

 

Nawigacja na stronie internetowej oparta o metodę POST nie jest dobrym pomysłem z punktu widzenia SEO (Optymalizacji Wyszukiwarek Internetowych). 

Metoda POST jest jednym z podstawowych sposobów przesyłania danych z przeglądarki internetowej do serwera. Jest często używana do przesyłania formularzy, gdzie użytkownik wypełnia pola i wysyła dane do serwera. Jednak z punktu widzenia SEO istnieją pewne kwestie, które sprawiają, że nawigacja oparta na POST jest nieoptymalna:

  1. Brak Przejrzystości URL: W przeglądarkach, adres URL nie jest zmieniany podczas korzystania z metody POST, co oznacza, że ​​brak czytelnych i łatwo dostępnych adresów URL dla podstron witryny. Wyszukiwarki polegają na adresach URL do indeksowania treści, a nieczytelne URL mogą utrudnić indeksowanie i określenie hierarchii stron na stronie.

  2. Trudności w Dzieleniu Linków: Linki oparte na metodzie POST są zazwyczaj trudne do udostępnienia innym użytkownikom, ponieważ nie można po prostu skopiować i wkleić URL. Udostępnianie i budowanie linków do konkretnych stron jest ważne w kontekście SEO.

  3. Wydajność i Prędkość Strony: Strony internetowe oparte na metodzie POST mogą być mniej wydajne i wolniejsze w działaniu niż strony oparte na metodzie GET, co może negatywnie wpływać na doświadczenie użytkownika. Szybkość strony jest ważnym czynnikiem SEO.

  4. Wsparcie dla Wyszukiwarek: Wyszukiwarki internetowe preferują indeksowanie stron opartych na metodzie GET, ponieważ mogą łatwo uzyskać dostęp do adresów URL i treści na stronie.

Dlatego z punktu widzenia SEO zaleca się stosowanie metody GET do nawigacji i prezentacji treści na stronie internetowej. Jest to bardziej zgodne z zasadami SEO i pozwala na łatwiejsze indeksowanie, dostępność linków oraz lepsze doświadczenie użytkownika.

komentarz 18 października 2023 przez szymi_power Nowicjusz (180 p.)

VBService - ja rozumiem, że kolega chce zrobić po swojemu. Sama wiedza jak to rozwiązać to jedno, a druga kwestia to zbieranie wymagań, o co poprosiłem, z powodu:

bo używa ta metoda metody get-a naszemu nauczycielowi niepodoba się ta metoda.

komentarz 19 października 2023 przez KotLuminos Początkujący (270 p.)

@szymi_power, Nauczycielowi niepodobna si to, że używamy metody get-po pojawia si w adresie strony /?zmienna = wartość

komentarz 19 października 2023 przez KotLuminos Początkujący (270 p.)

Bardzo Dziękuje za wasze Odpowiedzi :D

1 odpowiedź

0 głosów
odpowiedź 18 października 2023 przez VBService Ekspert (256,600 p.)
edycja 19 października 2023 przez VBService

Odradzam taką praktykę, ale jeśli zadanie wymaga takiego podejścia, to sprawdź to np.

<?php
    session_start();

    $_SESSION['aktualnapodstorna'] = $_POST['podstrona'] ?? $_GET['podstrona'] ?? 'home';
    //var_dump($_POST, $_GET, $_SESSION);

    /*if(isset($_REQUEST['loguj']))
    {
        $_SESSION['aktualnapodstorna'] = 'loguj';
    }
    if(isset($_REQUEST['rejestr']))
    {
        echo 'ok';
        $_SESSION['aktualnapodstorna'] = 'rejestr';
    }*/

    if(isset($_REQUEST['wyloguj']))
    {
        $_SESSION['aktualnapodstorna'] = 'account';
        unset($_SESSION['zalogowano']);
        unset($_SESSION['imie']);
        unset($_SESSION['nazwisko']);
        unset($_SESSION['telefon']);
        unset($_SESSION['email']);
    }
?>
<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">

        <link rel="stylesheet" href="./Styles/style.css">
        <script src="./script/spis.js" type="text/javascript"></script>
        <link href="https://fonts.googleapis.com/css2?family=Montserrat&display=swap" rel="stylesheet">
        <link rel="script" href="formularz.php">
        <title>Sklep Internetowy - Pandoras Furnitures</title>
    </head>
    <body>
        <header>
            <!-- Logotyp firmy -->
            <h1 class="logo">PANDORA <span class="logo_text">FURNITURES</span></h1>
            <p>Sklep meblowy i nie tylko</p>
        </header>

        <!-- Lista zakładek z podstronami -->
        <nav>
            <form id="nav" method="post">
                <input type="hidden" name="podstrona">
                <ul>
                    <li><a href = "./?podstrona=home">Strona główna</a></li>
                    <li><a href = "./?podstrona=list">Produkty</a></li>
                    <li><a href = "./?podstrona=contact">Kontakt</a></li>
                    <li><a href = "./?podstrona=account">Konto</a></li>
                </ul>
            </form>
        </nav>

        <script>
            const form_nav = document.querySelector('form#nav');
            form_nav.addEventListener('click', menu);

            // Event Delegation
            // https://davidwalsh.name/event-delegate
            function menu(e) {
                e.preventDefault();

                //if (e.target.matches('a[href*="podstrona"]')) {
                if (e.target.matches('a')) {
                    const url = (new URL(e.target.href)).searchParams.get('podstrona');
                    // console.log(e.target.href, url);
                    form_nav.querySelector('input[name="podstrona"]').value = url;
                    form_nav.submit();
                }
            }
        </script>
<?php
    // Srkypt PHP odpowiedzialny za przełączanie stron przy użyciu Ciasteczek
    $sites = [
        'home'       => './Content/main.php',
        'list'       => './Content/search.php',
        'contact'    => './Content/contact.php',
        'loguj'      => './Content/login.php',
        'rejestr'    => './Content/register.php',
        'zmienhaslo' => './Content/zmianahasla.php',

        'kitchenpage'    => './Content/KategorieMebli/kitchen.php',
        'bathroompage'   => './Content/KategorieMebli/bathroom.php',
        'livingroompage' => './Content/KategorieMebli/livingroom.php',
        'bedroompage'    => './Content/KategorieMebli/bedroom.php',
        'gardenpage'     => './Content/KategorieMebli/garden.php',
        'garagepage'     => './Content/KategorieMebli/garage.php'
    ];

    if ($_SESSION['aktualnapodstorna'] == 'account')
    {
        require_once('./Content/' . ((isset($_SESSION['zalogowano'])) ? 'account.php' : 'account-login.php'));
    }
    else
    {
        if (array_key_exists($_SESSION['aktualnapodstorna'], $sites))
        {
            require_once($sites[$_SESSION['aktualnapodstorna']]);
        }
        else
        {
            require_once($sites['home']); // ./Content/main.php
        }
    }
?>

        <!-- Footer -->
        <footer>
            <p>&copy; Dane Osobowe. Wszystkie prawa zastrzeżone.</p>
            <p></p>
            <p>Wszelkie zamówienia nie są przez Naszą firmę realizowane. Należy we własnym zakresie zorganizować transport zakupionych towarów.</p>
        </footer>

        <div class="modal" id="modal">
            <div class="modal-content">
                <img id="modal-image" src="" alt="Modal Image">
            </div>
        </div>
    </body>
</html>

 

 

BTW, gdy nie zadziała javascript, dalej jest "obsługiwane" natywne zachowanie się linków (<a href="...">...</a>)

$_SESSION['aktualnapodstorna'] = $_POST['podstrona'] ?? $_GET['podstrona'] ?? 'home';

 

What does double question mark (??) operator mean in PHP ]  [ CSS Selector Reference ]

komentarz 19 października 2023 przez KotLuminos Początkujący (270 p.)
Dziękuje :D Aktualnie szykuje się do szkoły-ale postaram się sprawdzić jak działa :3
komentarz 19 października 2023 przez VBService Ekspert (256,600 p.)
edycja 19 października 2023 przez VBService

@szymi_power, Nauczycielowi niepodobna si to, że używamy metody get-po pojawia si w adresie strony /?zmienna = wartość

@KotLuminos; Sprawdź jeszcze to, np. seo friendly url in php using htaccess

 

Upewnij się, że ten plik znajduje się w katalogu głównym Twojej witryny, a moduł mod_rewrite jest włączony na serwerze Apache, aby te reguły działały poprawnie.

przykładowy .htaccess

RewriteEngine On
RewriteBase /

# Przykładowy link 1
RewriteRule ^artykul/([0-9]+) /article.php?id=$1 [L]

# Przykładowy link 2
RewriteRule ^produkty/([a-z-]+) /product.php?name=$1 [L]

# Przykładowy link 3
RewriteRule ^kategoria/([a-z-]+)/([a-z-]+)/([a-z0-9-]]+) /category.php?main_category=$1&sub_category=$2&product=$3 [L]
<?php
// Przykład 1: Obsługa linka /artykul/123
if (isset($_GET['id'])) {
    $articleId = $_GET['id'];
    // Tutaj możesz wyświetlić artykuł o określonym ID.
    echo "Wyświetlanie artykułu o ID $articleId";
    // lub np.
    try {
        $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUsername, $dbPassword);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Zapytanie SQL (z wykorzystaniem bindowania parametrów)
        $sql = "SELECT * FROM articles WHERE id = :articleId";
        $stmt = $pdo->prepare($sql);
        $stmt->bindParam(':articleId', $articleId, PDO::PARAM_INT);
        $stmt->execute();

        // Sprawdzenie, czy artykuł istnieje
        if ($stmt->rowCount() > 0) {
            $row = $stmt->fetch();
            $articleTitle = $row['title'];
            $articleContent = $row['content'];

            // Wyświetlenie tytułu i treści artykułu
            echo "<h1>$articleTitle</h1>";
            echo "<p>$articleContent</p>";
        } else {
            echo "Artykuł o podanym ID nie istnieje.";
        }
    } catch (PDOException $e) {
        echo "Błąd bazy danych: " . $e->getMessage();
    }
}

// Przykład 2: Obsługa linka /produkty/laptop-dell
if (isset($_GET['name'])) {
    $productName = $_GET['name'];
    // Tutaj możesz wyświetlić informacje o produkcie o określonej nazwie.
    echo "Wyświetlanie produktu o nazwie $productName";
}

// Przykład 3: Obsługa linka /kategoria/elektronika/smartfony/iphone-12
if (isset($_GET['main_category']) && isset($_GET['sub_category']) && isset($_GET['product'])) {
    $mainCategory = $_GET['main_category'];
    $subCategory = $_GET['sub_category'];
    $product = $_GET['product'];
    // Tutaj możesz wyświetlić produkt w odpowiedniej kategorii.
    echo "Wyświetlanie produktu w kategorii $mainCategory > $subCategory o nazwie $product";
}
?>

 

Sprawdź też temat: Free .htaccess Generator, żeby ułatwić sobie nieco pracę z plikami .htaccess

komentarz 19 października 2023 przez KotLuminos Początkujący (270 p.)

@VBService, Działa w 99% :D-niezaleznie co klikam-zawsze jest /?podstorna = home,a to już mega daje do przodu :D

 

komentarz 19 października 2023 przez KotLuminos Początkujący (270 p.)
Twój kod działa :D Bardzo dizekuje :D Napococzatku robił coś takiego że było non stop widać /?podstorna=home lub zamiast homer-rejest,ale teraz już niema nic :D
komentarz 19 października 2023 przez KotLuminos Początkujący (270 p.)
tą z plikiem .htaccess- niespecjalnie rozumiem, a linki do storn angielskich tez nie rozumiem(u mnie slłabo z angielskim i tak wiem,że dla programisty angielski powinien być drugim językiem) ale...no nieidzie(ale lepiej go rozumiem niż rok temu xD) może nawet mógłbym coś zrozumieć z artykułów-ale...po prostu nie mam siły na myślenie xD-ale bardzo doceniam twoją pomoc :D
komentarz 19 października 2023 przez VBService Ekspert (256,600 p.)

@KotLuminos, jest i po polsku:  Co to jest .htaccess? Jak go używać? 

komentarz 20 października 2023 przez KotLuminos Początkujący (270 p.)
oooo,nie wiedziałem

Podobne pytania

0 głosów
1 odpowiedź 273 wizyt
pytanie zadane 16 grudnia 2015 w JavaScript przez Pytający Początkujący (290 p.)
0 głosów
0 odpowiedzi 93 wizyt
pytanie zadane 19 maja 2020 w JavaScript przez endriuu0 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 136 wizyt
pytanie zadane 30 stycznia 2019 w PHP przez Greeenone Pasjonat (16,100 p.)

93,377 zapytań

142,380 odpowiedzi

322,530 komentarzy

62,727 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...