Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] ID z tabeli w adresie
Forum PHP.pl > Forum > Przedszkole
Drapeta
Witam. Robię stronę pro publico bono i mam taki kod:

  1. require_once ('baza/config.php');
  2.  
  3. try
  4. {
  5.  
  6. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.  
  8. $stmt = $db->query('SELECT id, cytat, autor, kategoria, home FROM slowa WHERE home LIKE "HOME" ORDER by rand() LIMIT 1');
  9. echo '<ul class="s_a">';
  10. foreach($stmt as $row)
  11. {
  12. echo '<li class="cytat">'.$row['cytat'].'</li>'.'<li class="autor">'.$row['autor'].'</li>';
  13. }
  14. $stmt->closeCursor();
  15. echo '</ul>';
  16. }
  17. catch(PDOException $e)
  18. {
  19. echo "Połączenie nie mogło zostać utworzone: " . $e->getMessage();
  20. }


To prosty skrypt na cytat losowy. Co dodać, by po wylosowaniu cytatu dodawało jego ID w adresie url? Chodzi o to, by móc dodawać cytat do ulubionych i by każdy miał niepowtarzalny, niezmienny adres. Dziękuję i pozdrawiam
bostaf
To troszkę inaczej zrób.
1. Obok cytatu daj ikonkę "ulubiony". Kliknięcie tej ikonki niech powoduje zapisanie id cytatu ($row['id']) w ciastku - javascriptem.
2. Ten kod, który masz lekko zmodyfikuj - na początku daj "if ciastko istnieje" then "pobierz cytat z danym id" a jeśli nie, to losowy.
Pyton_000
- Dodajesz warunek na sprawdzanie czy w url jest np. ?cytat=1232
jeśli jest to wybierasz z BD cytat o tym ID.

Jeśli nie ma to losujesz sobie cytat i dodajesz sobie do li np: <li data-id="12312">
a potem w JS robisz dodawanie kawałka do url z ID cytatu:
https://stackoverflow.com/questions/486896/...with-javascript

albo po prostu po wylosowaniu robisz redirect na już gotowy link z ww. query
patwoj98
Cytat(Drapeta @ 9.06.2017, 18:17:56 ) *
Nie wiem, czy mnie dobrze zrozumieliście... Teraz mam adres www.strona.pl i jak wcisnę losowanie cytatu, to zaciągnie cytat (o np. ID 32), ale adres wciąż zostaje www.strona.pl

A chciałbym po wylosowaniu cytatu adres zmieniał się np na www.strona.pl?id=32

Jak to zrobić z tym kodem? Co dopisać? Będę wdzięczny...



Przecież Pyton podał Ci rozwiązanie Twojego problemu, zrozumiał go doskonale. Po gotowca to musisz zmienić dział na giełdę ofert.
patwoj98
Cytat(Drapeta @ 10.06.2017, 10:39:58 ) *
a potem w JS robisz dodawanie kawałka do url z ID cytatu:
https://stackoverflow.com/questions/486896/...with-javascript

A bez JavaScript nie da się tego zrobić?


PHP jest językiem działającym po stronie serwera, także musiałbyś zmieniać ID już w momencie generowania strony. Twój problem wymaga ingerencji skryptu dopiero w momencie eventu od usera, dlatego też musi być to obsłużone przez JS (frontendowo).
patwoj98
Cytat(Drapeta @ 11.06.2017, 02:04:09 ) *
Czy muszę używać JS, bo zastosowałem stmt zamiast get? Czy dlaczego? Dziękuję.


Jeśli dobrze rozumiem - chcesz dodać do części adresu element. Tu musisz zastosować JS tylko dlatego, że id dodajesz dynamicznie do adresu. Nie możesz edytować nic w adresie jak strona jest wygenerowana, ponieważ PHP już nie jest wywoływany, ale nadal możesz dokonywać przeróżnych operacji działając w oparciu o JS.

To czy użyłeś STMT czy czegokolwiek innego nie ma znaczenia - takie są już te języki.

Edycja adresu jest w tylu miejscach zrobiona, że gotowiec nie jest ciężki do znalezienia i zastosowania.
bostaf
Bez javascript to ta druga opcja o której pisał Pyton - redirect. Za pomocą header. (btw. wg mnie to powinna być pierwsza opcja):
Kod
$idCytatu = 32;
header('Location: http://www.strona.pl?id=' . $idCytatu);
exit();
leonpro778
Nie wiem czy dobrze Cię zrozumiałem ale chodzi Ci najpierw o losowanie cytatu, czyli:
  1. <?php
  2. // twój kod do losowania cytatu ten co podałeś na samym początku
  3.  
  4. header('Location: adres_strony?id_cytatu=' . $id_z_kodu_powyżej);
  5. ?>


I czemu miałoby nie wejść?
bostaf
Cytat(leonpro778 @ 13.06.2017, 08:06:44 ) *
Nie wiem czy dobrze Cię zrozumiałem ale chodzi Ci najpierw o losowanie cytatu, czyli:
  1. <?php
  2. // twój kod do losowania cytatu ten co podałeś na samym początku
  3.  
  4. header('Location: adres_strony?id_cytatu=' . $id_z_kodu_powyżej);
  5. ?>


I czemu miałoby nie wejść?

Dokładnie. Id cytatu masz w $row['id'], czyli
  1. $idCytatu = $row['id'];
