Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Przekazywanie zmiennych POST
Forum PHP.pl > Forum > Przedszkole
kecajs
Witam,
jestem początkujący w programowaniu i chcę zmierzyć się z czymś takim.
Mam bazę i z bazy - poleceniem SELECT - wyciągam rekordy określone jako "1". Tworzy się tabela i zależy mi, aby numer kolejny, oznaczony jako "Lp" lub "ID" był linkiem do strony, w której znajdą się dodatkowe informacje o produkcie z tego pola. Przykładowo: wybieram rekord oznaczony w polu "Lp" numerem 13 i pojawia mi się okno (tabela) z pobranymi z bazy z danej tabeli dane dotyczące rekordu z pozycji 13. Numer z pola "Lp" jest także linkiem do tabeli tworzonej dynamicznie (pobiera dane z bazy).
Dotarłem do tego linku http://forum.php.pl/php_przekazanie_zmiennej_przez_klikniecie_w_link_t45066.html , ale za czorta nie potrafię dopasować tego do mojego zadania.
Będę ogromnie wdzięczny za pomoc z uporaniem się z tym zagadnieniem.
Pozdrawiam,
szakal
Kshyhoo
Pokaż, jak to robisz (kod).
kecajs
Hmm, na razie to wyciągam dane z bazy poleceniem SELECT. Mam problem, żeby coś zrobić z tego przykładu, dlatego szukam jakiegoś wsparcia na forum smile.gif Wsparcia, nie gotowca.
Kshyhoo
Dlatego pokaż kod. Skąd mamy wiedzieć, co robisz źle?
kecajs
Oto kod:

  1. <body>
  2. <center><strong>Zestawienie pozostałych materiałów</strong></center><br><br>
  3. <table border="1" width=800 align=center cellpadding=2>
  4. <tr>
  5. <td width="20" class="table_small">Lp</td>
  6. <td width="120" class="table_small">Nazwa</td>
  7. <td width="100" class="table_small">Opis</td>
  8. <td width="30" class="table_small">Materiał</td>
  9. <td width="40" class="table_small">Dostawca</td>
  10. <td width="40" class="table_small">Producent</td>
  11. <td width="30" class="table_small">Lokacja</td>
  12. <td width="30" class="table_small">Waga</td>
  13. <td width="30" class="table_small">Stan</td>
  14. </tr>
  15. <?php
  16. include_once ("db_con.php");
  17. $connection = dbconn::instance();
  18. $wynik = $connection->query("SELECT m.PozostID, m.Nazwa, m.Opis, m.Material, l.DostawcyID, l.ProducentID, m.Lokacja, m.Waga, m.Stan FROM tb_pozost_main AS m LEFT JOIN tb_pozost_dostawy AS l ON m.PozostID=l.PozostID ORDER BY Nazwa ASC");
  19. while ($r = mysql_fetch_assoc($wynik)) {
  20. echo '<tr>';
  21. echo '<td width="20" class="table_small">' . $r['PozostID'] . '</a></td>';
  22. echo '<td width="120" class="table_small">' . $r['Nazwa'] . '</td>';
  23. echo '<td width="100" class="table_small">' . $r['Opis'] . '</td>';
  24. echo '<td width="30" class="table_small">' . $r['Material'] . '</td>';
  25. echo '<td width="40" class="table_small">' . $r['DostawcyID'] . '</td>';
  26. echo '<td width="40" class="table_small">' . $r['ProducentID'] . '</td>';
  27. echo '<td width="30" class="table_small">' . $r['Lokacja'] . '</td>';
  28. echo '<td width="30" class="table_small">' . $r['Waga'] . '</td>';
  29. echo '<td width="30" class="table_small">' . $r['Stan'] . '</td>';
  30. echo "</tr>";
  31. }
  32. ?>
  33. </table>
  34. </body>


I nie wiem za bardzo, jak to ruszyć dalej sad.gif
Ogarniam, aby wyświetlić tę drugą tabele wywołuję ją tak:
  1. <?php
  2. echo '<a href="tb_dane.php?ID=' . $link[$i] . '">' . $link[$i] . '</a>';
  3. ?>

Ale co przypisać do zmiennej $link...
Kshyhoo
Musisz spreparować link, żeby $r['PozostID'] (bo rozumiem, że to jest Twoje ID), rzekazać jako parametr. Potem odbierasz to z $_GET i przekazujesz do zapytania: WHERE i tu Twoje ID. Bo chyba o to chodzi?
kecajs
No tak, o to chyba chodzi. Poza tym, jak się to czyta, to wszystko jest proste... A w praktyce jak się do tego zabrać?
Kshyhoo
Przeparujesz link :
  1. echo '<a href="index.php?go=pokaz&artykul_id='.$r['PozostID'].'">zobacz artykuł ID '.$r['PozostID'].'</a>';

