Portal społecznościowy: Pobieranie listy subskrypcjami i łączenie danych wpisu i autora.

0

Witam, od bardzo długiego czasu chodzi mi pomysł serwisu społecznościowego (zresztą wtedy zacząłem robić podwaliny portalu), jednak niedawno wziąłem się w garść, ponieważ w najbliższym czasie zostanie zamknięty mój ulubiony portal - Google+. Stworzyłem podstawy mikrobloga, szablon serwisu, a w jego struktury nawet wchodzi notes (Google Docs jest trochę przepełniony funkcjami) czy też zakładki online (nie chcę znajomym śmiecić FB/Twittera/G+/NK, a o wklejaniu do dokumentu na GDocs napisałem wcześniej)
No dobra, to do rzeczy:
Mój problem polega na tym, iż nie wiem jak sprawdzić, czy dany użytkownik jest subskrybowany, i jednocześnie nie wiem, jak oddzielić wpisy subskrybowanych użytkowników od wszystkich userów. Jednak najważniejszą barierą jest to, że nie mogę pobierać danych autora danego wpisu i samego wpisu jednocześnie. Dane usera miałyby być pobierane na bazie numeru ID (coś jak na FB).
Oczywiście załączam kody:
MySQL

CREATE TABLE IF NOT EXISTS `buzz` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL,
  `kpost` varchar(250) DEFAULT NULL,
  `data` datetime DEFAULT NULL,
  `ip` int(15) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

INSERT INTO `buzz` (`id`, `uid`, `kpost`, `data`, `ip`) VALUES
(1, 1, 'Siema', '2014-12-12 20:48:09', 0),
(2, 1, 'Siemafh', '2014-12-12 20:48:21', 0),
(3, 1, 'Siema', '2014-12-12 20:48:45', 0),
(4, 1, '6i5i5iy', '2014-12-30 16:39:01', NULL),
(5, 1, 'Już?', '2014-12-30 16:39:26', NULL),
(6, 2, 'PEDAŁEN!', '2014-12-30 16:42:59', NULL),
(7, 2, 'ee;lem', '2014-12-30 16:43:04', NULL);

-- --------------------------------------------------------

--
-- Table structure for table `following`
--

CREATE TABLE IF NOT EXISTS `following` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `follower_id` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

INSERT INTO `following` (`id`, `user_id`, `follower_id`, `date`) VALUES
(1, 1, 2, '2015-06-22 19:30:49');

CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_fname` varchar(255) NOT NULL,
  `user_lname` varchar(255) NOT NULL,
  `user_full` varchar(255) NOT NULL,
  `user_name` varchar(255) NOT NULL,
  `user_password` varchar(255) NOT NULL,
  `user_email` varchar(255) NOT NULL,
  `user_birth` date NOT NULL,
  `user_gender` int(11) NOT NULL,
  `user_regdate` int(11) unsigned NOT NULL,
  `user_status` varchar(255) NOT NULL,
  `user_from` varchar(255) NOT NULL,
  `user_website` varchar(255) NOT NULL,
  `user_online` enum('active','inactive') NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `users` (`user_id`, `user_fname`, `user_lname`, `user_full`, `user_name`, `user_password`, `user_email`, `user_birth`, `user_gender`, `user_regdate`, `user_status`, `user_from`, `user_website`, `user_online`) VALUES
(1, 'Marek', 'Białkowicz', 'Marek "Mode" Białkowicz', 'mode', '15d61712450a686a7f365adf4fef581f', '[email protected]', '2010-06-03', 1, 1413913665, '', '', '', 'inactive'),
(2, 'Jarek', 'Pawlikowski', 'Jarek Pawlikowski', 'pawlik', '1392c309a2da8ca65641315bf7dc62f2', '[email protected]', '2000-07-26', 1, 1419938598, '', '', '', 'inactive'),
(3, 'Seba', 'Kowalski', 'Seba Kowalski', 'sebak', '231a47b64a5bce4c4404d7776858aafe', '[email protected]', '1997-03-19', 1, 1431966324, '', '', '', 'inactive');

index.php

<?php
include 'config.php';
db_connect();

// pobieramy dane usera
$user_data = get_user_data();

echo '<html>';
include 'include/head.htm';
echo '<body>';
include 'include/menu.php';
echo '<div id="wrapper">';
if(!$_SESSION['logged']) { ?>
<div id="logleft">
<fieldset style="margin: 5px;">
WITAJ NA NASZYM PORTALU!
</fieldset>
</div>

<div id="logright">
<form method="post" action="login.php">
<table cellpadding="3">
<tr><td>Login:</td><td><input type="text" value="name" name="name"></td></tr>
<tr><td>Hasło:</td><td><input type="password" value="password" name="password"></td></tr>
<tr><td>.</td><td><input type="submit" value="Zaloguj"></td></tr>
</table>
</form>
</div>

<?php } else {
include 'include/left.php';
?>

<div id="center" style="min-height: 600px;">

<div id="tab-container-1">

<ul id="tab-container-1-nav">
  <li class="activeli"><a class="active" href="#tab1">Tablica</a></li>
  <li class=""><a class="" href="#tab2">Subskrybowani</a></li>
  <li class=""><a class="" href="#tab3">Events</a></li>
  <li class=""><a class="" href="#tab4">Pytania</a></li>
  <li class=""><a class="" href="#tab5">Zdjęcia</a></li>
</ul>

<div style="display: block;" class="tab" id="tab1">
<br />
<div id="wall"></div><div id="menutext"><b>Buzz</b></div>
<br />
<?php
// sprawdzamy czy user nie jest przypadkiem zalogowany
if(!$_SESSION['logged']) {
    echo 'Zaloguj się';
} else {
    // jeśli zostanie naciśnięty przycisk "Wyślij"
    if(isset($_POST['kpost'])) {
        // filtrujemy dane...
        $_POST['uid'] = clear($_POST['uid']);
        $_POST['kpost'] = clear($_POST['kpost']);
        $_POST['ip'] = clear($_POST['ip']);

        // sprawdzamy czy wszystkie pola zostały wypełnione
        if(empty($_POST['uid']) || empty($_POST['kpost'])) {
            echo '<p>Napisz coś, dopiero potem kliknij "wyślij"</p>';
	} else {
                mysql_query("INSERT INTO `buzz` (`uid`, `kpost`, `data`) VALUES ('{$_POST['uid']}', '{$_POST['kpost']}', '".date('Y-m-d H:i:s')."')");
                echo '<p>Opublikowane! ;)</p>';
            }
	}
echo '<form method="POST" action="index.php">
<div style="border: 1px solid rgb(204, 204, 204); border-radius: 5px; background: rgb(242, 242, 242); color: #FFF; margin: 5px; padding: 5px;">
<input name="kpost" value="'.$_POST['kpost'].'" style="width: 540px;" class="sm" type="text">
<input type="hidden" value="'.$user_data['user_id'].'" name="uid">
<input type="hidden" value="'.$_SERVER['REMOTE_ADDR'].'" name="ip">
<font class="sm" face="Arial,Helvetica" size="-1" style="float: right;">
<input value="Wyślij" class="sm btnN btnC" type="SUBMIT" name="wyslij">
</font>
</div>
</form>';
}

//Pobieramy dane z bazy
$query = mysql_query ("SELECT * FROM `buzz` ORDER BY `data` DESC LIMIT 5"); 

//Początek struktury tabeli
echo '<table width="100%">';

//Pętla do wyświetlenia wszystkich wpisów
while($shout=mysql_fetch_array($query)) { 
  echo '
<div style="border-bottom: 1px solid #000; color: #000; margin: 5px; padding: 5px;">
<b><a href="profile.php?id='.$shout['uid'].'">**Imię i nazwisko użytkownika**</a>:</b> <small>'.$shout['data'].'</small><br/>
'.$shout['kpost'].'<br/>
<small>
<font face="Arial,Helvetica" size="-1"><input value="+1" class="sm btnA btnC" type="SUBMIT"></font>
- Skomentuj - Udostępnij
</small>
</div>';
}

//Koniec struktury tabeli
echo '</table>'; 
?>
</div>

<div style="display: none;" class="tab" id="tab2">
<br />
<div id="friend"></div><div id="menutext"><b>Contacts</b></div>
<br />
<h2>Users you're following</h2>
...
</div>

<div style="display: none;" class="tab" id="tab3">
<br />
<div id="event"></div><div id="menutext"><b>Events</b></div>
<br />
</div>

<div style="display: none;" class="tab" id="tab4">
<br />
<div id="ask"></div><div id="menutext"><b>Pytania</b></div>
<br />
</div>

<div style="display: none;" class="tab" id="tab5">
<br />
<div id="photo"></div><div id="menutext"><b>Zdjęcia</b></div>
<br />
</div>

</div>
<script type="text/javascript">
  var tabber1 = new Yetii({
    id: 'tab-container-1'
  });
</script>

</div>
<?php
}
include 'include/footer.htm';
echo '</div>';
?>
</body>
</html>
<?php
db_close();
?>

profile.php

<?php
include 'config.php';
db_connect();

// filtrujemy id oraz rzutujemy je na int
$_GET['id'] = (int)clear($_GET['id']);

// pobieramy dane usera z podanego id
$this_user = get_this_user($_GET['id']);
$user_data = get_user_data();

echo '<html>';
include 'include/head.htm';
echo '<body>';
include 'include/menu.php';
if(!$_SESSION['logged']) {
  echo_login();
} else {
// sprawdzamy czy znalazło użytkownika
// jeśli nie to wyświetlamy komunikat
// a jeśli tak to wyświetlamy wszystkie jego dane
// jeśli user nie ma podanej strony www lub skąd jest to wyświetlamy "brak"
if($this_user === false) {
    echo '<p>Niestety, taki użytkownik nie istnieje.</p>
        <p>[<a href="index.php">Powrót</a>]</p>';
} else {
    echo '
	<div id="wrapper">
	<div id="left" style="float: left;">
	<img src="images/avatar.png" width="100" height="100">
	</div>
	<div id="center">
	<h2>Profil użytkownika '.$this_user['user_full'].'</h2>
	<table>
        <tr><td>Imię: </td><td>'.$this_user['user_fname'].'</td></tr>
        <tr><td>Nazwisko: </td><td>'.$this_user['user_lname'].'</td></tr>
        <tr><td>Nick: </td><td>'.$this_user['user_name'].'</td></tr>
	<tr><td>Data rejestracji: </td><td>'.date("d.m.Y, H:i", $this_user['user_regdate']).'</td></tr>
        <tr><td>Strona WWW: </td><td>'.(empty($this_user['user_website']) ? 'brak' : $this_user['user_website']).'</td></tr>
	<tr><td>Data urodzenia: </td><td>'.$this_user['user_birth'].'</td></tr>
	<tr><td>Nardowość: </td><td></td></tr>
	<tr><td>Skąd: </td><td>'.(empty($this_user['user_from']) ? 'brak' : $this_user['user_from']).'</td></tr>
	<tr><td>Telefon: </td><td></td></tr>
	<tr><td>Email: </td><td>'.$this_user['user_email'].'</td></tr>
	<tr><td>Znajomi: </td><td></td></tr>
	<tr><td>Zaintereowania: </td><td></td></tr>
	<tr><td>Płeć: </td><td>';
if($this_user['user_gender'] === 2) {
  echo 'Kobieta';
} else {
  echo 'Mężczyzna';
}
echo '</td></tr>
	</table>
	</div>
	';
if($this_user === $user_data) {
  echo 'Subowanie samego siebie jest jak lizanie swoich jaj';
} else {
echo '<form method="POST" action="sub.php">';
echo '<input type="hidden" value="'.$this_user['user_id'].'" name="user_id">';
echo '<input type="hidden" value="'.$user_data['user_id'].'" name="follower_id">';
echo '<input value="Dodaj do kręgów" class="sm btnA btnC" float="right" style="font-size: 10px; border: 1px solid #000;" type="SUBMIT"><br />';
echo '</form>';
}

}
}
	</div>';
include 'include/footer.htm';
?>
</body>
</html>
<?php
db_close();
?>

config.php

<?php
// definiujemy dane do połączenia z bazą danych
define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', '');
define('DBNAME', 'socialcms');
 
function db_connect() {
    // połączenie z mysql
    mysql_connect(DBHOST, DBUSER, DBPASS) or die('<h2>ERROR</h2> MySQL Server is not responding');
 
    // wybór bazy danych
    mysql_select_db(DBNAME) or die('<h2>ERROR</h2> Cannot connect to specified database');
}
 
function db_close() {
    mysql_close();
}
 
function clear($text) {
    // jeśli serwer automatycznie dodaje slashe to je usuwamy
    if(get_magic_quotes_gpc()) {
        $text = stripslashes($text);
    }
    $text = trim($text); // usuwamy białe znaki na początku i na końcu
    $text = mysql_real_escape_string($text); // filtrujemy tekst aby zabezpieczyć się przed sql injection
    $text = htmlspecialchars($text); // dezaktywujemy kod html
    return $text;
}
 
function codepass($password) {
    // kodujemy hasło (losowe znaki można zmienić lub całkowicie usunąć
    return sha1(md5($password).'#!%Rgd64');
}
 
// funkcja na sprawdzanie czy user jest zalogowany, jeśli nie to wyświetlamy komunikat
function check_login() {
    if(!$_SESSION['logged']) {
        die('<p>To jest strefa tylko dla użytkowników.</p>
        <p>[<a href="login.php">Logowanie</a>] [<a href="register.php">Zarejestruj się</a>]</p>');
    }
}
 
function echo_login() {
  echo '<p>To jest strefa tylko dla użytkowników.</p>
  <p>[<a href="login.php">Logowanie</a>] [<a href="register.php">Zarejestruj się</a>]</p>';
}

// funkcja na pobranie danych usera
function get_this_user($user_id = -1) {
    // jeśli nie podamy id usera to podstawiamy id aktualnie zalogowanego
    if($user_id == -1) {
        $user_id = $_SESSION['user_id'];
    }
    $result = mysql_query("SELECT * FROM `users` WHERE `user_id` = '{$user_id}' LIMIT 1");
    if(mysql_num_rows($result) == 0) {
        return false;
    }
    return mysql_fetch_assoc($result);
}

// funkcja na pobranie danych usera
function get_user_data($user_id = -1) {
    // jeśli nie podamy id usera to podstawiamy id aktualnie zalogowanego
    if($user_id == -1) {
        $user_id = $_SESSION['user_id'];
    }
    $result = mysql_query("SELECT * FROM `users` WHERE `user_id` = '{$user_id}' LIMIT 1");
    if(mysql_num_rows($result) == 0) {
        return false;
    }
    return mysql_fetch_assoc($result);
}
// startujemy sesje
session_start();
 
// jeśli nie ma jeszcze sesji "logged" i "user_id" to wypełniamy je domyślnymi danymi
if(!isset($_SESSION['logged'])) {
    $_SESSION['logged'] = false;
    $_SESSION['user_id'] = -1;
}
?>
<!DOCTYPE html>

Byłbym wdzięczny za pomoc.
Pozdrawiam.

0

I tak cały kod jest do śmieci, bo się do niczego innego nie nadaje, więc przemyśl temat pisząc to od zera ;) Ale pierwsze PRZEMYŚL, potem PISZ.
Tu są tak podstawowe dziury, że się płakać chce.

A bardziej na temat:

A zadając pytanie bądź KONKRETNY. Wskaż tylko te tabele i ten kod, który MA ZWIĄZEK z problemem, a nie wrzucasz listing na 6 ekranów i myślisz, że ktoś będzie przebierał w tym istoty Twojego problemu?

0

Standardowo

  1. Zamiast mysql - PDO + prepared statements.
  2. hashowanie haseł: http://php.net/manual/en/function.password-hash.php
  3. oddzielenie logiki od widoku - MVC
  4. CSS używaj w stylach zewnętrznych, bo później będziesz przeszukiwał x stron i szukał w którym tagu dałeś źle jakiś atrybut.
0
dzek69 napisał(a):

I tak cały kod jest do śmieci, bo się do niczego innego nie nadaje, więc przemyśl temat pisząc to od zera ;) Ale pierwsze PRZEMYŚL, potem PISZ.
Tu są tak podstawowe dziury, że się płakać chce.

Płakać to można, ale nad jakimś znanym CMSem, bo tam jest burdel, nie kod. U mnie też jest burdel, ale uspokajam: nim portal ruszy, to ten syf w dużej mierze zostanie usunięty.

dzek69 napisał(a):

A bardziej na temat:

A zadając pytanie bądź KONKRETNY. Wskaż tylko te tabele i ten kod, który MA ZWIĄZEK z problemem, a nie wrzucasz listing na 6 ekranów i myślisz, że ktoś będzie przebierał w tym istoty Twojego problemu?

Problem w tym, że czasami dostaję joby właśnie za to, że jest tylko kawałek kodu, nie całość.

Tumeg napisał(a):

Standardowo

  1. Zamiast mysql - PDO + prepared statements.
  2. hashowanie haseł: http://php.net/manual/en/function.password-hash.php
  3. oddzielenie logiki od widoku - MVC
  4. CSS używaj w stylach zewnętrznych, bo później będziesz przeszukiwał x stron i szukał w którym tagu dałeś źle jakiś atrybut.

Co do punktu 4 to się w dużej mierze stosuję, punkt numer 2 jest w drodze, a za propozycję 1 i 3 - dopiszę sobie.
No to już tłumaczę najważniejsze pytanie, z którym mam największy problem:
Chodzi o to, iż jest tabela z wpisami i w jednej z kolumn jest podany numer id użytkownika, i właśnie chciałem połączyć dane, podobnie jak w tym temacie: http://www.elektroda.pl/rtvforum/viewtopic.php?t=2131871 . Tyle, iż niestety nie wiem za bardzo, jak przerobić tą frazę, żeby pasowało, bo jak zrobię "po swojemu", to wyskakuje masa errorów.
Finalnie miałoby wyglądać mniej więcej tak:
https://drive.google.com/open?id=0B0fWxGzPqKMVejltU09tam5vNmc
(to jest wizualizacja zrobiona na podstawie poniższej tabelki, bawiąc się inspektorem)
A oto najważniejszy kawałek kodu:

<?php
//Pobieramy dane z bazy
$query = mysql_query ("SELECT * FROM `buzz` ORDER BY `data` DESC LIMIT 5"); 
 
//Początek struktury tabeli
echo '<table width="100%">';
 
//Pętla do wyświetlenia wszystkich wpisów
while($shout=mysql_fetch_array($query)) { 
  echo '
<div style="color: #000; margin: 5px; padding: 5px;">
<b><a href="profile.php?id='.$shout['uid'].'">'.$shout['uid'].'</a>:</b> <small>'.$shout['data'].'</small><br/>
'.$shout['kpost'].'<br/>
<small>
<font face="Arial,Helvetica" size="-1"><input value="+1" class="sm btnA btnC" type="SUBMIT"></font>
- Skomentuj - Udostępnij
</small>
</div>';
}
 
//Koniec struktury tabeli
echo '</table>'; 
?>

Z góry dzięki za pomoc.
Pozdrawiam.

0

Serio, zacznij to pisać od nowa ;]
Co do problemu z połączeniem dwóch tabel: https://pl.wikipedia.org/wiki/Klucz_obcy i poczytaj o JOIN

1 użytkowników online, w tym zalogowanych: 0, gości: 1