Pyton_000
No bo nie dodałeś warunku że jak jest $_GET['id_cytatu'] nie puste to ma nie losować nowego i nie przekierowywać a jedynie wyświetlić cytat o zadanym ID. Wszystko opisałem w mojej 1-szej odpowiedzi...
patwoj98
Kolorowanie składni powinno dać Ci do myślenia.
header tworzy nagłówek, więc nie może być tam HTMLa.

header('Location: http://strona.pl?id_cytatu='.$idCytatu);

Tak powinno to działać. Musiałem dać bez BB bo dodaje ten link, rzeczywiście. Jaki teraz masz z tym problem?
bostaf
Cytat(Drapeta @ 13.06.2017, 22:35:38 ) *
Dało... Właśnie chcę to zmieniać... Ale to nie rozwiąże problemu... sad.gif Ten html się pojawił dopiero po wklejeniu tutaj na stronie. Zaraz będę testował. Robię 10 rzeczy w tym samym czasie i są efekty sad.gif Dziękuję... A to jest zapewne źle, nie o to Ci chodziło?

  1. try
  2. {
  3. $_GET[idCytatu]
  4. }

Korci mnie żeby Ci napisać gotowca, ale nie smile.gif
Chyba trzeba od początku zacząć...
header Inicjuje przekierowanie, czyli wysyła tzw. nagłówki co powoduje przeładowanie strony na podany url. Nagłówki muszą być wysyłane zanim cokolwiek (nawet spacja) zostanie wysłane do przeglądarki (echo, print, var_dump, itd), w przeciwnym razie wywali błąd. Czyli już tutaj widać że Twój skrypt nie zadziała - masz echo przed wywołaniem header. Ale to tylko jeden z kilku problemów.
Napisz to dokładnie w takiej kolejności, i pisz kod punkt po punkcie:

1. Sprawdzenie, czy id_cytatu jest przekazane GETem. (żadnego echa na razie)
1.1. Jeśli jest, to pobranie z bazy cytatu z tym id. Ale na razie żadnego echa - zapamiętaj w zmiennej, np. $cytat. (żadnego echa na razie)
1.2. Jeśli nie, to sprawdzenie czy istnieje ciastko z zapisanym id ulubionego cytatu. (żadnego echa na razie)
1.2.1. Jeśli istnieje, to przekierowanie (header z exitem) na url z id tego cytatu pobranym z ciastka ($_COOKIE). (żadnego echa na razie)
1.2.2. Jeśli nie istnieje, to wylosowanie cytatu i zapamiętanie go w zmiennej $cytat. (żadnego echa na razie)
2. Wydrukowanie (echo / czysty HTML po zamknięciu bloku kodu php "?>") strony razem z cytatem $cytat ORAZ ikonką polubienia cytatu z odpowiednim javascriptem zapisującym ciastko.

I tyle.
Odnośnie $_GET - jeśli url ma wyglądać tak: strona.pl?id_cytatu=32, to id cytatu będzie w $_GET['id_cytatu']. Czyli w p.1 sprawdzasz najpierw czy w ogóle $_GET['id_cytatu'] istnieje (isset).
Odnośnie try/catch - zrezygnuj z tego na razie, bo na tym etapie może Ci zakłócać zrozumienie reszty. Potem koniecznie z try/catch, ale na razie to wyrzuć.
bostaf
Cytat(Drapeta @ 17.06.2017, 02:19:23 ) *
Nie rozumiem w ogóle idei tego... Bo jeśli header mam wstawić przed echo, to od razu muszę po części odpowiedzialnej za losowanie cytatu, gdzie $row jest jeszcze nie zdefiniowane. Wtedy w url dodaje mi ?id= i nic poza tym. Czyli źle definiuję $idCytatu? Dzięki...

Po kolei Drapeta. Na razie nie zrobiłeś tego o czym kilka osób tutaj Ci napisało - nie ma w twoim kodzie żadnego ifa. Zrób dokładnie tak jak napisałem. Jeszcze raz podaję co i jak, i w nawiasach dodaję jak w języku programistycznym rozumieć słowa "sprawdź czy", "jeżeli", "jeśli nie", "istnieje". Na razie zrezygnuj z try/catch. Będzie prościej na początek. Później sobie dodasz.

1. Sprawdzenie (isset), czy id_cytatu jest (isset) przekazane GETem ($_GET['id']). (żadnego echa na razie)
1.1. Jeśli jest (if), to pobranie z bazy cytatu z tym id. Ale na razie żadnego echa - zapamiętaj w zmiennej, np. $cytat. (żadnego echa na razie)
1.2. Jeśli nie (else), to sprawdzenie czy istnieje (isset) ciastko z zapisanym id ulubionego cytatu ($_COOKIE['id__ulubionego_cytatu']). (żadnego echa na razie)
1.2.1. Jeśli istnieje, to przekierowanie (header i exit) na url z id tego cytatu pobranym z ciastka ($_COOKIE). (żadnego echa na razie)
1.2.2. Jeśli nie istnieje, to wylosowanie cytatu i zapamiętanie go w zmiennej $cytat. (żadnego echa na razie)
2. Wydrukowanie (echo / czysty HTML po zamknięciu bloku kodu php "?>") strony razem z cytatem $cytat ORAZ ikonką polubienia cytatu z odpowiednim javascriptem zapisującym ciastko.
Drapeta
Kto i za ile zrobi mi to w php? wink.gif
leonpro778
To już chyba kategoria zlecenie czy coś tam smile.gif

Napisz lepiej z czym masz dalej problem bo tutaj masz wszystko rozpisane od podstaw.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.