Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] system newsow
Forum PHP.pl > Forum > Przedszkole
zomb
Witam,
Piszę system newsów na swoja stronę, mam już dodawanie, wyświetlanie, edycje. Nie działa to jeszcze w 100% sprawnie. Link: http://91.121.10.107/busines/index.php
Po zalogowaniu jako admin mam pod każdym newsem przycisk Edytuj news. Jeżeli go nacisnę pokazują mi sie wszystkie newsy do edycji, oraz gdy coś edytuje to edytują się także wszystkie newsy.
Więc tutaj pytanie: jak zrobić aby było tak jak powinno? Nie będę śmiecił i wklejał tutaj wszystkie pliki, myślę że wiecie o co mi chodzi. Moje zapytania do bazy wyglądają tak:
  1. mysql_query("UPDATE `news` SET `tytul` = '$tytul', `tresc` = '$tresc', `autor` = '$autor' ;");

  1. SELECT * FROM news

wiem że trzeba dodać w zapytaniu WHERE (przynajmniej tak mi się wydaje) ale niestety nie wiem co i jak. Proszę o pomoc, jeżeli będzie potrzeba dodam wszystkie pliki.
Spawnm
daj where id=$id gdzie $id to id edytowanego newsa
zomb
jak dodam WHERE `id` = '$id' to niestety ale po kliknieciu w edytuj nic sie nie pokazuje. Może jednak dam pliki:
news_pokaz.php:
http://wklej.org/hash/d4dac7d52a/
news_edytuj.php:
http://wklej.org/hash/ef78afbfbf/
news_edytuje.php:
http://wklej.org/hash/7fa3455610/

Wiem że jest to dość opornie zrobione ale jak na mój pierwszy system news myśle że dobrze.
Blame
Do news_pokaz.php dodajesz sobie w linijce 42:
  1. if ($pokaz1['ranga'] == 'admin'){
  2. $zapytanie = "SELECT * FROM news";
  3.  
  4. $wykonaj = @mysql_query ($zapytanie);
  5.  
  6. while($pokaz = @mysql_fetch_array($wykonaj)){
  7.  
  8. echo '<a href="news_edytuj.php?id='.$pokaz['id].'" >Edytuj news</a>';}
  9.  
  10. }}


W news-edytuj.php 6 i 7 linijkę zmieniasz na:

  1. $id=$_GET['id'];
  2. $zapytanie = "SELECT * FROM news WHERE 'id'='$id'";


Powinno działać. Aha, i na twoim miejscu, scaliłbym news_edytuj i news_edytuje.
zomb
dodane, lecz teraz pokazuje tylko 1 news oraz dalej nie pokazuje po naciśnięciu edytuj, admin testowy: test/test
Blame
Poprawione:
  1. if ($pokaz1['ranga'] == 'admin'){
  2.  
  3. $zapytanie = "SELECT * FROM news";
  4.  
  5.  
  6.  
  7. $wykonaj = @mysql_query ($zapytanie);
  8.  
  9.  
  10.  
  11. while($pokaz = @mysql_fetch_array($wykonaj)){
  12.  
  13.  
  14.  
  15. echo '<a href="news_edytuj.php?id='.$pokaz['id'].'" >Edytuj news</a>';}
  16.  
  17.  
  18.  
  19. }}}


  1. $id=$_GET['id'];
  2.  
  3. $zapytanie = "SELECT * FROM news WHERE id='$id'";

