Personal Message system v1.0

Door Robin de Vries, 15 jaar geleden, 6.490x bekeken

Een uitgebreid pm systeem gebaseerd op een aangepaste versie van http://www.phphulp.nl/php/scripts/8/439/

DIT is mijn 1e script commentaar geven mag maar geef aub ook meteen de oplossing

###update 3-mei##########
#Alle * weggewerkt#########
# inbox: session start bovenaan#
#voorbeeld online! #########
#####################

de volgende functies bevinden zich:
- inbox
-archief
- verwijderen
- admin highlighting

ik heb niet de moeite genomen om mijn naam overal in te zetten aangezien dat toch weer verwijderd wordt! Gebruiken, aanpassen, posten mag best want php is van iedereen! so no copyright!

Misschien is de stijl een beetje vreemd maar je moet hem natuurlijk zelf aanpassen

pagina's:
- config.php //kun je vervangen als je maar connectie maakt
- pm_inbox.php //je inbox alle nieuwe berichten
- pm_archief.php // archief
- pm_read //lees de berichten die geselecteerd zijn
- pm_send.php // verstuur een nieuw bericht (admin highlighting)
- pm_verwerk.php //verwerkt alle aanpassingen in de database

aanpassen:
config.php
$_SESSION['user_id']= id van de user
$_SESSION['user_status'] = status (1 = admin)(0 = normal)

Oja en in gebruikers tabel moeten de volgende velden zijn:
voornaam // Voornaam
achternaam //achternaam
naam // username

Zorg er voor dat de sessies zijn gestart!

Oja heel belangrijk: bij het lezen,aanpassen, deleten, verplaatsten van het bericht wordt altijd gekeken naar de ontvangen klopt die niet met de sessie dan gaat het niet door!

Voorbeeld: http://ddevries.nl/phphulp/

Gesponsorde koppelingen

PHP script bestanden

  1. personal-message-system-v10

 

Er zijn 34 reacties op 'Personal message system v10'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
JeffreyG
JeffreyG
15 jaar geleden
 
0 +1 -0 -1
ziet er tot zover netjes uit ;)
Menno
menno
15 jaar geleden
 
0 +1 -0 -1
Voorbeeldje?
Misschien handig :P
Robin de Vries
Robin de Vries
15 jaar geleden
 
0 +1 -0 -1
vb komt morgen
Harmen
Harmen
15 jaar geleden
 
0 +1 -0 -1
ziet er goed uit.. trouwens.. volgens mij is dit het 999ste script hier. zie de URL: phphulp.nl/php/scripts/3/999/
GaMer B
GaMer B
15 jaar geleden
 
0 +1 -0 -1
Offtopic:
Wat zal de 1000ste worden? Zo'n gejatte van PHPFreakz ofzo? :P


Ziet er goed uit, nu nog live kunnen zien in een demo, dus wachten tot morgen :)
M Ypma
M Ypma
15 jaar geleden
 
0 +1 -0 -1
opzet is goed. Maar dat het er goed uit ziet ben ik niet eens met mijn voorgangers. Wat opbouwende kritiek puntjes:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
// wat is de user id?
$userid = $_SESSION['user_id'] ;
?>

je haalt de waarde uit een sessie en zet deze zonder iets te veranderen in een nieuwe variabele. Nu heb je dus 1 stukje info op 2 plaatsen staan. je hebt dus voor deze waarde ook nog eens dubbel geheugen in gebruik. erg zonde. voer een controle uit of de waarde nog wel die waarde is die je verwacht en gooi erna die offset weg uit je sessie array of blijf je sessie gebruiken.

het zelfde geld voor:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?
$id
= $pm['id'];
$onderwerp = $pm['onderwerp'];
$admin = $pm['admin'];
$bericht = $pm['bericht'];
$status = $pm['status'];

// en overal waar je je $_POST global omzet
?>


Het volgende zal notices opleveren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?

