Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Jak zrobić aby skrypt wyświetlał artykuł?
marmat00
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 13.08.2010

Ostrzeżenie: (0%)
-----


Mam nbaze danych zbudowaną tak:

  1. CREATE TABLE IF NOT EXISTS `mm_article` (
  2. `id` tinyint(255) NOT NULL,
  3. `name` varchar(255) NOT NULL,
  4. `art` varchar(255) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  7.  
  8.  
  9. CREATE TABLE IF NOT EXISTS `mm_menu` (
  10. `id` tinyint(255) NOT NULL AUTO_INCREMENT,
  11. `kod` varchar(255) NOT NULL,
  12. `zapytanie` varchar(255) NOT NULL,
  13. PRIMARY KEY (`id`)


i chciałbym aby po kliknięciu w link wyświetlał się artykuł.
w kolumnie kod jest takie coś:

  1. <a class="m-menu-tab" href="index.php">art</a><span class="hide"> | </span>


a w kolumnie zapytanie
  1. "SELECT art FROM `mm_article` WHERE `id` = 1 " ;


na stronie index:

  1. <?php
  2.  
  3. $link = mysql_connect("localhost", "system", "system")
  4. or die("Nie udało się połączyć: " . mysql_error());
  5. mysql_select_db('system', $link)
  6. $query1 = 'SELECT zapytanie FROM `mm_menu` ';
  7. $results1 = mysql_query($query1)
  8.  
  9. while ($row1 = mysql_fetch_array($results1)) {
  10. extract($row1);
  11. //echo "$zapytanie" ;
  12.  
  13. $query2 = $zapytanie ;
  14.  
  15.  
  16.  
  17.  
  18. $results2 = mysql_query($zapytanie)
  19.  
  20. while ($row2 = mysql_fetch_array($results2)) {
  21. extract($row2);
  22. echo "$art" ;
  23.  
  24.  
  25. }
  26. }
  27. ?>

jak to zrobić męczę się już 2 dni.

Ten post edytował Cysiaczek 5.09.2010, 22:54:27
Powód edycji: [Cysiaczek]: ort w temcie, dodałem tagi
Go to the top of the page
+Quote Post
Spawnm
post
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Proszę dodać bbcode oraz nadać sensowny tytuł.
Go to the top of the page
+Quote Post
wiiir
post
Post #3





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


Ty chyba jestes niepoważny z ta swoja baza danych, paranoja trzymac w bazie gotowe zapytania do konkretnych artykulow...
zrob to np tak
  1. // robisz link ktory okresla jaki id art bedziesz otwierac czyil np art=1, oczywisie jakie bedziesz mial to juz twoja sprawa
  2. // te id trzymasz w tabeli menu, jak generujesz to sobie przypisujesz do art
  3. <a class="m-menu-tab" href="index.php?act=1">art</a><span class="hide"> | </span>

  1. //odbierasz to id
  2. $id_act = $_POST['act'];
  3. // do zapytania z artykulami przekazyjesz jaki id art ma ci pobrac
  4. $query1 = 'SELECT * FROM mm_article where id = '.$id_art;
  5. //wykonujesz zapytanie
  6. $results1 = mysql_query($query1)
  7. // robisz tablice wynikowm jaka ci tam pasuje
  8. $row1 = mysql_fetch_array($results1) ; //zakladam ze bedzie tylko jeden art o konkretnym id
  9. // wyswietlasz nazwe artykulu
  10. echo $row1['name'];


Ten post edytował wiiir 5.09.2010, 00:35:48
Go to the top of the page
+Quote Post
masiakla
post
Post #4





Grupa: Zarejestrowani
Postów: 80
Pomógł: 17
Dołączył: 4.09.2010
Skąd: far far away

Ostrzeżenie: (0%)
-----


@wiiir:
1. A znajdziesz przy takim wywołaniu act w $_POST ?
2. Zakładasz, że będzie jeden art o tym id, ale nie zakładasz, że może go nie być w ogóle.
3. O odporności zapytania na sqlinjection już nie wspomnę.
Go to the top of the page
+Quote Post
CuteOne
post
Post #5





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


UP:
no przecież nie napisze mu całej wyszukiwarki artykułów sleep.gif

  1. // Tworzenie menu pobieranego z bazy danych //
  2. /*
  3. tabela menu:
  4. id - wiadomo unikatowy, autoin
  5. link_name - czyli tytuł linku
  6. status - link aktywny / nieaktywny
  7. możesz dodać style, kolejność wyświetlania(wtedy dodajesz ORDER BY ) i co tam jeszcze chcesz
  8. */
  9.  
  10. $menu = '';
  11.  
  12. $query = mysql_query("SELECT * FROM mm_article WHERE status = 1"); // pobiera wszystkie aktywne arty
  13.  
  14. while( $row = mysql_fetch_array($query) ) {
  15.  
  16. $menu .= '<a href="index.php?act='.$row['id'].'>'.$row['link_name'].'</a><span>|</span>';
  17. }
  18.  
  19. echo $menu;


  1. //odbierasz to id -> + jakaś filtracja
  2. $id_act = $_GET['act']; // zamiast $_POST ;)
  3. // do zapytania z artykulami przekazyjesz jaki id art ma ci pobrac
  4.  
  5. $results = mysql_query("SELECT * FROM mm_article where id = ".$id_art) or die(mysql_error());
  6. // robisz tablice wynikowm jaka ci tam pasuje
  7. $row = mysql_fetch_array($results) ; //zakladam ze bedzie tylko jeden art o konkretnym id
  8. // wyswietlasz nazwe artykulu
  9. echo $row['link_name'];


Ten post edytował CuteOne 5.09.2010, 01:10:02
Go to the top of the page
+Quote Post
masiakla
post
Post #6





Grupa: Zarejestrowani
Postów: 80
Pomógł: 17
Dołączył: 4.09.2010
Skąd: far far away

Ostrzeżenie: (0%)
-----


Chodzi mi głównie o druga część kodu. Pod act można wrzucić cokolwiek.

Punkt 3 mojego postu:
Cytat
$id_act = $_GET['act']; // zamiast $_POST winksmiley.jpg
$results = mysql_query("SELECT * FROM mm_article where id = ".$id_art) or die(mysql_error());

A tu zabezpieczenie się w tym przypadku jest bajecznie proste przed np. "1; DROP TABLE mm_article; --", z resztą żeby nie męczyć się i nie próbować szukać tabel, można zastrzyk rozwinąć.

Punkt 2 poprzedniego postu:
Cytat
$results = mysql_query("SELECT * FROM mm_article where id = ".$id_art) or die(mysql_error());
$row = mysql_fetch_array($results);
echo $row['link_name'];

Już nie pamiętam czy poleci warning czy fatal, ale w przypadku kiedy mysql_query nie zwróci nic z zapytania, brak rekordów, bo może się tak zdarzyć, że ktoś klepnie numerek jaki mu się podoba w adresie, to zaliczymy bardzo piękny error z php. A zabezpieczenie przed tym też jest bardzo proste.

Wychodzę z założenia, że jak już się komuś pomaga/podpowiada/whatever powinno się to robić rzetelnie. Jeżeli ktoś się pyta o tak podstawową sprawę, to raczej nei czaji zagadnień z zakresu sql injection, może gdzieś o tym słyszał, ale raczej nie wie nic. A dostawienie dwóch if'ów to nie jest wielki wysiłek.

Ten post edytował masiakla 5.09.2010, 01:25:28
Go to the top of the page
+Quote Post
marmat00
post
Post #7





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 13.08.2010

Ostrzeżenie: (0%)
-----


do kodu "wiiir" wywala taki błąd:

  1. Parse error: syntax error, unexpected T_VARIABLE in /var/www/virtual/system.marmathosting.pl/htdocs/index.php on line 105
Go to the top of the page
+Quote Post
amii
post
Post #8





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


Brak średnika ?
$results1 = mysql_query($query1)


--------------------
gry flash online
Dobry hosting i tanie odnowienia domen firma: masternet.
Zarabianie bez wysiłku na domenach bez ruchu: prolink.
Go to the top of the page
+Quote Post
marmat00
post
Post #9





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 13.08.2010

Ostrzeżenie: (0%)
-----


I NADAL TO SAMO
Go to the top of the page
+Quote Post
yevaud
post
Post #10





Grupa: Zarejestrowani
Postów: 471
Pomógł: 89
Dołączył: 29.07.2008
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(marmat00 @ 5.09.2010, 15:12:07 ) *
I NADAL TO SAMO


zamiast ryczec, wygoogluj co znaczy ten blad i sprawdz dlaczego wyskakuje w tej linii(nawet nie wkleiles co masz w tej linii) - to jest blad skladni
Go to the top of the page
+Quote Post
marmat00
post
Post #11





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 13.08.2010

Ostrzeżenie: (0%)
-----


  1. $row1 = mysql_fetch_array($results1) ;


Dodałem średnik tutaj

  1. $results1 = mysql_query($query1) ;


i teraz mam takie coś:

  1. Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/virtual/system.marmathosting.pl/htdocs/index.php on line 106
Go to the top of the page
+Quote Post
masiakla
post
Post #12





Grupa: Zarejestrowani
Postów: 80
Pomógł: 17
Dołączył: 4.09.2010
Skąd: far far away

Ostrzeżenie: (0%)
-----


Po za tym
Cytat(PHPManual)
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error.

Więc coś w zapytaniu masz zwalone.

Swoją droga popraw to wyświetlanie tak by nie było jaj jak nie ma artykułu o danym id:
  1. if($row = mysql_fetch_array($results1)){
  2. //tu wykonujesz jak jest art
  3. } else {
  4. //a tu jak go nie ma
  5. }


Po za tym co to jest 105 i 106 linia, nie jestem w stanie tego odnieść.

Ten post edytował masiakla 5.09.2010, 19:17:47
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #13





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




-> Przedszkole


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
wiiir
post
Post #14





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

Ostrzeżenie: (0%)
-----


Cytat(masiakla @ 5.09.2010, 01:42:05 ) *
@wiiir:
1. A znajdziesz przy takim wywołaniu act w $_POST ?
2. Zakładasz, że będzie jeden art o tym id, ale nie zakładasz, że może go nie być w ogóle.
3. O odporności zapytania na sqlinjection już nie wspomnę.


ad 1. Byla 1 w nocy wiec bylem spiacy moze dlatego napisalem post a nie get bo to chyba oczywiste ze mialo byc get (sry za blad)
ad 2. zalezenia dotyczyly tego jednego przypadku zeby pokazac mu na czym to ma polegac (wiem ze moze go nie byc albo moze byc stringiem itd)
ad 3. chyba zartujesz ze napisze mu caly gotowy skrypt z filtracja danych.

Napialem mu 5 linijek kodu zeby zrozumial jak moze to zrobic wiec nie bede pisal obslugi wszystkich mozliwych bledow
A jesli ktos bezmyslnie wkleja podany kod do swojego skryptu no to gratulacje lol.

Ten post edytował wiiir 5.09.2010, 23:06:59
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 10:21