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

question-closed Jak wyświetlić zawartość rekordów z bazy danych w formie tabeli?

Object Storage Arubacloud
0 głosów
2,301 wizyt
pytanie zadane 7 listopada 2018 w PHP przez razor6017 Użytkownik (780 p.)
zamknięte 11 listopada 2018 przez razor6017

Hej!

Po raz kolejny zmuszony jestem zasięgnąć porady od bardziej doświadczonych.
Otóż - posiadam tabelę w bazie danych z zapisanymi rekordami. Jest to lista użytkowników, których ręcznie dodałem do bazy.

Tabela w bazie ma takie nagłówki

Nagłówki kolumn w bazie
id login user pass email in-game_nick l_l_date u_p

Mój pomysł jest konkretnie taki, aby na specjalnej podstronie wyświetlić w formie tabeli zawartość wybranych rekordów zapisanych w bazie:

Zamysł:
Ksywka E-mail Nick w grze Ranga
dana ksywka dany email dany nick dana ranga

Oczywiście, im więcej rekordów z bazy, tym więcej wierszy. Co kod PHP powinien dynamicznie sobie obliczyć i stworzyć odpowiednią ilość wierszy.

Kombinowałem już z pętlą while. Mój kod wygląda mniej więcej tak:

<?php
	session_start();
	if(!isset($_SESSION['logged_in']) && ($_SESSION['logged_in'])==!true)
	{
		header('Location:back.php');
		exit();
	}
	require "connect.php";
	mysqli_report(MYSQLI_REPORT_STRICT);
	try
	{
		$connect = new mysqli($host, $db_user, $db_pass, $db_name);
		if ($connect->connect_errno!=0)
		{
			throw new Exception(mysqli_connect_errno());
		}
		else
		{
			if ($result = $connect->query("SELECT 'user', 'email', 'in-game_nick', 'u_p' FROM uzytkownicy"))
			{
				$rowsno = $result->num_rows;
				
				if($rowsno>0)
				{
					$row=$result->fetch_assoc();
				}
				else
				{
					throw new Exception($connect->error);
				}
			}
			else
			{
				throw new Exception($connect->error);
			}
			$connect->close();
		}
	}
	catch (Exception $e)
	{
		echo '<span style="color:red;">Błąd serwera! Przepraszamy i prosimy spróbować później!</span>';
		echo '<br />Informacja deweloperska: '.$e;
	}
?>
<html>
<head>
<meta charset="utf-8">
<title>Konto</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
	<div class="login_container">
	<div class="login_logged_in_bar">
<?php
if((isset($_SESSION['logged_in'])) && ($_SESSION['logged_in']=true))
{
	include "./login_logged_in_bar/logged_in_bar.php";
}
?>
	</div>
	</div>
<div class="logo_container">
<img src="logo.png" class="logo"/>
</div>
<?php
if(($_SESSION['logged_in']==true) && ($_SESSION['user_privileges']<3))
	{
		include "./menu/menu_main_site_admins.php";
	}
else
	{
		include "./menu/menu_main_site_users.php";
	}
?>
<!-- div z tabelą z rekordami z bazy -->
<div class="table_container">
<table class="table">
	<tr>
		<th>Ksywka</th>
		<th>E-mail</th>
		<th>Nick w grze</th>
		<th>Ranga</th>
	</tr>
	<?php
		$i=0;
		while ($i < $rowsno)
		{
			$guild_ingame_nick=mysqli_fetch_lengths($result,$i,"in-game_nick");
			$guild_user=mysqli_fetch_lengths($result,$i,"user");
			$quild_email=mysqli_fetch_lengths($result, $i, "email");
			$guild_rank_db=mysqli_fetch_lengths($result,$i,"u_p");
			if ($guild_rank_db==3)
			{
				$rank_db = "Członek";
			}
			if ($guild_rank_db==2)
			{
			$rank_db = "Guild Vice";
			}
			if ($guild_rank_db==1)
			{
				$rank_db = "Guild Master";
			}
			if ($guild_rank_db==0)
			{
				$rank_db = "Main Admin";
			}
	?>
	<tr>
		<td><?php echo $guild_user ?></td>
		<td><?php echo $quild_email ?></td>
		<td><?php echo $guild_ingame_nick ?></td>
		<td><?php echo $rank ?></td>
	</tr>
	<?php
			$i++;
		}
