nlbr werkt niet
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
function nlbr($tekst){
$tekst = str_replace("\\r\\n","<br />",$tekst);
return $tekst;
}
$text = nlbr($row->message);
$text = Environment::Filter($text);
echo $text;
?>
function nlbr($tekst){
$tekst = str_replace("\\r\\n","<br />",$tekst);
return $tekst;
}
$text = nlbr($row->message);
$text = Environment::Filter($text);
echo $text;
?>
En weergeeft de volgende uitkomst:
Terwijl het dit moet zijn:
Environment::Filter doet het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
public static function Filter($value, $enableHTML = 1) {
switch($enableHTML)
{
case 1:
return mysql_real_escape_string(htmlentities($value,ENT_QUOTES));
break;
case 2:
return mysql_real_escape_string($value);
break;
default:
return mysql_real_escape_string($value);
break;
}
}
?>
public static function Filter($value, $enableHTML = 1) {
switch($enableHTML)
{
case 1:
return mysql_real_escape_string(htmlentities($value,ENT_QUOTES));
break;
case 2:
return mysql_real_escape_string($value);
break;
default:
return mysql_real_escape_string($value);
break;
}
}
?>
Alvast bedankt voor de hulp
Code tags aangepast.[/modedit]
Gewijzigd op 17/12/2013 17:39:21 door Wouter J
Dat is in de database wel het geval, maar tijdens het uitvoeren van de $text string niet.
\n
\n\r
Allemaal opties die allemaal hetzelfde doen, maar dan voor een andere OS. Gebruik gewoon nl2br, die houdt rekening met al deze inconsistenties.
Wat opmerkingen:
- Gebruik true en false, geen 1 en 2
- mysql_real_escape_string is alleen voor, je hoort het goed, MySQL. Een database dus, het heeft niks maar dan ook niks te doen met gegevens die je echoëd.
- htmlentities, die zorgt dat HTML tags niet gerendert worden. Dus die <br> die nlbr (of de betere nl2br) in de strings plaatst worden allemaal niet gerendert. Oplossing? Plaats nlbr (of de betere nl2br) na de filter method
- als default en een case gelijk zijn kun je gewoon die cache weghalen.
- bij een return stopt de method executie, PHP zal dus nooit bij break; aankomen, die kan dus ook gewoon weg
Om te beginnen; je weet dat php die functie al standaard heeft?
Ze heet nl2br , zie http://php.net/nl2br .
--------
Je mag niet alle filter-functies tegelijk gebruiken.
Van elk van die functies moet je zelf heel goed beseffen waarom je ze gebruikt. Anders gebruik je ze fout.
mysql_real_escape_string() is om mysql_ string te maken.
bv.
Code (php)
1
2
2
<?php $sql = "SELECT username, email, rank FROM users WHERE username='" . mysql_real_escape_string($_POST['username']) . "'" ;
?>
?>
Je mag niet zomaar overal mysql_real_escape_string gebruiken.
Voor gelijk welke andere reden dan een SQL-string maken, gebruik je mysql_real_escape_string dus niet!
----
htmlentities() gebruik je om de HTML te beschermen.
bv. iemand post dit:
$_POST['message'] = "IK ben John.</div></div>";
Als je dit zomaar op het scherm zet, worden die </div> 's actief; en wees maar gerust dat dit de layout van je hele website naar de *** helpt.
Wat doet htmlentities? htmlentities transformeert html-elementen (de speciale karakters in de tags) in karakters die geen actieve HTML-functionaliteit hebben.
bij voorbeeld: het element <br /> wordt omgezet naar <br />. Dat ziet er (op het scherm) exact uit zoals <br />, maar heeft niet de actieve werking, die zorgt dat je een nieuwe lijn ziet.
... en dit is precies wat jij voor hebt.
----
Dus:
Gooi function filter() maar weg. Ze helpt je niet.
Nu ben ik wel benieuwd in welke context je deze functies gebruikt.
Laat ons dat probleem even bespreken; dan zetten we daar direct de juiste functies.
Gewijzigd op 17/12/2013 17:48:37 door Kris Peeters
Code (php)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
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
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
/**
* @author Rick
* @copyright 2013
*/
//include("include/ubb.class.php");
function nlbr($tekst){
$tekst = str_replace("\\r\\n","<br />",$tekst);
return $tekst;
}
function ubb($text) {
$text = preg_replace("#\[b\](.*?)\[/b\]#si","<b>\\1</b>", $text);
$text = preg_replace("#\[u\](.*?)\[/u\]#si","<u>\\1</u>", $text);
$text = preg_replace("#\[i\](.*?)\[/i\]#si","<i>\\1</i>", $text);
$text = preg_replace("#\[img\](.*?)\[/img\]#si","<img src=\\1>", $text);
return $text;
}
if(isset($_GET['cat_id']) || isset($_GET['id'])){
include("pages/news/cat.php");
}elseif(isset($_GET['id'])){
include("pages/news/id.php");
}else{
$per_pagina = 5; # aantal berichten per pagina
$first_last_link = true; # links naar eerste & laatste pagina
$start = isset($_GET['s']) && ctype_digit($_GET['s']) ? $_GET['s'] : 0;
$sql = MySQL::Query("SELECT * FROM news ORDER BY id DESC LIMIT {$start}, $per_pagina");
if(mysql_num_rows($sql) == 0){
echo'<div class="error">Er zijn nog geen nieuwsberichten geplaatst.</div>';
}else{
while($row = mysql_fetch_object($sql)){
?>
<div id="headernewsbig"><?php echo ucfirst(Environment::Filter($row->title)); ?></div>
<div id="big-content">
<div class="rank_blok">
<center>
<img src="images/profile/onbekend.png">
<br />
<?php
$sql_user = MySQL::Query("SELECT username,id FROM users WHERE id = '".Environment::Filter($row->user_id)."' ORDER BY id DESC LIMIT 1");
if(mysql_num_rows($sql_user) == 0){
echo'Onbekend';
}else{
?>
<a href="index.php?p=profile&id=<?php echo Environment::Filter($row_user->id); ?>">
<?php echo ucfirst(Environment::Filter($row_user->username)); ?>
</a>
<?php
}
?>
<br />
<?php echo Environment::Filter($row->date); ?>
</center>
</div>
<?php
$tags = array('html','opmaak'); // deze tags zal hij uitvoeren ubb_TAG(); (kijk in de klasse wat het precies doet)
$text = nlbr(ubb(htmlentities($row->message,ENT_QUOTES)));
echo $text;
?>
<p align="right"><a href="index.php?p=news&cat_id=<?php echo Environment::Filter($row->cat_id); ?>&id=<?php echo Environment::Filter($row->id); ?>">Reageren</a></p>
</div>
<div id="big-footer"></div>
<?php
}
}
?>
/**
* @author Rick
* @copyright 2013
*/
//include("include/ubb.class.php");
function nlbr($tekst){
$tekst = str_replace("\\r\\n","<br />",$tekst);
return $tekst;
}
function ubb($text) {
$text = preg_replace("#\[b\](.*?)\[/b\]#si","<b>\\1</b>", $text);
$text = preg_replace("#\[u\](.*?)\[/u\]#si","<u>\\1</u>", $text);
$text = preg_replace("#\[i\](.*?)\[/i\]#si","<i>\\1</i>", $text);
$text = preg_replace("#\[img\](.*?)\[/img\]#si","<img src=\\1>", $text);
return $text;
}
if(isset($_GET['cat_id']) || isset($_GET['id'])){
include("pages/news/cat.php");
}elseif(isset($_GET['id'])){
include("pages/news/id.php");
}else{
$per_pagina = 5; # aantal berichten per pagina
$first_last_link = true; # links naar eerste & laatste pagina
$start = isset($_GET['s']) && ctype_digit($_GET['s']) ? $_GET['s'] : 0;
$sql = MySQL::Query("SELECT * FROM news ORDER BY id DESC LIMIT {$start}, $per_pagina");
if(mysql_num_rows($sql) == 0){
echo'<div class="error">Er zijn nog geen nieuwsberichten geplaatst.</div>';
}else{
while($row = mysql_fetch_object($sql)){
?>
<div id="headernewsbig"><?php echo ucfirst(Environment::Filter($row->title)); ?></div>
<div id="big-content">
<div class="rank_blok">
<center>
<img src="images/profile/onbekend.png">
<br />
<?php
$sql_user = MySQL::Query("SELECT username,id FROM users WHERE id = '".Environment::Filter($row->user_id)."' ORDER BY id DESC LIMIT 1");
if(mysql_num_rows($sql_user) == 0){
echo'Onbekend';
}else{
?>
<a href="index.php?p=profile&id=<?php echo Environment::Filter($row_user->id); ?>">
<?php echo ucfirst(Environment::Filter($row_user->username)); ?>
</a>
<?php
}
?>
<br />
<?php echo Environment::Filter($row->date); ?>
</center>
</div>
<?php
$tags = array('html','opmaak'); // deze tags zal hij uitvoeren ubb_TAG(); (kijk in de klasse wat het precies doet)
$text = nlbr(ubb(htmlentities($row->message,ENT_QUOTES)));
echo $text;
?>
<p align="right"><a href="index.php?p=news&cat_id=<?php echo Environment::Filter($row->cat_id); ?>&id=<?php echo Environment::Filter($row->id); ?>">Reageren</a></p>
</div>
<div id="big-footer"></div>
<?php
}
}
?>
Rick kem op 17/12/2013 17:10:51:
Uhm, als ik de uitkomst zie, dan staan daar alleen html break elementen in en geen linebreaks. Missie geslaagd toch?
Erwin H op 17/12/2013 17:50:44:
ik vraag me af wat de poster nu eigenlijk wel.
Op het scherm ziet hij <br/ >
Als hij de page source bekijkt, ziet hij <br />
Wat hij wil:
Op het scherm wil hij een nieuwe lijn zien.
Als hij de page source bekijkt, wil hij <br /> zien
------
Maar toch even verder gaan op Erwin zijn vraag.
Wil je dit echt wel? Wil je echt dat tekst uit een database zorgt voor actieve HTML?
Wie heeft die tekst in die DB gestoken? News items, juist? Dus mensen posten via jouw site een tekst. Een tekst met UBB. Die tekst gaat naar de DB.
Je wil niet dat gebruikers de mogelijkheid hebben om de layout van jouw site aan te passen.
De normale gang van zaken, is de volgende.
Op jouw site staat een <textarea> Daarin worden nieuwe lijnen opgeslagen als PHP_EOP (= "\n" of "\r\n").
Die worden dus als \n in de database gezet.
Wanneer je die post opnieuw op het scherm zet, passeer je de waarde door nl2br.
Dus, als ik me niet vergis:
Eerst de entities vervangen; dan is $row->message volledig HTML inactief.
Dan de nl vervangen door <br>
Dan de UBB vervangen
Wat je niet mag doen, is htmlentities gebruiken als filter bij de INSERT in de DB.
Dus, als je dit soort tekens in de db ziet: <br /> dan ben je fout bezig.
Gewijzigd op 17/12/2013 18:15:54 door Kris Peeters
Enige probleem (wat ik zie) is dus die htmlentities call. Haal die weg en klaar. Of, doe die voor het vervangen van de linebreaks.
P.S. mysql_real_escape_string aanroepen op dit punt zie ik op zich niet als een probleem (is geen oorzaak van de wat er nu gebeurt), maar is natuurlijk wel verkeerd.
Gewijzigd op 17/12/2013 18:23:01 door Erwin H