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

Komunikator z użyciem PHP I Mysql

VPS Starter Arubacloud
0 głosów
1,008 wizyt
pytanie zadane 18 marca 2018 w SQL, bazy danych przez Rafał Michalik 1 Początkujący (490 p.)

Chciałbym zrobić prosty komunikator. Mam takie coś i po wysłaniu wiadomości zostaje ona dodana do bazy danych. Potem zostają pobrane wiadomości z bazy gdzie id użytkownika = id=odbiorcy. I teraz mam problem.

Każdy z wierszy to osobna wiadomość. Tutaj pokazuje się tylko data, temat i od kogo wiadomość przyszła. Chcę zrobić tak, by każdy wiersz był linkiem. Po kliknięciu w niego pragnę by przenosiło cię do strony gdzie zostaje pokazana treść wiadomości. Jak takie coś zrobić?

To co widać na zdjęciu zrobiłem za pomocą foreach. Tutaj kod:

<?php 
echo '<table style= border="1" cellspacing="2"><tbody>';
while ($row = mysqli_fetch_row($rezultaq))
{
    echo '<a href="../gra.php">'.'<tr>';
    foreach ($row as $key => $value) {
        if ($value != null){
         echo '<td width=150px; style="border-color: blue; background-color: grey; padding-right: 10px; padding-left: 10px; text-align: center;" border="1">'.$value.'</td>';
        } else {
            echo '<td width=150px; style="background-color: magenta; border-color: blue;" border="1">'.$value."</td>";
        }
 
    } echo '</tr>'.'</a>';
}
echo "</tbody></table>";
?>

Pomoże, mi ktoś rozwiązać ten problem lub pokaże w jaki sposób to zrobić? Najlepiej żeby było mało skomplikowane, bym potrafił to zrozumieć.

2 odpowiedzi

+1 głos
odpowiedź 18 marca 2018 przez Bosswell Nałogowiec (36,470 p.)
wybrane 20 marca 2018 przez Rafał Michalik 1
 
Najlepsza
Do każdej wiadomości dodaj link (możesz go wystylizować na przycisk), w którym przekażesz metodą GET id tej wiadomości. Link prowadzi do strony, w której robisz prostego SELECT-a z bazy i wypisujesz wiadomość.
komentarz 19 marca 2018 przez Rafał Michalik 1 Początkujący (490 p.)
Mógłbyś mi pokazać gdzie w moim kodzie dodać ten przycisk? Za każdym razem wpisuję go w złym miejscu i już nie wiem gdzie go wpisać. Nie chcę by on pokazał się po każdej komórce tylko na końcu wiersza. Pomożesz? I jeszcze jak zrobić, by jeszcze w tej funkcji foreach oprócz danych z jednej bazy danych dodać dane z innej Bazy? Bo chcę, żeby pokazywało datę i temat, a zamiast id_nadawcy jego nick z innej bazy danych. Jest to możliwe? Gdybyś mógł mi pokazać w których miejscach pozmieniać kod byłbym bardzo wdzięczny.
komentarz 19 marca 2018 przez Bosswell Nałogowiec (36,470 p.)
Ja bym to zrobił tak, że zamiast pętli w której w każdym kroku łapiesz wartości po kolei. Tj

foreach ($row as $key => $value)

Przechwytywałbym cały wiersz.

foreach ($row as $value)

Teraz zmienna $value to tablica z trzema wartościami. Zrób odpowiedni html, aby wypluć te dane. W komórce, gdzie wypisujesz temat wiadomości, zrób na nim link

<a href="wyswietl_wiadomosc.php?wiadomosc_id=$value['id']">$value['temat']</a>

Oczywiście połącz to spójnie operatorami konkatenacji. gdzie $value['id'] to id tej wiadomości. Na stronie wyswietl_wiadomosc.php odbierz dane. Wartość przechowywana jest w zmiennej  $_GET['wiadomosc_id']. Tutaj robisz już prostego SELECT-a, więc tłumaczyć raczej nie trzeba.

Co do sprawy z zamianą id użytkownika na jego nick. W tym celu musisz w każdym kroku pętli robić zapytanie wyciągające nick osoby na podstawie jego id.
komentarz 19 marca 2018 przez Rafał Michalik 1 Początkujący (490 p.)

Hmmm Zrozumiałem do tego momentu 

Teraz zmienna $value to tablica z trzema wartościami.

Dalej tak nie całkiem rozumiem. 

Pokażę ci mój kod. A ty, oczywiście jak możesz, zobrazuj mi to w jakiś sposób. Nie proszę o gotowy kod, tylko o to gdzie co wpisać.  Tu kod tego co do tej pory zrobiłem.

<?php
session_start();
require_once "connect.php";
$id = $_SESSION['id'];
$polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
$polaczenie -> query ('SET NAMES utf8');
$polaczenie -> query ('SET CHARACTER_SET utf8_unicode_ci');
$odbior = "SELECT  data, temat, od FROM komunikator WHERE do=$id";
if($rezultaq = @$polaczenie->query($odbior))
{
$wiersz = $rezultaq->fetch_assoc();
$data = $wiersz['data'];
$temat = $wiersz['temat'];
}
echo '<table style= border="1" cellspacing="2"><tbody>';
while ($row = mysqli_fetch_row($rezultaq))
{
    echo '<tr>';
    foreach ($row as $value) 
	{
        if ($value != null)
		{
         echo '<td width=150px; style="border-color: blue; background-color: grey; padding-right: 10px; padding-left: 10px; text-align: center;" border="1">'.$value.'</td>';
		 echo '<a href="wiadomosc.php?id=$value['id']">$value['temat']</a>';
        } else 
		{
            echo '<td width=150px; style="background-color: magenta; border-color: blue;" border="1">'.$value."</td>";
        }
  
    }
echo '<td><input type="submit" href="wiadomosc.php"></td>';	
echo '</tr>';
}
echo "</tbody></table>";
?>

 

