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

Jak wyświetlać wiele rekordów z bazy danych, PHP

Object Storage Arubacloud
0 głosów
2,830 wizyt
pytanie zadane 8 grudnia 2017 w PHP przez kamilocl Nowicjusz (220 p.)

Witam, mam taki problem mianowicie muszę jako projekt szkolny wykonać formularz php z bazą danych oraz stronę na której będą się wyświetlały dane w określonym stylu i nie wiem kompletnie jak się za to zabrać... Jest ktoś kto może mi pomóc w tym mam już napisaną tabelę oraz bazę danych i formularz do wbijania ich i wszystko działa.
 


<table align="center" bordercolor="#FFFFFF" bgcolor="#FFFFFF">
  <tr>
    <td height="5" colspan="3" bgcolor="#FFFFFF"><img src="line/cc960.png" width="960" height="3" /></td>
  </tr>
  <tr>
    <td height="11" colspan="3" bgcolor="#000000"><div align="center"></div></td>
  </tr>
  <tr>
    <td height="5" colspan="3" bgcolor="#FFFFFF"><img src="line/cc960.png" width="960" height="3" /></td>
  </tr>
    <tr>
    <td width="401" bgcolor="#FFFFFF">&nbsp;</td>
    <td colspan="2" bgcolor="#FFFFFF"><img src="images/12.png" /></td>
  </tr>
  <tr>
    <td rowspan="13" bgcolor="#FFFFFF"><div align="center"><img src="gif/supersort.gif" width="300" height="300" /></div></td>
  <td colspan="2" bgcolor="#FFFFFF"><span class="style59">Nazwa  <span class="style39">(opis)</span></span>  
  </tr>
  <tr>
    <td colspan="2" bgcolor="#FFFFFF"><div align="center" class="style68">( opis dłuższy) </div></td>
  </tr>
  <tr>
    <td colspan="2" bgcolor="#FFFFFF" class="style68">Sztuki</td>
  </tr>
  <tr>
    <td height="5" colspan="2" bgcolor="#FFFFFF"><img src="line/cc_4.png" width="550" height="3" /></td>
  </tr>
  <tr>
    <td width="275"><div align="center" class="style39"> ( <strong>Minimum</strong> zamówienie ) </div></td>
    <td width="274"><div align="center"><span class="style39"><strong>Cena </strong> za sztuke </span></div></td>
  </tr>
  <tr>
    <td><div align="center" class="style39">36 <span class="style68">paczka</span></div></td>
    <td><div align="center" class="style39">10 &#1028;</div></td>
  </tr>
  <tr>
    <td><div align="center" class="style39">324 </div></td>
    <td><div align="center" class="style39">7,5 &#1028;</div></td>
  </tr>
  <tr>
    <td><div align="center" class="style39">648 </div></td>
    <td><div align="center" class="style39">7 &#1028;</div></td>
  </tr>
  <tr>
    <td bgcolor="#FFFFFF"><div align="center" class="style39">1296 </div></td>
    <td bgcolor="#FFFFFF"><div align="center" class="style39">6,5 &#1028;</div></td>
  </tr>
  <tr>
    <td height="5" colspan="2" bgcolor="#FFFFFF"><img src="line/cc_4.png" width="550" height="3" /></td

    >
  </tr>
  <tr>
    <td><div align="center" class="style53">
      <div align="left" class="style25">ID : 021217111 </div>
    </div></td>
    <td>&nbsp;</td>
  </tr>
  <tr>
 
</table>

Nie wiem jak sprawić żeby w miejsca takiej jak Nazwa pobierało nazwę z mojej tabeli itp.
Domyślam się że trzeba użyć pętli WHILE lecz nie wiem zbytnio jak... Oczywiście tych tabelek z danymi ma być tyle ile jest rekordów w bazie.


Za każdą pomoc dziękuję :)

4 odpowiedzi

+3 głosów
odpowiedź 8 grudnia 2017 przez xandros Nałogowiec (29,450 p.)
wybrane 9 grudnia 2017 przez kamilocl
 
Najlepsza

Imho trochę przekombinowana ta tabelka... tak już stron się nie robi. Ale pytanie nie o tym.

Dobra, najpierw połącznie z bazą:

function connect(): PDO
{
    static $pdo;
    if (!$pdo) {
        $pdo = new PDO('mysql:host=localhost;dbname=nazwa_mojej_bazy;charset=utf8;', 'root', '');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }

    return $pdo;
}

Jak chcemy uzyskać tylko jeden rekord:

