login  Naam:   Wachtwoord: 
Registreer je!
 Forum

smileys invoegen in mijn gastenboek (Opgelost)

Offline mrnico - 16/08/2015 13:13 (laatste wijziging 16/08/2015 13:20)
Avatar van mrnicoNieuw lid ik zou graag smileys willen toevoegen in mijn gastenboek maar ik heb geen idee hoe ik dit moet aanpakken hieronder heb ik de php code staan ik heb al wel een stel smileys gedownload maar ik ben er nog niet achter hoe ik ze hier kan laten invoeggen

  1. <?PHP
  2.  
  3. //Het adres van de mysql server, bijna altijd localhost
  4. $host = "localhost";
  5.  
  6. //De mysql username
  7. $user = "...";
  8.  
  9. //Het mysql wachtwoord
  10. $pass = "....";
  11.  
  12. //De gewenste database
  13. $db = "....";
  14.  
  15. //Het maximale aantal posts dat je per pagina wilt laten zien
  16. $posts_per_page = "15";
  17.  
  18. //Het maximale aantal paginas dat je bereikbaar wilt maken
  19. $maximum_paginas = "5";
  20.  
  21. if($host == "" || $user == "" || $pass == "" || $db == "" || $posts_per_page == "" || $maximum_paginas == "")
  22. {
  23. die("Niet alle configuratie instellingen zijn juist geset, draai installer.php of voer ze handmatig in aan de bovenkant van index.php!");
  24. }
  25.  
  26. ?>
  27.  
  28. <?PHP
  29.  
  30. //Start een sessie om bijvoorbeeld flooding te voorkomen
  31.  
  32. //Legt een verbinding met mysql
  33. $mysql = mysql_connect($host,$user,$pass) or die("Error connecting to mysql!");
  34.  
  35. //Verbind met de database
  36. mysql_select_db($db) or die("Error selecting database!");
  37.  
  38. ?>
  39.  
  40. <html>
  41.  
  42. <head>
  43.  
  44. <style type="text/css">
  45.  
  46. .body
  47. {
  48. font-family: Verdana, Arial, Helvetica, sans-serif;
  49. font-size: 11px;
  50. text-align: center;
  51. list-style-position: inside;
  52. }
  53.  
  54. </style>
  55.  
  56. <title>
  57. Guestbook
  58. </title>
  59.  
  60. </head>
  61.  
  62. <body class="body" link="#000000" alink="#000000" vlink="#000000">
  63.  
  64. <?PHP
  65.  
  66. //Als de sessie variabele post niet bestaat of false is, includeer dan het formulier
  67. if(!isset($_SESSION["post"]) || $_SESSION["post"] = false)
  68. {
  69. //Includeer het formulier
  70. ?>
  71.  
  72. <form action="<?PHP echo $_SERVER['PHP_SELF']; ?>" method="post">
  73.  
  74. <table class="body">
  75. <tr>
  76. <td>
  77. Naam:
  78. </td>
  79. <td>
  80. <input type="text" name="name"><br><br>
  81. </td>
  82. </tr>
  83.  
  84. <tr>
  85. <td>
  86. Email:
  87. </td>
  88. <td>
  89. <input type="text" name="email"><br><br>
  90. </td>
  91. </tr>
  92.  
  93. <tr>
  94. <td>
  95. Bericht:
  96. </td>
  97. <td>
  98. <textarea name="bericht" cols="30" rows="5"></textarea><br><br>
  99. </td>
  100. </tr>
  101.  
  102. <tr>
  103. <td>
  104. <input type="submit" name="submit" value="verzend"><br><br>
  105. </td>
  106. </tr>
  107. </table>
  108.  
  109. </form>
  110.  
  111. <?php
  112. }
  113.  
  114. //Controleer of de submit knop is ingedrukt
  115. if(isset($_POST["submit"]))
  116. {
  117. //Controleer of alle velden zijn ingevuld
  118. if(isset($_POST["name"]) && !empty($_POST["name"])
  119. && isset($_POST["email"]) && !empty($_POST["email"])
  120. && isset($_POST["bericht"]) && !empty($_POST["bericht"]))
  121. {
  122. //Checkt of er niet al gepost is dmv de sessie variabele
  123. if(!isset($_SESSION["post"]) || $_SESSION["post"] = false)
  124. {
  125. if(validate() == true)
  126. {
  127. //Checkt of ditzelfde bericht niet al eens gepost is dmv hash
  128. if(check_hash() == true)
  129. {
  130. //Voeg de post in via de insert_post() functie en sla de return waarde op in $result
  131. $result = insert_post();
  132.  
  133. //Als de return waarde 1 was, en het dus goed gegaan is
  134. if($result == 1)
  135. {
  136. //Echo het bericht dat alles is goed gegaan
  137. echo "Het bericht is toegevoegd!<br><br>";
  138.  
  139. //Stelt de sessie variabele in die er voor zorgt dat er maar 1 keer gepost kan worden
  140. $_SESSION["post"] = true;
  141. }
  142.  
  143. //Als de return waarde iets anders dan 1 was, en er dus iets fout ging
  144. else
  145. {
  146. //Echo het bericht dat er iets fout ging
  147. echo "Het bericht is niet toegevoegd!<br><br>";
  148.  
  149. //En echo de eventuele mysql query error
  150. }
  151. }
  152.  
  153. //Als het wel al gepost is
  154. elseif(check_hash() == false)
  155. {
  156. //Laat de gebruiker weten dat het bericht al bestaat
  157. echo "Exact ditzelfde bericht is al eens gepost, het is dus niet meer nodig!<br><br>";
  158. }
  159. }
  160.  
  161. else
  162. {
  163. echo "Het door u ingevulde email adres was niet correct!<br><br>";
  164. }
  165. }
  166.  
  167. //Als er al gepost is
  168. else
  169. {
  170. //Echo dat er al gepost is
  171. echo "U heeft al gepost in deze sessie, dit is een gastenboek, geen spamboek!<br><br>";
  172. }
  173. }
  174.  
  175. //Als niet alle velden waren ingevuld
  176. else
  177. {
  178. //Echo dat niet alle velden waren ingevuld
  179. echo "Niet alle velden waren ingevuld!<br><br>";
  180. }
  181. }
  182.  
  183. //Roep de functie aan die hyperlinks naar beschikbare paginas zal tonen
  184. show_pages();
  185.  
  186. //Roep de functie aan die er voor zorgt dat de posts van de huidige pagina getoond worden
  187. show_posts();
  188.  
  189. mysql_close($mysql);
  190.  
  191. function show_posts()
  192. {
  193. //Deze functie laat de posts van de huidige pagina zien
  194.  
  195. //Includeer de benodigde configuratie variabelen
  196. global $posts_per_page, $maximum_paginas;
  197.  
  198. //Als de page variabele in de url niet is geset
  199. if(!isset($_GET["page"]))
  200. {
  201. //Geef $page de default waarde 1
  202. $page = 1;
  203. }
  204.  
  205. //Als de page variabele in de url wel is geset
  206. else
  207. {
  208. //Verkort de variabele
  209. $page = $_GET["page"];
  210. }
  211.  
  212. //Als de waarde van page kleiner is of gelijk is aan het maximum aantal toegestane paginas wordt de rest uitgevoerd
  213. if($page <= $maximum_paginas)
  214. {
  215. //Vermenigvuldigt de gewenste pagina met het gewenste aantal posts om de limit waarden vast te stellen
  216. $limit_start = ($page - 1) * $posts_per_page;
  217. $limit = $limit_start.", ".$posts_per_page;
  218.  
  219. //Declareert de mysql query die nodig is om de juiste berichten uit de database te selecteren
  220. $sql = "
  221. SELECT time, name, email, bericht FROM berichten ORDER BY time DESC LIMIT ".$limit.";
  222. ";
  223.  
  224. //Slaat de return waarde van de mysql quer op in result
  225. $result = mysql_query($sql);
  226.  
  227. //Echot de eventuele mysql error
  228.  
  229. //Ga rij voor rij de query uitvoeren en sla de waarden op in de array $row
  230. while($row = mysql_fetch_row($result))
  231. {
  232. //Verkort de variabelen om te verduidelijken wat wat is
  233. $time = $row['0'];
  234. $name = $row['1'];
  235. $email = $row['2'];
  236. $bericht = $row['3'];
  237.  
  238. //Echo een tabel voor iedere rij
  239. echo "<table class=\"body\" cellspacing=\"0\" border-radius=\"5px\">";
  240.  
  241. echo "<tr>";
  242. echo "<td bgcolor=\"#FF8000\" width=\"500\">";
  243. //Zorg er voor dat men kan mailen naar de poster door op de naam te klikken
  244. echo "<a href=\"mailto:".$email."\">".$name."</a> schreef op ".$time;
  245. echo "</td>";
  246. echo "</tr>";
  247.  
  248. echo "<tr>";
  249. echo "<td bgcolor=\"F3F781\">";
  250. //Echo het in deze rij opgehaalde bericht
  251. echo $bericht;
  252. echo "</td>";
  253. echo "</tr>";
  254.  
  255. echo "<table>";
  256.  
  257. echo "<br>";
  258. }
  259. }
  260.  
  261. //Als blijkt dat de waarde van page hoger is dan die van het maximum toegestane paginas
  262. elseif($page > $maximum_paginas)
  263. {
  264. //Echo dat dit aantal paginas niet is toegestaan door de beheerder
  265. //Deze situatie kan niet voorkomen wanneer er gewoon op links wordt geklikt, maar alleen door een "hack" poging
  266. echo "Het maximum aantal paginas is door de beheerder ingesteld op ".$maximum_paginas."!";
  267. }
  268. }
  269.  
  270. function insert_post()
  271. {
  272. //Deze functie injecteerd de zojuist ingevulde waarden in de database
  273.  
  274. //Dit stelt het formaat van tijd vast
  275. $time = date("d-m-y H:i:s");
  276.  
  277. //Dit declareert $hashed
  278. $hashed = md5($_POST["bericht"]);
  279.  
  280. //Dit declareert de query die gebruikt wordt om de ingevulde waarden te injecteren in berichten
  281. $sql = "
  282. INSERT INTO berichten
  283. (time, name, email, bericht, md5)
  284.  
  285. VALUES
  286.  
  287. ('".$time."',
  288. '".$_POST["name"]."',
  289. '".$_POST["email"]."',
  290. '".$_POST["bericht"]."',
  291. '".$hashed."');
  292. ";
  293.  
  294. //Dit slaat de return waarde op in result
  295. $result = mysql_query($sql);
  296.  
  297. //Dit retourneert de return waarde van de MySQL query
  298. return $result;
  299. }
  300.  
  301. function show_pages()
  302. {
  303. //Deze functie laat hyperlinks naar de beschikbare paginas zien
  304.  
  305. //Dit includeert de benodigde configuratie instellingen
  306. global $posts_per_page, $maximum_paginas;
  307.  
  308. //Dit declareert de query die gebruikt wordt om het huidige aantal berichten vast te stellen
  309. $sql = "
  310. SELECT id FROM berichten;
  311. ";
  312.  
  313. //Dit slaat de return waarde van de query op in result
  314. $result = mysql_query($sql);
  315.  
  316.  
  317. //Dit telt het aantal gevonden rijen, en daarmee dus het totaal aantal posts
  318. $num = mysql_num_rows($result);
  319.  
  320. //Als het aantal posts hoger is dan het aantal toegestane posts per pagina
  321. if($num > $posts_per_page)
  322. {
  323. //Deel dan het een door het ander en rond af naar boven om het benodigde aantal paginas vast te stellen
  324. $paginas = ceil($num/$posts_per_page);
  325.  
  326. //Als de waarde van paginas na de deling hoger is dan die van het ingestelde maximum
  327. if($paginas > $maximum_paginas)
  328. {
  329. //Verander de waarde van paginas dan in die van het maximum toegestane aantal
  330. $paginas = $maximum_paginas;
  331. }
  332.  
  333. //Laat de tekst Pagina: zien om duidelijk te maken dat er hier naar andere paginas gegaan kan worden
  334. echo "Pagina: ";
  335.  
  336. //Voer dit net zo vaak uit als de waarde van $paginas
  337. for($i=1;$i<=$paginas;$i++)
  338. {
  339. //Geef een link weer met het getal van het huidige pagina nummer
  340. echo "<a href=\"index.php?page=".$i."\">".$i."</a>&nbsp;";
  341. }
  342.  
  343. //Print 2 witregels voor het overzicht
  344. echo "<br><br>";
  345. }
  346. }
  347.  
  348. function check_hash()
  349. {
  350. //Deze functie vergelijkt de hash van het huidige bericht met dat van alle voorgaande berichten, om spam te voorkomen
  351.  
  352. //Declereert hashed
  353. $hashed = md5($_POST["bericht"]);
  354.  
  355. //Declareert de query die gebruikt wordt om te kijken of er al een row is met dezelfde md5 value
  356. $sql = "
  357. SELECT * FROM berichten WHERE md5 = '".$hashed."';
  358. ";
  359.  
  360. //Slaat de resultaten op in $result
  361. $result = mysql_query($sql);
  362.  
  363. //Echot een eventuele mysql error
  364.  
  365. //Zet het aantal resultaten in $num
  366. $num = mysql_num_rows($result);
  367.  
  368. //Als er resultaten zijn
  369. if($num > 0)
  370. {
  371. //Return false
  372. return false;
  373. }
  374.  
  375. //Als er geen resultaten zijn
  376. else
  377. {
  378. //Return true
  379. return true;
  380. }
  381. }
  382.  
  383. function validate()
  384. {
  385. //Deze functie controleerde de integriteit van de ingevulde gegevens
  386.  
  387. //Maakt de array email aan met als separator @
  388. $email = explode("@",$_POST["email"]);
  389.  
  390. //Als er meer dan 1 elementen in de array zitten
  391. if(count($email) > 1)
  392. {
  393. //Herdeclereert mail maar dan met . als separator
  394. $email = explode(".",$_POST["email"]);
  395.  
  396. //Als er meer dan 1 elementen in de array zitten
  397. if(count($email) > 1)
  398. {
  399. //Zet de waarde van $mail op true
  400. $mail = true;
  401. }
  402.  
  403. //Zoniet
  404. else
  405. {
  406. //Zet de waarde van mail op false
  407. $mail = false;
  408. }
  409. }
  410.  
  411. //Zoniet
  412. else
  413. {
  414. //Zet de waarde van mail op false
  415. $mail = false;
  416. }
  417.  
  418. //Als de waarde van mail true is
  419. if($mail == true)
  420. {
  421. //Haal rare tekens uit name
  422. $_POST["name"] = ereg_replace("[^A-Za-z0-9 ]", "", $_POST["name"]);
  423.  
  424. //Haal rare tekens uit bericht
  425. $_POST["bericht"] = ereg_replace("[^A-Za-z0-9 ]", "", $_POST["bericht"]);
  426.  
  427. //Retourneer true
  428. return true;
  429. }
  430.  
  431. //Als de waarde van mail niet true is
  432. else
  433. {
  434. //Retourneer false
  435. return false;
  436. }
  437. }
  438.  
  439. ?>
  440.  
  441.  
  442. </body>
  443.  
  444. </html>