if(isset($_REQUEST['actie'])) $actions=$_REQUEST['actie'];
if($actions=="verstuur"){
?>


wat nou als $_REQUEST['actie'] niet is gezet? dan zal $actions niet aan gemaakt worden en heb je een if statement met een niet bestaand var. En dat is alles behalve netjes

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
//filter
$status ="1";
?>


een int hoor je niet te quoten.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
//even de tijd parsen
$tijd = strtotime($pm['tijd']);
?>


strtotime is 1 van de meest zwaarste functies binnen PHP en deze dien je zoveel mogelijk te ontwijken... Zeker als je hem gebruikt voor een MySQL result. De database biedt jou al de mogelijkheid om van je datetime veld een time stamp te maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$nvan_SQL
="SELECT voornaam,achternaam,naam FROM gebruikers WHERE id=$id_naar  ";
?>


des te verder we komen des te onduidelijker je variabele naamgevingen worden. probeer hier een standaard in te vinden en wen jezelf deze aan. Ook je variabelen buiten quotes is stukken netter en leesbaarder!

Tot dusver wat mij opviel, hoop dat je er iets aan hebt.
Joeri
Joeri
15 jaar geleden
 
0 +1 -0 -1
Mooi script al moet ik me volledig aansluiten bij de reactie hierboven.
Netjes en duidelijk scipten is een must!!

voor de rest proper gemaakt maar zo ken ik al zoveel goede of betere pm scripts met db. Wat voegt dit toe aan de script lib??

Grtz.
Jorik
Jorik
15 jaar geleden
 
0 +1 -0 -1
Mag ik vragen wat je nu gebruikt hebt van mijn inlogsysteem, waar het op gebaseerd is? Want ik vind niets van m'n eigen code terug :-)... Of is het alleen de benaming van de sessies?
Ziet er verder wel leuk uit, netjes gedaan!
Klaasjan Boven
Klaasjan Boven
15 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
SELECT * FROM // nooit * gebruiken
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$id
= $_GET['id']; // geen beveiliging?
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$actions
=$_REQUEST['actie'] // wat wordt doet dat daar??
?>


al met al sluit ik mij aan bij Michel Net geen voldoende
Paul K
Paul K
15 jaar geleden
 
0 +1 -0 -1
Waarom tables en geen divs?
Vincent
Vincent
15 jaar geleden
 
0 +1 -0 -1
Klaasjan waarom:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
SELECT * FROM // nooit * gebruiken
?>

??
Klaasjan Boven
Klaasjan Boven
15 jaar geleden
 
0 +1 -0 -1
@Vincent veel trager dan de velden die je wilt opnoemen. Daar komt nog bij dat las je dit doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$sql
="SELECT * FROM tabel";
$res=mysql_query($sql);
while($info=mysql_fetch_array($res))
{

echo $info['wat??'];
}

?>


Noem ik echter de velden dan krijg je zoiets
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$sql
="SELECT jouw, velden FROM tabel";
$res=mysql_query($sql);
while($info=mysql_fetch_array($res))
{

echo $info['jouw'];
echo $info['velden'];
}

?>


Zie sneller en makkelijker
Jens P
Jens P
15 jaar geleden
 
0 +1 -0 -1
Je script is niet echt veilig, je kan javascript gebruiken en zo sessions en cookies stelen (het loginsysteem werkt ook met een "login onthouden" functie wat het enkel makkelijker maakt)
Ook kan je ALLE pm's verwijderen als je naar iets gelijkaardigs als
pm_verwerk.php?actie=verwijder&id=2 OR 1 = 1--
surft, dat was toch niet de bedoeling, dacht ik?
Robin de Vries
Robin de Vries
15 jaar geleden
 
0 +1 -0 -1
@Jorik Ik heb een website gebouwd met jouw inlog systeem de tabel gebruikers en $_SESSION komen allemaal van jouw systeem

@Jens Wil je een oplossing hiervoor geven

@de rest ik vindt het irri op $_POST of $_SESSION te gebruiken dus zet ik het in een nieuwe variabele die dan meestal ook zo heet maar dan zonder $_POST. En de rede dat ik request gebruik is omdat ik zowel get als post gebruik! Maar ik zal het aanpassen en het sterretje verwijderen

bedankt voor jullie verbeteringen!
M Ypma
M Ypma
15 jaar geleden
 
0 +1 -0 -1
@robin

zolas ik al zei kan het opzich geen kwaad, als jij dat lekkerder vindt werken, maar blijf dan wel netjes werken ne gooi je oude variabele weg

$fiets = $_POST['fiets'];
unset($_POST['fiets']);
Robin de Vries
Robin de Vries
15 jaar geleden
 
0 +1 -0 -1
@michel bedankt voor die code en ik zal hem bij de volgende update erin zetten!
Jens P
Jens P
15 jaar geleden
 
0 +1 -0 -1
@Robin:
Enkele tutorials doornemen ivm XSS en SQL-injection kan goed zijn om te beginnen, hier staat er een goeie: http://cirimus.livejournal.com/ , http://www.phphulp.nl/php/tutorials/3/444/ (wel niet zo'n grote) en even Google-en kan ook geen kwaad.

Wat je hier concreet kan doen is alles in je query om te beginnen tussen quotes zetten om te beginnen en ook gebruik maken van de functie "mysql_real_escape_string()", en van "intval()" indien de waarde enkel numeriek mag zijn.
Bij de pagina "pm_inbox.php" komt dit op het volgende neer:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
include("config.php");
?>

 <h2>Personal Message: inbox</h2><br/>
        <a href="pm_inbox.php"><b>Inbox </b></a><a href="pm_archief.php"> Archief </a><a href="pm_send.php">Nieuw bericht</a>
<br /><br />
                <table border="1">
<tr><td width="200">Onderwerp</td><td width="150">Afzender</td><td width="100">Verstuurd op:</td><td width="100">Opties</td></tr>
<?php
// wat is de user id?
$userid = $_SESSION['user_id'] ;
//filter
$status = "0";
//de user zijn eigen berichten laten ophalen en  zorg dat alleen de nieuwe berichten worden weergeven
$pm_SQL = "SELECT id,naar,van,admin,status,onderwerp,bericht,tijd FROM pm WHERE naar='$userid' AND status='$status' ORDER BY tijd";
//nu de SQL opdracht verwerken
$pm_result = mysql_query($pm_SQL);
// een while lus op alle berichten te weergeven
while($pm = mysql_fetch_array($pm_result))
{

    //variabelen netjes
    $id = intval($pm['id']);
    $onderwerp = stripslashes(htmlspecialchars($pm['onderwerp']));
    $admin = intval($pm['admin']);
    
    //de afzender
    $id_van = intval($pm['van']);
    //even id naar naam omzetten
    $van_SQL="SELECT voornaam,achternaam,naam FROM gebruikers WHERE id=$id_van ";
    $van_result = mysql_query($van_SQL);
    $vanvar = mysql_fetch_array($van_result);
    $vn = htmlspecialchars($vanvar['voornaam']);
    $an = htmlspecialchars($vanvar['achternaam']);
    $un = htmlspecialchars($vanvar['naam']);
    
    //even de tijd parsen
    $tijd = strtotime($pm['tijd']);
    //uitkomst while lus  
    ?>

    <tr>
    <td>
    <a href="pm_read.php?id=<?= $id ?>">
    <?php
    if($admin==1)
    {

    echo "<b>ADMIN: ".$onderwerp."</b>\n";
    }

    else
    {
        echo $onderwerp;
    }

    ?>

    </a></td>
    <td><?php echo "$vn $an ($un)"; ?></a></td>
    <td><?php echo date("j-n-y H:i",$tijd); ?></td>
    <td><a href="pm_verwerk.php?actie=verwijder&id=<?php echo $id; ?>">Verwijder </a><a href="pm_verwerk.php?actie=archief&id=<?php echo $id; ?>">Archiveer</a></td>
    </tr>
    <?php
    //einde while lus
}
?>

Het kan zijn dat dit nog niet 100% is, ik heb het ook maar in de vlugte even aangepast.
Robin de Vries
Robin de Vries
15 jaar geleden
 
0 +1 -0 -1
@Jens bedankt voor je verbetering en ik zal hem bij de volgende update erin zetten! Ik zal ook SQL injection eens doornemen bedankt!
Elwin - Fratsloos
Elwin - Fratsloos
15 jaar geleden
 
0 +1 -0 -1
Voor de Remi's onder ons is het leuk dat je een bericht kan sturen naar jezelf...

Elwin
Gerjan
gerjan
15 jaar geleden
 
0 +1 -0 -1
kun je ook make dat er wordt weer gegeve bijv.. (1 nieuw bericht) in inbox...
zo ja hoe? (ik heb geen id namelijk..)
Robin de Vries
Robin de Vries
15 jaar geleden
 
0 +1 -0 -1
ik zal kijken maar ik heb het erg druk
Gerjan
gerjan
15 jaar geleden
 
0 +1 -0 -1
oke, dat zou heel erg fijn zijn als u/je dat zou willen doen, alvast bedankt
Jens P
Jens P
15 jaar geleden
 
0 +1 -0 -1
Daarvoor zal er een veld in de tabel moeten toegevoegd worden die aangeeft of het bericht al gelezen is of niet, dus is daar niet zo direct een oplossing voor te geven, want dan moet het syteem een beetje anders zijn natuurlijk.
Maar ik denk dat het belangrijker is om eerst het script fatsoenlijk te beveiligen. :)
Gerjan
gerjan
15 jaar geleden
 