komentarz 19 marca 2018 przez Bosswell Nałogowiec (36,470 p.)

Podążaj za błędami. Źle wcisnąłeś zmienne między html. Np tutaj
 

ehco '<a href="wiadomosc.php?id=$value['id']">$value['temat']</a>';

echo '<a href="wiadomosc.php?id='.$value['id'].'">'.$value['temat'].'</a>'; 

Linie wcześniej użyłeś zmiennej $value, która jest tablicą bez podania jej indexu.

Ta linia to w ogóle bez sensu.

echo '<td><input type="submit" href="wiadomosc.php"></td>'; 

 

Te linie też nie potrzebnie

$polaczenie -> query ('SET NAMES utf8');

$polaczenie -> query ('SET CHARACTER_SET utf8_unicode_ci');

 

Zamiast nich, możesz zrobić

$polaczenie->set_charset('utf8');

Wszystko to co napisałem wcześniej teraz musisz zastosować. Próbuj, a jak widzisz błąd to staraj się go odszukać i naprawić.

1
komentarz 19 marca 2018 przez Rafał Michalik 1 Początkujący (490 p.)
Dzięki. Postaram się wykonać do końca ten skrypt. Twoje słowa "Podążaj za błędami" będą w mojej pamięci na ważnym miejscu, zaraz po "Memento Mori". Jeszcze raz dziękuję.
komentarz 20 marca 2018 przez Rafał Michalik 1 Początkujący (490 p.)

Ja na prawdę bardzo cię przepraszam, że tak ciągle Cię o coś pytam, ale nie mogę sobie poradzić. Szukam odpowiedzi, ale nic z tego nie wychodzi. 

Po zastosowaniu twoich cennych wskazówek pokazuje mi się taki błąd. 

Warning: Illegal string offset 'idwaid' in C:\xampp\htdocs\php1\podstrony\komodb.php on line 24

Warning: Illegal string offset 'temat' in C:\xampp\htdocs\php1\podstrony\komodb.php on line 24

I tych błędów jest tyle ile wierszy.

Z tego co ja rozumiem, to nie wykrywa tych wartości w [ ]. Nie wiem jak to rozwiązać. Szukałem na różnych stronach informacji ale nie znalazłem odpowiedzi, albo inaczej: nie zrozumiałem jej. Dałbyś radę mi to jakoś lepiej wytłumaczyć?

 

komentarz 20 marca 2018 przez Bosswell Nałogowiec (36,470 p.)

Nie dopatrzyłem się wcześniej tego w twoim kodzie. Ma on dużo więcej do poprawienia.

1. Pomyśl, czy ten if ma sens, jeśli bez względu na to, czy się spełni, czy nie, interpreter będzie przerabiał kod dalej. Czemu przypisujesz zmienne po tym ifie akurat ? Sam if z walidacją i przechwyceniem, to rozumiem, ale jaki zabieh pełni to przypisanie zmiennych, których później i tak nie wykorzystujesz ?

if($rezultaq = @$polaczenie->query($odbior))
{
$wiersz = $rezultaq->fetch_assoc();
$data = $wiersz['data'];
$temat = $wiersz['temat'];
}

2. Usuń pętle foreach, skoro masz już wcześniej while. Teraz ta tablica będzie zawierała się w zmiennej $row.

3. Do testów, aby sprawdzić zmienną, tablice, obiekt używaj funkcji print_r(). Przy zmiennych to nawet zwykłe echo. Podglądaj zawartość tablicy. I sprawdzaj, co tu może być nie tak.

komentarz 20 marca 2018 przez Rafał Michalik 1 Początkujący (490 p.)
Wielkie dzięki. Teraz wszystko hula :D. Nie wiem jak ci się odwdzięczę!
0 głosów
odpowiedź 18 marca 2018 przez OdsetekGlupoty Pasjonat (15,360 p.)

Witam,

Najprościej można byłoby to zrobić tak, że utworzysz zmienną np. $link, w której zapiszesz $value.".php". Potem przed pokazaniem zmiennej $value zrobiłbyś tag <a href="$link">, a po pokazaniu tej zmiennej zamknął go. Zadziała to tylko wtedy, kiedy strona z wiadomością będzie się nazywała tak jak to, co siedzi pod zmienną $value (z doczepionym .php).

komentarz 18 marca 2018 przez Bosswell Nałogowiec (36,470 p.)
Z tego co zrozumiałem, to musiałbyś dla każdej wiadomości mieć osobny plik.

Podobne pytania

0 głosów
0 odpowiedzi 92 wizyt
pytanie zadane 8 marca w C i C++ przez TOWaD Mądrala (5,700 p.)
0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 24 stycznia 2021 w C# przez Kacperxoo Początkujący (330 p.)
0 głosów
0 odpowiedzi 223 wizyt
pytanie zadane 8 kwietnia 2020 w Java przez JuniorPL Użytkownik (770 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...