Przepraszam za błąd, skrypt pisany na szybko.
zomb
wiem, poprawiłem te błędy szybciej lecz dalej to samo
(link do strony http://91.121.10.107/busines login: test haslo: test )
potreb
W formaulrzu edycji do action należy także dodać ?id=$pokaz['id']

Popatrzyłem w źródło formularza i rzeczywiście nie przekazujesz dalej zmiennej id, to skąd skrypt ma wiedzieć co edytować.
zomb
wiec co mam jeszcze dodać w pliku news_edytuj i w news_edytuje ?
po tych poprawkach w news_pokaz pokazuje tylko 1 news oraz kilka napisów edytuj news
Blame
A poprawiłeś kod tak jak podałem w poprzednim poście? Chodzi mi o jeszcze jedną klamrę na końcu. Specjalnie dla ciebie prze edytowałem plik news_edytuj.php teraz nie potrzebny ci już news_edytuje.php. Mam nadzieję że będzie działać. Oto on:
  1. <?
  2. if(!empty($_SESSION['login'])){
  3.  
  4. include("config.php");
  5.  
  6.  
  7. $id=$_GET['id'];
  8.  
  9. $zapytanie = "SELECT * FROM news WHERE 'id'='$id'";
  10.  
  11. $wykonaj = @mysql_query ($zapytanie);
  12. while($pokaz = @mysql_fetch_array($wykonaj)){
  13.  
  14. ?>
  15. <form action="news_edytuj.php?id=<?$id?>" method="post">
  16. <table>
  17. <tr>
  18. <td width="132"><b>id :</b></td>
  19. <td width="139"><? echo $pokaz['id']; ?></td>
  20. </tr>
  21. <tr>
  22. <td><b>tytul :</b></td>
  23. <td><input name="tytul" type="text" value="<? echo $pokaz['tytul']; ?>" /></td>
  24. </tr>
  25. <tr>
  26. <td><b>tresc :</b></td> <td><input name="tresc" type="text" value="<? echo $pokaz['tresc']; ?>" /></td>
  27. </tr>
  28. <tr>
  29. <td><b>autor :</b></td> <td><input name="autor" type="text" value="<? echo $pokaz['autor']; ?>" /></td>
  30. </tr>
  31. <tr>
  32. <td><b>data:</b></td> <td><? echo $pokaz['data']; ?></td>
  33. </tr>
  34.  
  35. <tr>
  36. <td></td>
  37. <td>
  38. </td>
  39. </tr>
  40. </table>
  41. <input type="submit" value="Zmien dane" />
  42. </form>
  43.  
  44. <?
  45. }
  46.  
  47. }else{ header("location:index.php"); }
  48.  
  49. $id=$_GET['id'];
  50. $tytul = $_POST['tytul'];
  51. $tresc = $_POST['tresc'];
  52. $autor = $_POST['autor'];
  53.  
  54.  
  55.  
  56. mysql_query("UPDATE `news` SET `tytul` = '$tytul', `tresc` = '$tresc', `autor` = '$autor' WHERE id='$id'");
  57.  
  58. }
  59.  
  60. ?>
zomb
tak, dodałem tą klamrę na końcu. Teraz nie potrzeba tej klamry w linii 59. Wgrałem to lecz niestety znowu nic się nie pokazuje:
http://91.121.10.107/busines/news_edytuj.php?id=9
oraz co z plikiem news_pokaz.php pokazuje się tylko 1 news i kilka przycisków Edytuj news.
potreb
Pomaganie w kodzie nie oznacza, że ktoś ma ci dawać do wklejenia całego przerobionego kodu. Trochę własnej inwencji. Pokazuj to co do tej zrobiłeś. To, że podasz nam url nie oznacza, że wszystko jest dla nas wiadome.

I najważniejsze, mam dane administratora, preparuje formularz i mogę zrobić sql injection lub nawet przez zwykłego geta. Przydałoby się przynajmniej minimalnie zabezpieczyć przed takimi rzeczami.


  1.  
  2. if(isset($_POST['submit'])) {
  3. $id=$_GET['id'];
  4. $tytul = $_POST['tytul'];
  5. $tresc = $_POST['tresc'];
  6. $autor = $_POST['autor'];
  7.  
  8.  
  9.  
  10. mysql_query("UPDATE `news` SET `tytul` = '$tytul', `tresc` = '$tresc', `autor` = '$autor' WHERE id='$id'");
  11. }