4 antwoorden

Gesponsorde links
Offline Thomas - 16/08/2015 15:25
Avatar van Thomas Moderator Hm, de bovenstaande code ziet er enigszins... vintage uit .

Observatie: het is mogelijk dat gebruikers HTML en JavaScript in hun posts kunnen gebruiken, ik weet niet helemaal of dat de bedoeling is - deze opzet is namelijk niet bepaald veilig. Heb je dit script ergens vandaan gekopieerd of zelf geschreven?

Om op een enigszins veilige manier berichten weer te geven moet je op een zeker moment de inhoud van de af te drukken berichten (voordat je deze afdrukt uiteraard) ontdoen van hun speciale betekenis die deze binnen HTML kan hebben.

Als ik in jouw gastenboek op dit moment de volgende tekst type:
<b>Hello World</b>
Dan zal deze worden weergegeven als:
Hello World

Oftewel, HTML is "actief" in jouw berichten. Je hoeft niet er veel fantasie te hebben om een voorstelling te kunnen maken wat er gebeurt als ik ergens "</td></tr></table>" toevoeg of creatief ga zijn met JavaScript. Hiermee kan ik het gastenboek ontwrichten/breken/onklaar maken.

Ik zou hier dus zeker even naar kijken .

Om antwoord te geven op je vraag: meestal werken forums/gastenboeken als volgt: deze hebben een beperkt repertoir van toegestane codes -ook wel (U)BB codes genoemd-. Dit is een opmaak die wordt toegepast bij het afdrukken van een bericht, op dat moment worden er omzettingen gedaan van dat soort tekstpassages naar HTML. Hierbij wordt onderweg ook alle overige HTML onklaar gemaakt zodat jij de controle hebt over hoe een bericht wordt geinterpreteerd.