function getProduct(string $id): array
{
    $stmt = connect()->prepare('SELECT * FROM products WHERE id = :id');
    $stmt->execute(['id' => $id]);

    return $stmt->fetch(PDO::FETCH_ASSOC);
}

Jak chcemy uzyskać wszystkie rekordy:

function getProducts(): Iterator
{
    $stmt = connect()->query('SELECT * FROM products', PDO::FETCH_ASSOC);
    foreach ($stmt as $product) {
        yield $product;
    }
}

W htmlu/templatce powinno wyglądać tak: (użyłem własnej, bo twoja jest nieczytelna)

<?php foreach(getProducts() as $product): ?>
    <article>
        <header>
            <h2><?= $product['title'] ?></h2>
            <p><small><?= $product['exerpt'] ?></small></p>
            <p><?= $product['description'] ?></p>
        </header>
        <section>
            <table>
                <thead>
                    <tr><td>( Minimum zamówienie )</td><td>Cena za sztuke</td></tr>
                </thead>
                <tbody>
                    <tr><td>36</td><td><?= $product['price_1'] ?></td></tr>
                    <tr><td>324</td><td><?= $product['price_2'] ?></td></tr>
                    <tr><td>648</td><td><?= $product['price_3'] ?></td></tr>
                    <tr><td>1296</td><td><?= $product['price_4'] ?></td></tr>
                </tbody>
            </table>
        </section>
        <footer><span>ID: <?= $product['id'] ?></span></footer>
    </article>
<?php endforeach; ?>

Wersja z mysqli:


function connect(): mysqli
{
    static $mysqli;
    if (!$mysqli) {
        $mysqli = new mysqli('localhost', 'root', '', 'nazwa_bazy_danych');
        mysqli_report(MYSQLI_REPORT_STRICT);
    }

    return $mysqli;
}

function getProducts(): Iterator
{
    $result = connect()->query('SELECT * FROM products');

    foreach ($result as $image) {

        yield $image;
    }
}

function getProduct(string $id): array
{
    $stmt = connect()->prepare('SELECT * FROM products WHERE id = :id');
    $stmt->bind_param('s', $id);
    $stmt->execute();

    return $stmt->get_result()->fetch_assoc();
}

Tak wyjaśniając dlaczego rzucam foreach na mysqli::query/pdo::query. 

W mysqli zwraca to obiekt mysqli_result,, a w PDO PDOStatement.

Od php 5.4 mysqli_result dostał interfejst  Traversable. Ten sam interfejs posiada PDOStatement.

Czyli jest iterowalny za pomocą foreach. More Info: http://php.net/manual/en/class.traversable.php

komentarz 9 grudnia 2017 przez kamilocl Nowicjusz (220 p.)
teraz jest wszytko jasne dla mnie :) dzięki wielkie dużo mi to rozjaśniło nie będę kopiował tylko spróbuje napisać sam ze wzoru twojego :)
komentarz 9 grudnia 2017 przez kamilocl Nowicjusz (220 p.)
Próbuje zrobić to twoim sposobem i nie działa nic :/ Nawet żadnego błędu nie wywala
komentarz 9 grudnia 2017 przez xandros Nałogowiec (29,450 p.)
A zainstalowałeś dobrze środowisko? Czy uruchamiasz go przez serwer, czy przeglądarke?

https://www.phpdevs.pl/wstep-do-php/6-instalacja-php

Lub

https://github.com/xandros15/IntoPHP/wiki/Instalacja-%C5%9Brodowiska

A masz w ogóle jakieś dane w bazie?

A czy nazwy tabeli zgadzają się z nazwami w query?

A czy  pola w tabeli zgadzają się z kluczami tablicy associacyjnej w templatce?

Czy masz uruchomiony error mode? https://stackoverflow.com/a/21429652
0 głosów
odpowiedź 8 grudnia 2017 przez Wilczu Mądrala (5,190 p.)

Hej, tak dobrze myślisz trzeba użyć pętli while 

tutaj masz kod php o który prawdopodobnie chodzi

<?php

              require_once('connect.php'); //tutaj podaj sciezke do pliku z danymi
              $connect = @new mysqli($db_host,$db_user,$db_password,$db_name);

              if($connect -> connect_errno !=0)
              {
                echo "Error".$connect -> connect_errno;
              }
              else
              {

              $sql = "SELECT * FROM table"; //tutaj daj zapytanie do bazy

              if($result = $connect -> query($sql))
              {
                  while($row = @$result-> fetch_assoc())
                  {
                     //tutal kod z tabelą
                  }
              }
              else
              {
                  echo "Niepoprawne zapytanie do bazy !";
              }


              }
          ?>