Nie trzeba klamry :/ zauważ, że musisz mieć przynajmniej jakiś warunek dla edycji, bo edycja za każdym razem będzie się robiła, tyle że nie ma wartości, a parametr id przekazywałbym poprzez formularz i sprawdzałbym przy okazji czy jest to liczba.
zomb
zapomniałem dodać ale to chyba jest jasne że jestem początkujący ... może mi powiecie jak to zabezpieczyć? Naniosłem kilka poprawek w tym co mi podaliście typu 'id='$id' na id=.. i pokazywanie newsów działa już prawidłowo. Gdy kliknę Edytuj news pojawia mi się formularz lecz gdy zatwierdzę zmiany dane się nie zmieniają ;/ oto news_edytuj.php:
  1. <?php
  2. include("config.php");
  3.  
  4.  
  5. $id=$_GET['id'];
  6.  
  7. $zapytanie = "SELECT * FROM news WHERE id='$id'";
  8.  
  9. $wykonaj = @mysql_query ($zapytanie);
  10. while($pokaz = @mysql_fetch_array($wykonaj)){
  11.  
  12. ?>
  13. <form action="news_edytuj.php?id=<?$id?>" method="post">
  14. <table>
  15. <tr>
  16. <td width="132"><b>id :</b></td>
  17. <td width="139"><? echo $pokaz['id']; ?></td>
  18. </tr>
  19. <tr>
  20. <td><b>tytul :</b></td>
  21. <td><input name="tytul" type="text" value="<? echo $pokaz['tytul']; ?>" /></td>
  22. </tr>
  23. <tr>
  24. <td><b>tresc :</b></td> <td><input name="tresc" type="text" value="<? echo $pokaz['tresc']; ?>" /></td>
  25. </tr>
  26. <tr>
  27. <td><b>autor :</b></td> <td><input name="autor" type="text" value="<? echo $pokaz['autor']; ?>" /></td>
  28. </tr>
  29. <tr>
  30. <td><b>data:</b></td> <td><? echo $pokaz['data']; ?></td>
  31. </tr>
  32.  
  33. <tr>
  34. <td></td>
  35. <td>
  36. </td>
  37. </tr>
  38. </table>
  39. <input type="submit" value="Zmien dane" />
  40. </form>
  41.  
  42. <?
  43. }
  44.  
  45. if(isset($_POST['submit'])) {
  46. $id=$_GET['id'];
  47. $tytul = $_POST['tytul'];
  48. $tresc = $_POST['tresc'];
  49. $autor = $_POST['autor'];
  50.  
  51.  
  52.  
  53. mysql_query("UPDATE news SET `tytul` = '$tytul', `tresc` = '$tresc', `autor` = '$autor' WHERE id='$id'");
  54. }
  55.  
  56.  
  57.  
  58. ?>
potreb
  1. <input type="submit" name="submit" value="Zmien dane" />


Warunek isset($_POST['submit']) sprawdza czy jest taka tablica, więc trzeba było dodać do submit name="submit".