Bij het afdrukken van een bericht gebeurt grofweg het volgende:
- ergens onderweg wordt ALLE HTML/JavaScript onklaar gemaakt
- daarna worden de BB codes omgezet naar HTML (andersom kan niet, anders worden je geconverteerde BB codes weer onklaar gemaakt)
- andere opmaak wordt omgezet, zoals smileys

Een technische implementatie van het omzetten van een textuele smiley naar een afbeelding is simpel: dit kun je doen met een reeks simpele string_replaces(). Volgens mij staan er ook legio voorbeelden van hoe dit moet tussen onze scripts.

Het wordt natuurlijk spannend als je nog andere blokken introduceert, zoals code-blokken op dit forum. Hierbinnen zijn smileys weer niet actief. Je hebt dus verschillende passages tekst die verschillende behandeld moeten worden afhankelijk van hun context (lopende tekst of een codeblok). Je kunt dan in principe twee dingen doen: zet alle omzettingen in de goede volgorde zodat de inhoud op een juiste manier wordt omgezet of bouw een parser die eerst je volledige tekst opdeelt in stukken die vervolgens apart behandeld kunnen worden. Deze laatste variant is aanzienlijk ingewikkelder.

Een alternatief voor BB codes is een WYSIWYG (What You See Is What You Get) editor, die direct de visuele opmaak toont, maar dit voert wellicht een beetje ver voor een (simpel) gastenboek.
Offline mrnico - 16/08/2015 15:46
Avatar van mrnico Nieuw lid ik heb dit script inderdaad ergens gevonden