W skrypcie odpowiedzialnym za wyświetlenie artykułu, np.:
  1. if (isset($_GET['PozostID']) && $_GET['PozostID'] != '') {
  2. $tut_nr = mysql_real_escape_string($_GET['PozostID']);
  3. $zapytanie1 = "SELECT ... WHERE PozostID=PozostID...";

kecajs
Wracam do tematu :)

Ten fragment

  1. if (isset($_GET['PozostID']) && $_GET['PozostID'] != '') {
  2. $tut_nr = mysql_real_escape_string($_GET['PozostID']);
  3. $zapytanie1 = "SELECT ... WHERE PozostID=PozostID...";


wstawiam do pliku, w którym będzie tabela prezentująca poszczególne informacje o wywołanym artykule?
Czy ten plik ma wyglądać jak ten fragment w moim poście, tj. najpierw konstrukcja tabeli z nagłówkami, następnie wywołanie połączenia z bazą i prezentacja, tak jak na poniższym przykładzie?

  1. <?php
  2. include_once ("db_con.php");
  3. $connection = dbconn::instance();
  4.  
  5. if (isset($_GET['PozostID']) && $_GET['PozostID'] != '') {
  6. $tut_nr = mysql_real_escape_string($_GET['PozostID']);
  7. $zapytanie1 = "SELECT ... WHERE PozostID=PozostID...";
  8.  
  9. $wynik = $connection->query("SELECT ... WHERE PozostID=PozostID ORDER BY Nazwa ASC");
  10. while ($r = mysql_fetch_assoc($wynik)) {
  11. echo '<tr>';
  12. echo '<td width="20" class="table_small">' . $r['PozostID'] . '</a></td>';
  13. echo '<td width="120" class="table_small">' . $r['Nazwa'] . '</td>';
  14. echo '<td width="100" class="table_small">' . $r['Opis'] . '</td>';
  15. echo '<td width="30" class="table_small">' . $r['Material'] . '</td>';
  16. echo '<td width="40" class="table_small">' . $r['DostawcyID'] . '</td>';
  17. echo '<td width="40" class="table_small">' . $r['ProducentID'] . '</td>';
  18. echo '<td width="30" class="table_small">' . $r['Lokacja'] . '</td>';
  19. echo '<td width="30" class="table_small">' . $r['Waga'] . '</td>';
  20. echo '<td width="30" class="table_small">' . $r['Stan'] . '</td>';
  21. echo "</tr>";
  22. }
  23. ?>


Czy dobrze myślę???
A plik ten, w którym są wyświetlane te informacje jak nazwać - pokaz.php?

Pozdrawiam,
szakal

Utworzyłem nowy plik i nazwałem go pokaz.php.
Kod wygląda tak:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>
  2. <head>
  3. <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  4.  
  5. <link rel="stylesheet" href="style.css" type="text/css">
  6. </head>
  7. <body>
  8. <h1><center>Szczegóły asortymentu</center></h1><br>
  9. <table border="1" width="90%" align=center cellpadding=2>
  10. <tr>
  11. <td width="20" class="table_small">Lp</td>
  12. <td width="130" class="table_small">Nazwa</td>
  13. <td width="40" class="table_small">Materiał</td>
  14. <td width="60" class="table_small">Dostawca</td>
  15. <td width="60" class="table_small">Producent</td>
  16. <td width="50" class="table_small">Lokacja</td>
  17. <td width="40" class="table_small">Waga</td>
  18. <td width="40" class="table_small">Stan</td>
  19. </tr>
  20. <?php
  21. include_once ("db_con.php");
  22. $connection = dbconn::instance();
  23.  
  24. // tutaj wywolanie zapytania do bazy
  25. if (isset($_GET['LacznikID']) && $_GET['LacznikID'] != '') {
  26. $tut_nr = mysql_real_escape_string($_GET['LacznikID']);
  27. $wynik = $connection->query("
  28. SELECT
  29. LacznikID,
  30. Nazwa,
  31. Material,
  32. DostawcaID,
  33. ProducentID,
  34. Lokacja,
  35. Waga,
  36. Stan
  37. FROM
  38. tb_laczniki_main
  39. WHERE
  40. LacznikID=LacznikID
  41. ORDER BY
  42. LacznikID ASC
  43. ");
  44.  
  45.  
  46. while ($r = mysql_fetch_assoc($wynik)) {
  47. echo '<tr>';
  48. echo '<td width="20" class="table_small">' .$r['LacznikID']. '</td>';
  49. echo '<td width="130" class="table_small">' . $r['Nazwa'] . '</td>';
  50. echo '<td width="40" class="table_small">' . $r['Material'] . '</td>';
  51. echo '<td width="60" class="table_small">' . $r['DostawcaID'] . '</td>';
  52. echo '<td width="60" class="table_small">' . $r['ProducentID'] . '</td>';
  53. echo '<td width="50" class="table_small">' . $r['Lokacja'] . '</td>';
  54. echo '<td width="40" class="table_small">' . $r['Waga'] . '</td>';
  55. echo '<td width="40" class="table_small">' . $r['Stan'] . '</td>';
  56. echo "</tr>";
  57. }
  58. ?>
  59. </table>
  60. <?php
  61. </body>
  62. </html>

Problem jest taki, że nawet mi się nic nie pojawia, tylko strony nie ma. Jak mam nazwać plik, w którym będą prezentowane szczegółowe informacje o danym asortymencie, wybranym na podstawie LacznikID?
Czy kod jest prawidłowy?
Dzięki za wskazówki,
szakal
bobek358
Jak dla mnie masz błąd w zapytaniu.
Tutaj

  1. if (isset($_GET['LacznikID']) && $_GET['LacznikID'] != '') {
  2. $tut_nr = mysql_real_escape_string($_GET['LacznikID']);


przypisujesz zmienną LicznikID z GET do zmiennej $tut_nr i jej już nigdzie nie używasz.
A później masz:

  1. $wynik = $connection->query("
  2. SELECT
  3. LacznikID,
  4. Nazwa,
  5. Material,
  6. DostawcaID,
  7. ProducentID,
  8. Lokacja,
  9. Waga,
  10. Stan
  11. FROM
  12. tb_laczniki_main
  13. WHERE
  14. LacznikID=LacznikID
  15. ORDER BY
  16. LacznikID ASC
  17. ");


gdzie nie masz czegoś takiego jak "LacznikID=LacznikID" jak już to
  1. LicznikID = $tut_nr

kecajs
A zwrot
  1. WHERE LacznikID=LacznikID
nie wystarczy?
Przypisanie parametru LacznikID do zmiennej $tut_nr odbywa się bez dodatkowych ciapek czy dodatków - po prostu tak, jak Ty to zrobiłeś powyżej:
  1. $tut_nr = LacznikID
. Dobrze myślę?
szakal
bobek358
Przypisanie wartości odbywa się w:

  1. $tut_nr = mysql_real_escape_string($_GET['LacznikID']);


przypisujesz wartość zmiennej get licznikid do tut_nr i teraz musisz jej uzyc w zapytaniu:

  1. FROM
  2. tb_laczniki_main
  3. WHERE
  4. LacznikID=$tut_nr
  5. ORDER BY
  6. LacznikID ASC


Dla mysql zapis WHERE LacznikID=LacznikID oznacza przypisanie do warunku stringa LicznikID a nie zmiennej (string dodatkowo powinien być w apostrofach).
kecajs
Dalej jest tak samo :( A jeszcze mam pytanie o nazwę pliku, w którym prezentowane są dane szczegółowe. Z tabeli wywoływany jest poniższą komendą:
  1. echo '<a href="index.php?go=pokaz&artykul_id='.$r['PozostID'].'">zobacz artykuł ID '.$r['PozostID'].'</a>';

Plik ten, w którym prezentowane są dane nazwałem pokaz.php. Jak go powinienem nazwać prawidłowo?
szakal
Kshyhoo
Przecież masz jasno: index.php?go=pokaz, czyli plik wciąż ten sam, tylko inna sekcja kodu, odpowiedzialna za wyświetlenie jednego artykułu. Kod, który wkleiłem, to tylko zalążek skryptu, żeby pokazać zasadę działania - sam musisz sobie dopasować do swoich potrzeb... Inaczej się nie nauczysz i z byle pierdołą będziesz wracał na Forum.
kecajs
Chyba znalazłem "winowajcę". Zamiast ?go= wpisałem ?sr= - tak jak jest u mnie:
  1. <a href="index.php?sr=form_zam_lacz">Łączniki</a>

Teraz w końcu coś się dzieje i mam błąd:
Parse error: syntax error, unexpected end of file in D:\PROJEKTY WWW\MZ - magazyn\pokaz.php on line 71

Pełny kod jest taki:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>
  2. <head>
  3. <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  4.  
  5. <link rel="stylesheet" href="style.css" type="text/css">
  6. </head>
  7.  
  8. <body>
  9. <h1><center>Szczegóły asortymentu</center></h1><br>
  10.  
  11. <table border="1" width="90%" align=center cellpadding=2>
  12. <tr>
  13. <td width="20" class="table_small">Lp</td>
  14. <td width="130" class="table_small">Nazwa</td>
  15. <td width="40" class="table_small">Materiał</td>
  16. <td width="60" class="table_small">Dostawca</td>
  17. <td width="60" class="table_small">Producent</td>
  18. <td width="50" class="table_small">Lokacja</td>
  19. <td width="40" class="table_small">Waga</td>
  20. <td width="40" class="table_small">Stan</td>
  21. </tr>
  22. <?php
  23. include_once ("db_con.php");
  24. $connection = dbconn::instance();
  25.  
  26. // tutaj wywolanie zapytania do bazy
  27. if (isset($_GET['LacznikID']) && $_GET['LacznikID'] != '') {
  28. $tut_nr = mysql_real_escape_string($_GET['LacznikID']);
  29. $wynik = $connection->query("
  30. SELECT
  31. LacznikID,
  32. Nazwa,
  33. Material,
  34. DostawcaID,
  35. ProducentID,
  36. Lokacja,
  37. Waga,
  38. Stan
  39. FROM
  40. tb_laczniki_main
  41. WHERE
  42. LacznikID=$tut_nr
  43. ORDER BY
  44. LacznikID ASC
  45. ");
  46.  
  47.  
  48. while ($r = mysql_fetch_assoc($wynik)) {
  49. echo '<tr>';
  50. echo '<td width="20" class="table_small">' .$r['LacznikID']. '</td>';
  51. echo '<td width="130" class="table_small">' . $r['Nazwa'] . '</td>';
  52. echo '<td width="40" class="table_small">' . $r['Material'] . '</td>';
  53. echo '<td width="60" class="table_small">' . $r['DostawcaID'] . '</td>';
  54. echo '<td width="60" class="table_small">' . $r['ProducentID'] . '</td>';
  55. echo '<td width="50" class="table_small">' . $r['Lokacja'] . '</td>';
  56. echo '<td width="40" class="table_small">' . $r['Waga'] . '</td>';
  57. echo '<td width="40" class="table_small">' . $r['Stan'] . '</td>';
  58. echo "</tr>";
  59. }
  60. ?>
  61. </table>
  62.  
  63. </body>
  64. </html>

Mam wrażenie, że mam wszystko pozamykane i plik kończy się tak, jak powinien...

Znalazłem, że w tej linii
  1. if (isset($_GET['LacznikID']) && $_GET['LacznikID'] != '') {
otwierany jest nawias klamrowy, zaś nie ma jego zamknięcia. Zamknąłem go przed funkcją while.
Teraz mam z kolei taki komunikat (ostrzeżenie):
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in D:\PROJEKTY WWW\MZ - magazyn\pokaz.php on line 49
i są tylko nagłówki tabeli, bez danych.
bobek358
Wyświetl dobie $wynik na ekran i wykonaj zapytanie w phpMA. Będziesz wiedział co masz nie tak w zapytaniu.
kecajs
Fakt, sprawdzę. Ciągle zapominam o tej prostej metodzie. :)
szakal


Odpaliłem kod w PMA i zwrócił mi coś takiego
  1. Błąd
  2. Zapytanie SQL:
  3.  
  4. IF( isset(
  5.  
  6. $_GET[ 'LacznikID']
  7. ) && $_GET[ 'LacznikID'] != '' ) {$tut_nr = mysql_real_escape_string(
  8. $_GET[ 'LacznikID']
  9. );
  10.  
  11. MySQL zwrócił komunikat: Dokumentacja
  12.  
  13. #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if (isset($_GET['LacznikID']) && $_GET['LacznikID'] != '') {
  14. $tut_nr = ' at line 1

Próbowałem znaleźć w Googlach jakiejś podpowiedzi, ale nie wiem, na co mam zwrócić uwagę :(
szakal
Comandeer
Erm… Jak sama nazwa wskazuje pma przyjmuje "zapytania SQL", nie kod PHP. Jak już to miałeś wkleić to zapytanie, które przekazujesz do $connection->query w linii 29.

Niemniej problem polega na tym, że $connection to obiekt mysqli/PDO (w każdym razie na pewno nie rozszerzenie mysql), natomiast wyniki i escape'owanie chcesz przeprowadzać biblioteką mysql, stąd oczywisty błąd.
kecajs
A będziesz tak uprzejmy i wyrozumiały i wskażesz mi jak poprawnie zrobić taką weryfikację? Tzn. co, gdzie uruchomić, wkleić i co dalej?
Uprzejmie dziękuję :)
szakal
Comandeer
A możesz pokazać kod łączenia się z bazą?
kecajs
Jasne,
oto on:
  1. <?php
  2. abstract class Singleton {
  3. protected static $_instance;
  4. protected function __construct() {
  5.  
  6. }
  7. public static function instance() {
  8.  
  9. }
  10.  
  11. }
  12. class dbconn extends Singleton {
  13. private $_conn;
  14. private $server = 'localhost';
  15. private $login = 'xxx';
  16. private $password = 'xxx';
  17. private $database = 'xxx';
  18. protected function __construct() {
  19. $this->_conn = mysql_connect($this->server, $this->login, $this->password) or die(mysql_error());
  20. mysql_select_db($this->database, $this->_conn) or die(mysql_error()); mysql_query("SET NAMES 'utf8'");
  21. }
  22. public static function instance() {
  23. if (is_null(self::$_instance)) {
  24. self::$_instance = new dbconn();
  25. }
  26. return self::$_instance;
  27. }
  28. public function query($query) {
  29. return mysql_query($query);
  30. }
  31. public function insert($query) {
  32. if (mysql_query($query)) {
  33. } else {
  34. return 0;
  35. }
  36. }
  37. public function select($query) {
  38. return mysql_num_rows(mysql_query($query));
  39. }
  40. public function escape($string) {
  41. return htmlspecialchars(strip_tags($string));
  42. }
  43. }
  44. ?>
Comandeer
Hm, a jednak się pomyliłem... To jest mysql. Pierwszy raz widzę tak pokręcone rozwiązanie.

Problem polega na tym, że należałoby się go pozbyć, bo mysql zostanie usunięty wraz z PHP 7, czyli za chwilę. Polecam przyjrzeć się PDO

Ok - co do debugu: zobacz co rzuca mysql_error: http://www.capaciouscore.pl/artykuly/podst...nych-zapytania/ i zobacz też co zwróci Ci var_dump dla tego zapytania z wewnątrz funkcji $connection->query
kecajs
Witam,
tak knuje sobie, dlaczego mam ten błąd...
Zastanawia mnie jedna rzecz w kodzie, który zamieściłem wcześniej.
Przecież skoro będą tu prezentowane dane konkretnego produktu i zawsze w ilości jednego egzemplarza, to po co mi sortowanie
  1. ORDER BY
  2. LacznikID ASC

Po co mi również informacja, że wyniki mają być przedstawione w wierszach:
  1. while ($r = mysql_fetch_assoc($wynik)) {

Sortowanie już wywaliłem, ale jak pozbyć się tej linikji z mysql_fetch_assoc?, tj. co wstawić w zamian?
Zdaję sobie sprawę, że zadaję z Waszego punktu widzenia pytania trywialne, jednak dla mnie są one podstawowe i będę wdzięczny za wyrozumiałość.
W tabeli tb_laczniki_main znajdują sie wszystkie dane wywoływane tym kodem - nie ma pustego wiersza.
Pozdrawiam,
szakal

Cytat(Comandeer @ 7.08.2015, 12:26:24 ) *
Hm, a jednak się pomyliłem... To jest mysql. Pierwszy raz widzę tak pokręcone rozwiązanie.


A czy takie rozwiązanie będzie bardziej wskazane - znalazłem je na którymś z forów? To poprzednie napisał mi ktoś jakiś czas temu i tak je stosuję :)

  1. <?php
  2. $db_connection = null;
  3. function polaczenie() {
  4. global $db_connection;
  5. $mysql_server = "xxx";
  6. $mysql_admin = "xxx";
  7. $mysql_pass = "xxx";
  8. $db_connection = mysql_connect($mysql_server, $mysql_admin, $mysql_pass) or die('Brak połączenia z serwerem MySQL.');
  9. @mysql_select_db($db_connection);
  10. }
  11. ?>

Zapisałbym je jako db_con.php.
Przy okazji - czy ten zwrot jest potrzebny i dlaczego?
  1. $connection = dbconn::instance();

samo includowanie nie wystarczy?
A co za tym idzie, dlaczego ten zwrot wygląda inaczej, niż przy innych przykładach zamieszczanych na forach?
  1. $wynik = $connection->query("zapytanie MySQL");

Pozdrawiam,
szakal
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.