Zamień mysql_query("UPDATE ... poniższym kodem.
  1. $sql = "UPDATE news SET `tytul` = '$tytul', `tresc` = '$tresc', `autor` = '$autor' WHERE id='". $id."' ";
  2. echo $sql; // wyświetlę sobie zmienną $sql i wtedy zobaczę czy zapytanie jest okey
  3. echo mysql_error(); // w razie wystąpienia błędu dostanę info o błędzie


Przy okazji sprawdzę czy id jest liczbą:
  1. if(isset($_POST['submit']) && ctype_digit($_GET['id'])) {


Przy okazji pousuwaj wszystkie małpy z przed funkcji.

Co to?? Skrótowy zapis?? Raczej nie.
  1. <form action="news_edytuj.php?id=<?$id?>" method="post">


Raczej tak
  1. <form action="news_edytuj.php?id=<?php echo $id; ?>" method="post">


Zrób o to co cię prosiłem i napisz o efektach.
zomb
UPDATE news SET `tytul` = '00000', `tresc` = '00000', `autor` = '00000' WHERE id='9'

W końcu wszystko działa jak należy winksmiley.jpg) dzięki wielkie. Mógłbyś mi jeszcze powiedzieć jak to zabezpieczyć ?
Blame
Poczytaj trochę o mysql_real_escape_string, addslashes i htmlspecialchars. Dodam tylko tyle, że musisz nimi potraktować wszystkie dane które użytkownik wpisuje do formularza.
zomb
ok, wiem o co z tym chodzi, w najbliższym czasie poprawię to. Teraz skrypt wygląda tak:
  1. <?php
  2. include("config.php");
  3.  
  4.  
  5. $id=$_GET['id'];
  6.  
  7. $zapytanie = "SELECT * FROM news WHERE id='$id'";
  8.  
  9. $wykonaj = @mysql_query ($zapytanie);
  10. while($pokaz = @mysql_fetch_array($wykonaj)){
  11.  
  12. ?>
  13. <form action="news_edytuj.php?id=<?php echo $id; ?>" method="post">
  14. <table>
  15. <tr>
  16. <td width="132"><b>id :</b></td>
  17. <td width="139"><? echo $pokaz['id']; ?></td>
  18. </tr>
  19. <tr>
  20. <td><b>tytul :</b></td>
  21. <td><input name="tytul" type="text" value="<? echo $pokaz['tytul']; ?>" /></td>
  22. </tr>
  23. <tr>
  24. <td><b>tresc :</b></td> <td><input name="tresc" type="text" value="<? echo $pokaz['tresc']; ?>" /></td>
  25. </tr>
  26. <tr>
  27. <td><b>autor :</b></td> <td><input name="autor" type="text" value="<? echo $pokaz['autor']; ?>" /></td>
  28. </tr>
  29. <tr>
  30. <td><b>data:</b></td> <td><? echo $pokaz['data']; ?></td>
  31. </tr>
  32.  
  33. <tr>
  34. <td></td>
  35. <td>
  36. </td>
  37. </tr>
  38. </table>
  39. <input type="submit" name="submit" value="Zmien dane" />
  40. </form>
  41.  
  42. <?
  43. }
  44.  
  45. if (isset($_POST['submit']) && ctype_digit($_GET['id'])) {
  46. $id=$_GET['id'];
  47. $tytul = $_POST['tytul'];
  48. $tresc = $_POST['tresc'];
  49. $autor = $_POST['autor'];
  50.  
  51. $sql = "UPDATE news SET `tytul` = '$tytul', `tresc` = '$tresc', `autor` = '$autor' WHERE id='". $id."' ";
  52. mysql_query($sql) or die("Wystąpił błąd" );
  53.  
  54. echo '<font style="size:14px;position:relative;margin:0px auto;top:300px;"><center><b>Dane zostały zmienione.</b> <br /> Zachwile zostaniesz przekierowany na strone główną.<br />Jeżeli sie to sie stanie kliknij <a href="index.php">tutaj</a>.</font></center><meta http-equiv="refresh" content="4; URL=index.php"> ';
  55.  
  56. }
  57. ?>


teraz mam jeszcze jedno pytanie: jak dodać edycję tylko dla admina, bo każdy może sobie wejść i edytować to. Gdy dodaje do kodu " if ($pokaz['ranga'] == 'admin'){ " niestety znowu ale tylko białe tło ;/
thek
A od kiedy to w informacji o newsach wciskasz typ użytkownika?
$pokaz['ranga'] == 'admin' nie ma prawa działać, bo $pokaz przechowuje informacje o newsie, która to zmienna jest efektem zapytania: "SELECT * FROM news WHERE id='$id'"
Jak Tyś tam rangę wcisnął to nie wiem smile.gif
Musisz informację o użytkowniku wyciągnąć z bazy w locie, albo pobrać jego uprawnienia z sesji. Dopiero na tej podstawie decydujesz czy user ma prawo edytować czy nie.
zomb
ok, fakt, nie zauważyłem.
Jeszcze jedno pytanie: jak "odwrócić" kolejność pokazywania newsów. Chodzi o to, że jak dodam teraz jakiś news to pokazuje on się "na dole" a nie "na górze".
Czekam na pomoc
Blame
Przy $zapytanie dajesz:
  1. $zapytanie = "SELECT * FROM news WHERE id='$id' ORDER BY id desc";
zomb
ok, dziek, jeżeli to nie będzie problemem to potrzebowałbym jeszcze jednej rzeczy: podział newsów na strony ... Czy ktoś mógłby mi powiedzieć jak to zrobić bo chciałbym już ukończyć tą strone.
Blame
To się nazywa stronicowanie poszukaj w google, tego jest od groma.
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.