0 +1 -0 -1
ja ik heb em al beveiligd... maar zijn er nog andere "goede pm systemen" die dat wel kunne..(ik kan er geen vinde :S) maar het liefste heb ik dat deze aangeeft voor nieuwe berichte.. want ik heb deze al geintregreerd...
Thomas
Thomas
15 jaar geleden
 
0 +1 -0 -1
ziet er gaaf uit! maar, hoezo kan je geen berichten verwijderen?? ik krijg te zien "deze actie is niet aangegeven" hoe zit dat
Jan geen
Jan geen
15 jaar geleden
 
0 +1 -0 -1
nieuwe berichten weergeven: extra kolom in de database int ofzo 0 is niet gelezen 1 wel. dan kun je heel makkelijk opvragen of een bericht is gelezen en hoeveel nieuwe berichten je hebt.
Yannick
Yannick
15 jaar geleden
 
0 +1 -0 -1
leuk en mooi script heb hem alleen wel helemaal moeten aanpassen weet je zeker dat deze gebasseerd is op dat grote inlog systeem ?

groetjes

yannick
Harmen
harmen
14 jaar geleden
 
0 +1 -0 -1
heel vet.. maar wel heel moeilijk om er aan te beginnen
Robin de Vries
Robin de Vries
14 jaar geleden
 
0 +1 -0 -1
ik ben nu een stuk meer ervaren dan ik april... ik zal proberen binnenkort een veiligere versie van het script te posten...

(versie 2.0)
met een adres boek, en verzonden item's lijst.. en ook makkelijker in te brengen in jullie eigen scripts...

bij vragen kunnen jullie me altijd e-mailen
Buddy Bgh
Buddy Bgh
14 jaar geleden
 
0 +1 -0 -1
ben benieuwd!
Robin de Vries
Robin de Vries
14 jaar geleden
 
0 +1 -0 -1
maar ik heb het druk dus alle tijd....
Harmen
harmen
14 jaar geleden
 
0 +1 -0 -1
Kan deze ook op PHP mylogon???
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robin de Vries
Robin de Vries
14 jaar geleden
 
0 +1 -0 -1
geen idee, maar deze versie zou ik niet proberen te installeren. De veiligere versie komt ook nog.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. personal-message-system-v10

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.