pętla while wykona się tyle razy ile jest rekordów w bazie

komentarz 8 grudnia 2017 przez xandros Nałogowiec (29,450 p.)
while jest passé
komentarz 8 grudnia 2017 przez Bartess Gaduła (3,630 p.)
Rozwiń :-).
komentarz 8 grudnia 2017 przez xandros Nałogowiec (29,450 p.)
Metoda, która ty używasz, jest po prostu przestarzała.
komentarz 8 grudnia 2017 przez Bartess Gaduła (3,630 p.)
Co teraz się stosuje?
1
komentarz 8 grudnia 2017 przez xandros Nałogowiec (29,450 p.)
Dla przykładu, to, co podałem wyżej.

Robi się też wersja z mysqli, bo kolega prosił.
komentarz 9 grudnia 2017 przez Wilczu Mądrala (5,190 p.)
Dobrze wiedziec że takie coś jest przestarzałe dziękuje za info :)
0 głosów
odpowiedź 9 grudnia 2017 przez Artek Stary wyjadacz (11,800 p.)
Stosujesz przestarzałe atrybuty html. Nie używaj align, bordercolor, bgcolor itp. To wszystko musisz uzyskać przy użyciu css.

Strasznie trąci starością!
0 głosów
odpowiedź 9 grudnia 2017 przez kamilocl Nowicjusz (220 p.)

Zrobiłem tak panowie i nic nie działa :(

<html>
<head>
<title>FAST DROP</title>
</head>
<body>
    <?php
function connect(): PDO
{
    static $pdo;
    if (!$pdo) {
        $pdo = new PDO('mysql:host=localhost;dbname=nazwa;charset=utf8;', 'login', 'hasło');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }

    return $pdo;
}





function getProducts(): Iterator
{
    $stmt = connect()->query('SELECT * FROM fast_drop', PDO::FETCH_ASSOC);
    foreach ($stmt as $product) {
        yield $product;
    }
}





              
    ?>
             <?php foreach(getProducts() as $product): ?>
    <article>
        <header>
            <h2><?= $product['Nazwa_produktu'] ?></h2>
            <p><small><?= $product['Cena_netto'] ?></small></p>
            <p><?= $product['Opis_produktu'] ?></p>
        </header>
        <section>
            <table>
                <thead>
                    <tr><td>( Minimum zamówienie )</td><td>Cena za sztuke</td></tr>
                </thead>
                <tbody>
                    <tr><td>36</td><td><?= $product['id'] ?></td></tr>
                    <tr><td>324</td><td><?= $product['id'] ?></td></tr>
                    <tr><td>648</td><td><?= $product['id'] ?></td></tr>
                    <tr><td>1296</td><td><?= $product['id'] ?></td></tr>
                </tbody>
            </table>
        </section>
        <footer><span>ID: <?= $product['id'] ?></span></footer>
    </article>
<?php endforeach; ?>


</body>
</html>

 

komentarz 9 grudnia 2017 przez xandros Nałogowiec (29,450 p.)

a zrób tak:

w lini 35 dodaj

$products = getProducts();
echo '<pre>';
var_dump($products);
die();

I sprawdź, czy wyświetli ci generator.

Ale z tego, co widzę, możesz nie mieć rekordów w bazie :P

komentarz 10 grudnia 2017 przez kamilocl Nowicjusz (220 p.)
Mam rekordy na 1000%
komentarz 10 grudnia 2017 przez kamilocl Nowicjusz (220 p.)
Dalej nie działa nawet jak dodałem to co napisałeś wygląda to wgl tak jakby przeglądarka nie potrafiła tego odczytać bo nawet sekcji head nie czyta.
komentarz 10 grudnia 2017 przez xandros Nałogowiec (29,450 p.)

Czy masz uruchomiony error mode? https://stackoverflow.com/a/21429652

Dodaj to na samym początku:


ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL);

Dodatkowo skrypt php umieść przed <!doctype html> a nie za <body>

Podobne pytania

0 głosów
2 odpowiedzi 586 wizyt
0 głosów
1 odpowiedź 225 wizyt
pytanie zadane 20 listopada 2016 w PHP przez KrysztoSLU Użytkownik (690 p.)
0 głosów
0 odpowiedzi 107 wizyt
pytanie zadane 12 listopada 2020 w PHP przez Filipczak Gaduła (4,020 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...