echo "</table>";
	?>
</div>
</body>
</html>

Doradzi ktoś? Nadal jestem początkujący jeśli chodzi o programowanie w PHP, ale wszelka KONSTRUKTYWNA krytyka mile widziana. Liczę na Waszą wyrozumiałość i wyczerpującą odpowiedź!

Z góry dziękuję!

komentarz zamknięcia: Problem został rozwiązany. Szczególne podziękowania dla Bosswell!

2 odpowiedzi

+1 głos
odpowiedź 7 listopada 2018 przez Bosswell Nałogowiec (36,470 p.)
wybrane 11 listopada 2018 przez razor6017
 
Najlepsza

Zmienna " $row " w twoim kodzie przechowuje tablice z wszystkimi użytkownikami. Wystarczy zrobić pętle i wypisać te dane. W przykładzie zmienie nazewnictwo z "$row" na "$data".

<table>
<tr>
     <td>Nick</td>
     <td>Ranga</td>
     <td>Ksywka</td>
     <td>Email</td>
</tr>

<?php foreach ($data as $row): ?>
   <tr>
       <td><?php echo $row['user']; ?></td>
       <td>
              <?php
                    if ($row['u_p'] == '0') echo 'ranga';
                    else if (($row['u_p'] == '1') echo 'ranga';
              ?>
       </td>
       <td><?php echo $row['in_game_nick']; ?></td>
       <td><?php echo $row['nick']; ?></td>
   </tr>
<?php endforeach; ?> 
</table>

 

komentarz 8 listopada 2018 przez razor6017 Użytkownik (780 p.)
edycja 8 listopada 2018 przez razor6017

OK, kod zdaje się logiczny i w miarę zrozumiały dla mnie. Jednak nie mam pojęcia jak go zaimplementować. Można prosić o rady?

Kolejna informacja, bo widzę, że tutaj kolega użył wartości 0 i 1 dla ['u_p'], kiedy w bazie przechowywane są liczby od 0 do 3.
Czyli rozumiem, że zamiast ten fragment kodu:

<?php
	if ($row['u_p'] == '0') echo 'ranga';
	else if (($row['u_p'] == '1') echo 'ranga';
?>

Powinienem przerobić w ten sposób?

<?php
	if ($row['u_p'] == '0') echo $rank0;
	if ($row['u_p'] == '1') echo $rank1;
	if ($row['u_p'] == '2') echo $rank2;
	if ($row['u_p'] == '3') echo $rank3;
?>

Oczywiście ze wcześniejszym ustaleniem tych zmiennych.

EDIT 1.

OK, zaimplementowałem kod w taki sposób:

<tr>
	<th>Ksywka</th>
	<th>E-mail</th>
	<th>Nick w grze</th>
	<th>Ranga</th>
</tr>
<?php
	$rank3 = 'Członek';
	$rank2 = 'Guild Vice';
	$rank1 = 'Guild Master';
	$rank0 = 'Main Admin';

	foreach ($row as $data):

?>
<tr>
	<td><?php echo $data['user']; ?></td>
	<td><?php echo $data['email']; ?></td>
	<td>
		<?php echo $data['in-game_nick'];?></td>
	<td>
		<?php 
			if ($data['u_p'] == 0) echo $rank0;
			if ($data['u_p'] = 1) echo $rank1;
			if ($data['u_p'] = 2) echo $rank2;
			if ($data['u_p'] = 3) echo $rank3;
	?>
	</td>
</tr>
<?php
	endforeach;
?>

Mam w bazie MySQL roboczo 2 użytkowników, ale strona wyświetla 4 wiersze. Skrypt niby działa prawidłowo, ale wierszy jest za dużo, a strona "krzyczy":

Warning: Illegal string offset 'email'

W każdej rubryce tabeli jest to ostrzeżenie. Nie rozumiem tego, przecież zastosowałem już polecenie fetch_assoc();.

komentarz 8 listopada 2018 przez Bosswell Nałogowiec (36,470 p.)

Tak zapisana instrukcja warunkowa raczej mija się z celem jakiemu ma służyć. Cztery razy sprawdzasz numer rangi, gdzie wiadomo, że ranga może być tylko jedna.

<?php
    if ($row['u_p'] == '0') echo $rank0;
    if ($row['u_p'] == '1') echo $rank1;
    if ($row['u_p'] == '2') echo $rank2;
    if ($row['u_p'] == '3') echo $rank3;
?>

// zmień na 

$ranks = [
   'pierwsza_ranga',
   'druga_ranga',
   'trzecia_ranga',
   'czwarta_ranga',
]

<?php
    if ($row['u_p'] == '0') echo $ranks[0];
    else if ($row['u_p'] == '1') echo  $ranks[1];
    else if ($row['u_p'] == '2') echo $ranks[2];
    else if ($row['u_p'] == '3') echo  $ranks[3];
?>

Nie lepiej w twoim przypadku w bazie przechowywać już konkretną nazwę rangi, a nie jej numer ? No chyba że tym numerem jest id do tabeli rangi i chcesz zachować atomowość co jest zrozumiałe i prawidłowe.

 

Krzyczy Ci errorem, poniewaz w bazie anych utworzyłeś tabele o nazwie "emal" a nie "email".

Masz też niby kolumnę o nazwie " in-game_nick ", Wydaję mi się, że w tym przypadku może być problem z pauzą " in-game"

komentarz 9 listopada 2018 przez razor6017 Użytkownik (780 p.)
edycja 9 listopada 2018 przez razor6017
Przepraszam - literówka w trakcie pisania zapytania na forum. W bazie istnieje kolumna o faktycznej nazwie "email". Poprawiłem już treść zapytania.

Tak, zgadzam się. Masz rację, jeśli chodzi o przechowywanie nazw rang w tabeli zamiast ich numerów, i nie, nie posiadam drugiej tabeli.

Stworzyłem formularz dodawania użytkowników, do którego dostęp mają tylko admini.
Strona nie posiada, że tak to nazwę, publicznego formularza rejestracji. Jeśli admini widzą, że w gildii jest taki a taki członek, to oni tworzą mu konto i podają tymczasowe hasło. Członek sam wybiera sobie login. Po logowaniu, jeśli system wykryje, że to jest pierwsze logowanie, przenosi takiego delikwenta na stronę, gdzie musowo musi zmienić swoje tymczasowe hasło na własne.

A dlaczego uznałem, że rangę lepiej zapisać w postaci cyfry?

Formularz dodawania użytkownika skonfigurowałem bazując właśnie na 4 konkretnych rangach. Ranga 0 to main admin, czyli de facto ja, bo to ja skonfigurowałem i stworzyłem stronę gildii od podstaw, logiczne też, że będę zarządzać tą stroną i pilnować porządku. 1 to Guild Master, który ma identyczne uprawnienia jak ja na stronie, nie może jednak zmienić moich uprawnień (takie zabezpieczenie). 2 to Guild Vicem podległy GM'owi i znów mają takie same uprawnienia jak ja i GM, ale nie mogą nam namieszać w uprawnieniach. 3 to po prostu członkowie w gildii, mają jedynie uprawnienia do otwarcia stron, które są dla nich przeznaczone, a które nie wyświetlają się osobom niezalogowanym. Admin podczas dodawania użytkownika, wybiera jego rangę i klikając na submit dodaje go do bazy (oczywiście dane przechodzą walidację). W formularzu istnieje wybór rangi przyciskiem typu "radio", po kliknięciu submita, wybór zamieniany jest na liczbę i dodawany do bazy. Jeżeli któryś użytkownik będzie chciał "wywołać" dane z bazy, przechodzą one przez weryfikację, czyli system sprawdza jaka to liczba i wyświetla informację adekwatną do tego, co odczytał z bazy. Dla mnie wszystko logiczne i składa się w jedną całość.

Sprawdzę problem z pauzą i jeżeli masz rację, będę musiał poprawić wszystkie pliki strony, w których znajduje się nawiązanie do tej rubryki w tabeli plus samą tabelę w bazie.
komentarz 9 listopada 2018 przez Bosswell Nałogowiec (36,470 p.)
Mógłbyś mieć osobną tabele dla rang i osobną dla ról. Wtedy nie uzależniasz uprawnień od rangi. W tabeli "role" miałbyś na przykład dane typu "SUPER_ADMIN_ROLE", "ADMIN_ROLE", "USER_ROLE", "CUSTOM_ROLE. Zauważ, że w wtym przypadku masz większą możliwość rozbudowy ;)
komentarz 9 listopada 2018 przez razor6017 Użytkownik (780 p.)

Racja, pomyślę nad tym.

Wracając do sedna problemu:

PHP nadal krzyczy: "Illegal string offset".

<table class="table">
	<tr>
		<th>Ksywka</th>
		<th>E-mail</th>
		<th>Nick w grze</th>
		<th>Ranga</th>
	</tr>
	<?php
		$ranks = ['Main Admin', 'Guild Master', 'Guild Vice', 'Członek',];
		
		foreach ($row as $data):
	?>
	<tr>
		<td><?php echo $data['user']; ?></td>
		<td><?php echo $data['email']; ?></td>
		<td>
			<?php echo $data['in-game_nick'];?></td>
		<td>
			<?php 
				if ($data['u_p'] == 0) echo $ranks['0'];
				if ($data['u_p'] == 1) echo $ranks['1'];
				if ($data['u_p'] == 2) echo $ranks['2'];
				if ($data['u_p'] == 3) echo $ranks['3'];
		?>
		</td>
	</tr>
	<?php
		endforeach;
	?>
</table>

Jeszcze jakby rozchodziło się o pojedynczą rubrykę, ale tu wszystkie komórki wołają ten sam błąd, więc to raczej wina pauzy nie jest.

komentarz 10 listopada 2018 przez Bosswell Nałogowiec (36,470 p.)

Masz illegal offset na zmiennych ( $data['u_p'] ) i ( $data['in-game_nick'] ). Znaczy to tyle, ze takie zmienne nie istnieją.

Zrób coś takiego zaraz po wybraniu danych z bazy.

echo '<pre>';
  print_r($row);
echo '</pre>';

die();

I pokaż mi rezultat

komentarz 10 listopada 2018 przez razor6017 Użytkownik (780 p.)
mysqli_result Object
(
    [current_field] => 0
    [field_count] => 4
    [lengths] => 
    [num_rows] => 2
    [type] => 0
)

 

komentarz 10 listopada 2018 przez Bosswell Nałogowiec (36,470 p.)

Spróbuj zamienić tą cześć kodu

<?php foreach ($data as $row): ?>

Na

<?php while ($result->fetch_assoc()): ?>

I zamiast enfforeach; użyj endwhile.

komentarz 10 listopada 2018 przez razor6017 Użytkownik (780 p.)
Fatal error: Uncaught Error: Cannot use object of type mysqli_result as array

Podejrzewam, że to przez to, że robię to drugi raz po wyjęciu z bazy

komentarz 11 listopada 2018 przez Bosswell Nałogowiec (36,470 p.)
Tutaj masz funkcje, która wyciąga rzeczywiście wszystkie wiersze. Fetch assoc wyciąga jedynie jeden wiersz. Musisz jej użyć w pętli aby działało.
komentarz 11 listopada 2018 przez razor6017 Użytkownik (780 p.)
Miło jest usłyszeć rady i komentarze od kogoś bardziej doświadczonego podczas nauki.

Ogarnąłem temat. Parę wskazówek, trochę myślenia i rozwiązałem problem!

Dla potomnych zostawię zapis gotowego skryptu z opisami.

Bosswell, dziękuję!
0 głosów
odpowiedź 11 listopada 2018 przez razor6017 Użytkownik (780 p.)

Problem został rozwiązany z pomocą Bosswell'a.

Otóż, żeby wywołać zapisy z bazy danych trzeba je uprzednio wyciągnąć z bazy. Nie wolno wywoływać na nich funkcji fetch_assoc();, ponieważ zabraknie potem informacji do argumentu w pętli.

Pierwsza część kodu PHP:

//zaczynamy połączenie z bazą, żeby wyciągnąć dane z bazy
	require "connect.php";
	mysqli_report(MYSQLI_REPORT_STRICT);

	try
	{
		$connect = new mysqli($host, $db_user, $db_pass, $db_name);
		if ($connect->connect_errno!=0)
		{
			throw new Exception(mysqli_connect_errno());
		}
		else
		{
			
			//zadajemy pytanie do bazy danych
			$result = $connect->query("SELECT `nazwa_pierwszej_kolumny`,`nazwa_drugiej_kolumny`,`nazwa_trzeciej_kolumny`,`nazwa_kolejnej_kolumny`FROM nazwa_twojej_tabeli");
			
			//po wykonanych poleceniach zamykamy połączenie z bazą, no bo skoro mamy wyciągnięte dane z bazy to po co nam aktywne połączenie z bazą?
			$connect->close();
		}
	}
	catch (Exception $e)
	{
		echo '<span style="color:red;">Błąd serwera! Przepraszamy i prosimy spróbować później!</span>';
		echo '<br />Informacja deweloperska: '.$e;
	}

Druga część kodu:

<table>
	<tr>
		<th>Kolumna_1</th>
		<th>Kolumna_2</th>
		<th>Kolumna_3</th>
		<th>Kolumna_4</th>
	</tr>
	<?php
		//tworzymy tablicę asocjacyjną dla wyciągniętych z bazy
		$result->fetch_assoc();

		//jeżeli w bazie przechowywane są liczby, które odnoszą się do konkretnych rang lub uprawnień użytkownika tworzymy tablicę z opisami rang
		$ranks = ['ranga_1', 'ranga_2', 'ranga_3', 'ranga_4',];
		//ludzie liczą od 1, komputer liczy od 0, więc tablice numerowane są kolejno od 0, więc w tym przypadku, jest 0, 1, 2 ,3
		
		//uruchamiamy pętlę
		foreach ($result as $data): ?>
	<tr>
		<td><?php echo $data['nazwa_pierwszej_kolumny']; ?></td>
		<td><?php echo $data['nazwa_drugiej_kolumny']; ?></td>
		<td>
			<?php echo $data['nazwa_trzeciej_kolumny'];?></td>
		<td>
			<?php
			
				//definiujemy teraz instrukcje warunkowe, które będą interpretowały zawartość danych wyjętych z kolumeny
				//jeżeli wartość tego rekordu w bazie będzie równa 0, to wyświetl na ekranie wartość pierwszej tablicy (liczymy od 0!!) zmiennej $ranks
				if ($data['nazwa_czwartej_kolumny'] == 0) echo $ranks['0'];
				
				//analogicznie pozostałe warunki
				elseif ($data['nazwa_czwartej_kolumny'] == 1) echo $ranks['1'];

				elseif ($data['nazwa_czwartej_kolumny'] == 2) echo $ranks['2'];

				elseif ($data['nazwa_czwartej_kolumny'] == 3) echo $ranks['3'];
		?>
		</td>
	</tr>
	<?php
		//zamykamy pętlę
		endforeach;
	?>
</table>

 

Podobne pytania

0 głosów
1 odpowiedź 244 wizyt
0 głosów
1 odpowiedź 179 wizyt
pytanie zadane 28 marca 2016 w SQL, bazy danych przez Ceki Mądrala (5,310 p.)
0 głosów
1 odpowiedź 3,536 wizyt

92,565 zapytań

141,416 odpowiedzi

319,598 komentarzy

61,950 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!

...