en gebruikt omdat dit de enige was die ik kon vinden waar het schrijf venster op de zelfde pagina zat als de geposte berichten

ik snap nog niet echt veel van php

java en html licht mij meer

maar ik moet dus op een of ander manier ubb codes er bij in zien te krijgen
Offline Thomas - 16/08/2015 16:00
Avatar van Thomas Moderator Een hele eenvoudige aanpassing die het geheel al iets veiliger zou maken is de volgende:

Vervang op regel 247 $email en $name door respectievelijk htmlspecialchars($email, ENT_QUOTES) en htmlspecialchars($name, ENT_QUOTES).

Voor de introductie van smileys zou je zoiets kunnen doen:
Vervang regel 254 (echo $bericht) door het volgende:

  1. // maak alle HTML etc. onklaar
  2. $bericht = htmlspecialchars($bericht, ENT_QUOTES);
  3. // zet smileys om
  4. $bericht = str_replace(
  5. // dit zijn achtereenvolgens de passages waar naar gezocht wordt
  6. ':(', // sadface
  7. ':)', // happy face
  8. // hier kun je nog meer smileys toevoegen
  9. ),
  10. // dit zijn de passages die achtereenvolgens hiervoor in de plaats komen
  11. '<img src="images/sadface.gif" />',
  12. '<img src="images/happyface.gif" />',
  13. // et cetera
  14. ),
  15. $bericht
  16. );
  17.  
  18. // druk het bericht af
  19. echo $bericht;


Je gastenboek is nu iets minder onveilig en er worden smileys omgezet naar afbeeldingen.

Vragen? Vragen! Maar probeer zelf eerst het een en ander uit.

Succes.
Bedankt door: mrnico
Offline mrnico - 16/08/2015 16:39 (laatste wijziging 16/08/2015 17:33)
Avatar van mrnico Nieuw lid die regel 247 is gelukt maar

smileys werken nu ook moest nog wat aanpassen in regel 458

die stond niet toe dat er : ; ( ) werden gebruikt
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.215s