nl2br plaatst teveel enters

Status
Niet open voor verdere reacties.

pzwalum

Gebruiker
Lid geworden
10 okt 2009
Berichten
11
Hallo,

Ik heb een probleem met de nl2br functie. Omdat het voor andere gebruikers op mijn site makkelijker is om nieuwsberichten te plaatsen als ze niets steeds < br> hoeven te typen als ze een volgende alinea willen beginnen heb ik nl2br geplaatst. In de nieuwsberichten zelf werkt dit prima. Het probleem ontstaat op de hoofdsite, waar je een verkorte versie van het nieuwsbericht ziet. Bij één enter krijg je in plaats van één enter 3 of 4 enters Kijk hier om te zien wat ik bedoel.

Hieronder vind je de code waar het probleem in ontstaat:

PHP:
<? 					if($sizeRow[2] >= 375)
					{
						for ($i = 0; $i <= 375; $i++)
						{
							echo nl2br("$textRow[$i]");						}
						echo "...";
					}
					else
					{
						echo nl2br("$textRow");
					}
?>

Wat me opvalt is dat als er 6 regels worden weergegeven dat er 4 enters ipv 1 ontstaan, en bij 5 regels 'slechts' 3 ipv 1. Kan dit ontstaan door de $i functie (dat is het enige verschil met het volledige nieuwsbericht), en zoja, hoe kan ik dit oplossen? Alvast bedankt! :)
 
Laatst bewerkt:
Waar pas je die nl2br toe? alleen op de hoofdpagina en/of bij het opslaan van het nieuwsbericht?
 
Waar pas je die nl2br toe? alleen op de hoofdpagina en/of bij het opslaan van het nieuwsbericht?

Alleen op de hoofdpagina dus alleen bij het weergeven, ik gebruik nl2br niet voor het opslaan naar de database toe, had op andere fora al gezien dat dat problemen kan opleveren.
 
Wat me opvalt is dat als er 6 regels worden weergegeven dat er 4 enters ipv 1 ontstaan, en bij 5 regels 'slechts' 3 ipv 1.

Ik corrigeer mezelf, het zijn steevast 3 regels ipv 1, had over het hoofd gezien dat ik bij één bericht inderdaad één enter meer had ;) Het probleem blijft echter hetzelfde.
 
Hoi Puk,
Als ik het zo zie (maar geen echte scriptoloog), wordt de nl2br er elke keer bij geplaatst bij de doorloop van $i op weg van 0 naar 375. Als de nl2br buiten de loop wordt gezet, ben je er waarschijnlijk van af:
PHP:
<? if($sizeRow[2] >= 375)
   {
      echo nl2br;
      for ($i = 0; $i <= 375; $i++)
      {
          echo ("$textRow[$i]");
      }
      echo "...";
   }
enz.

Terzijde: de html-validator heeft pittige kritiek. Er zitten vermoedelijk wat vreemde dingen in het moedersjabloon: de <head> op een rare plaats, geen <body>, geen </html>.
Het javascript in het begin hoort geen language="JavaScript" maar type="text/javascript" attribuut te krijgen. Als dit js trouwens in een apart js-bestandje wordt gezet, hoeft het niet elke pagina opnieuw ingemonteerd te worden, maar is het na bezichtiging van de eerste pagina al aanwezig op de computer van de bezoeker: snelheidswinst (+ geen overbodig op-en-neer zenden van datapakketjes = milieuwinst)! :)
Verder zijn in XHTML hoofdletters in de codering verboden, maar er zitten regelmatig tags in met hoofdletters <IMG SRC="..." enz.> i.p.v. <img src="..." enz.>.
- En nog zo wat van die dingen.
Als ik de homepage laat taxeren als "HTML 4.01 Transitional" i.p.v. als "XHTML 1.0 Transitional", dan vindt de html-validator maar "46 Errors, 23 warning(s)" i.p.v. "272 Errors, 23 warning(s)", dus een verandering van DOCtype zou ook wonderen kunnen doen.
Nu draait de site voor zover ik het kan bekijken zo ook wel, maar verbetering kan een goede weergave alleen maar ten goede komen: dus als je nog eens een uurtje over hebt... ;)

Met vriendelijke groet,
CSShunter
 
Laatst bewerkt:
Bedankt voor de reactie CSShunter, over het nl2br probleem, ik heb het geprobeerd zoals je had aangegeven maar dan komt er in het bericht eerst nl2br te staan, gevolgd door het nieuwsbericht zonder enters. Ik heb ook op de volgende manier geprobeerd:

PHP:
 <? if($sizeRow[2] >= 375)
   {
      echo "nl2br";
      for ($i = 0; $i <= 375; $i++)
      {
          echo ("$textRow[$i]");
      }
      echo "...";
   }

Dit werkte ook niet, en ook niet door de echo, ( en de " voor $textRow[$i] weg te halen.

Over de html-validator, een erg nuttige service, had ik nog nooit van gehoord. Ik werd beheerder van de site zonder enige ict kennis, dus ik hou de site nu draaiende voornamelijk door trial and error, dus dan sluipen er nogal veel schoonheidsfoutjes en wat grotere fouten in. Ik zal binnenkort iemand erbij halen met meer verstand van webbeheer die samen met mij de site kan opschonen ;) Heel erg bedankt voor de tips iig :)
 
Laatst bewerkt door een moderator:
Ik doe een laatste gok, en dan moeten de script-kenners het maar vertellen...
Zou die het met een gewone echo "<br>" doen?

Succes!
CSShunter
 
Ik snap niet goed waarvoor je de FOR-lus gebruikt.

Wat sla je op in je database en op welke manier?
 
Ik snap niet goed waarvoor je de FOR-lus gebruikt.

Wat sla je op in je database en op welke manier?

De site was al 'af' toen ik beheerder werd, dus ik pas enkel het bestaande aan. Maar wat er gebeurd op de hoofdpagina is dat de eerste 375 woorden van het nieuwsbericht worden getoond, als je meer van het bericht wilt lezen klik je op 'meer...' en krijg je het volledige nieuwsbericht te zien, vandaar die FOR-loop, want meeste nieuwsberichten zijn langer dan 375 woorden.

Bij het volledige bericht werkt nl2br perfect, maar op de hoofdpagina krijg je bij iedere enter 3 open regels ipv 1, en blijkbaar komt dit door die FOR-lus. Data wordt zonder html codes ingevoerd, meestal voeg ik later de codes in het SQL bestand toe voor de lay-out, de nl2br maakt het iig veel makkelijker. Ik kan wel de hele php code neerzetten hoe data wordt opgeslagen (vind het persoonlijk een nogal omslachtig systeem), maar is volgens mij niet waar het probleem zit.
 
Ik denk dat het er mee te maken heeft dat als je de tekst opslaat er door de php/html \n\r in de tekst gezet wordt en dus ook zo de in database wordt opgeslagen. Je kan het beste tijdens het opslaan de nl2br aan roepen en daarna niet meer. Dus op het moment van ophalen op de hoofdpagina niet nog een keer de nl2br aanroepen omdat je dan inderdaad dubbele enters krijgt.
Maar daar buiten, er hoeft helemaal geen for-lus te komen. Je kan het veel beter op de volgende manier oplossen:
PHP:
<?
if($sizeRow[2] >= 375)
   {
       $textRow[...] = substr($textRow[...],0,375); // even op de ... de juiste variabel neerzetten.
        echo nl2br($textRow[...]); // even op de ... de juiste variabel neerzetten.
      echo "...";
   }
?>
 
Laatst bewerkt:
nl2br aanroepen bij het opslaan is geen goed plan. Stel dat je het nog weer in een editor wit inladen, of whatever, dan moet je het weer gaan terugdraaien.

Ook het gebruik van substr is niet handig, want zo krijg je alleen de eerste 375 tekens, niet woorden.

Maar, pzwalum, geef eens aan wat er in die variabele zit. Doe eens print_r ( $textRow ); in je PHP bestand en post hier eens de output daarvan.

Als dat niet lukt, post dan even de volledige code ( inclusies de queries ) die zorgt voor de weergave.
 
nl2br aanroepen bij het opslaan is geen goed plan. Stel dat je het nog weer in een editor wit inladen, of whatever, dan moet je het weer gaan terugdraaien.

Ook het gebruik van substr is niet handig, want zo krijg je alleen de eerste 375 tekens, niet woorden.
...

Het was meer een aanname dat in $sizeRow[2] het aantal tekens werd gecontroleerd.
 
@ T-J, bedankt voor het meedenken, ik heb die code geprobeerd en het nl2br probleem is dan inderdaad opgelost, maar wat ErikBooy007 al opmerkte kan dan een woord halverwege afgebroken worden, opzich geen heel groot probleem maar staat niet heel netjes.

@ ErikBooy007, het print_r commando werkte niet helemaal, dus hieronder de volledige php code die voor de weergave zorgt:

PHP:
<?
	//Definiëren van Bibliotheken
	include("./Library/config.php");
	include("./Library/opendb.php");
	include("./Library/getData.php");


	//Omzetten van POST variabelen
	$rowStatus	= $_GET["rowStatus"];
	$last		= $_GET["last"];
	$next		= $_GET["next"];
	$prev		= $_GET["prev"];
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<script language="JavaScript">
<?
	include("./Library/dropDown.php");
?>
</script>

<head><? include("./Library/head.php"); ?></head>

<div id="header_container">
	<div id="header"><? include("./Library/mnuHead.php" ); ?></div>

	<div id="menuBar"><? include("./Library/menuBar.php" ); ?></div>
</div>


<div id="body_container">
	<div id="optionPan">
		<form name="options" action="index.php" method="GET" enctype="multipart/form-data">

		<? include("mnuOption.php"); ?></form>
	</div>

	<div id="post">
		<div id="postHead"></div>

		<div id="postBody">

<?			if ($rowStatus == "")
				$rowStatus = 0;

			if ($pageCount == "")
				$pageCount = 5;

			$qSelect = "SELECT * FROM news ORDER BY ID DESC LIMIT $rowStatus, $pageCount;";
			$qCount = "SELECT * FROM news;";

			$dbCount = mysql_query($qCount);
			$total = mysql_num_rows($dbCount);

			$dbSelect = mysql_query($qSelect);

			while($row = mysql_fetch_array($dbSelect))
			{
				$textRow 	= $row[2];
				$sizeRow 	= mysql_fetch_lengths($dbSelect);
				$category 	= getData("category", $row[3]);

				$qComment = "SELECT * FROM comment WHERE PostID ='$row[0]' AND Parent='post' AND Green='0';";
				$dbComment = mysql_query($qComment);

				$countComment = mysql_num_rows($dbComment);
                
                                                                $qSelectName = "SELECT * FROM members WHERE ID='$row[6]';";
                                                                $dbSelectName = mysql_query($qSelectName);
	
                                                                $rowName = mysql_fetch_array($dbSelectName);
?>
				<h2><? echo "$row[1]"; ?> </h2>
				<hr>
				<p>
<? 					if($sizeRow[2] >= 375)
					{
						for ($i = 0; $i <= 375; $i++)
						{
							echo "$textRow[$i]";						}
						echo "...";
					}
					else
					{
						echo "$textRow";
					}
?>
					<a class="text" href="listComment.php?postID=<?php echo "$row[0]"; ?>"><br>Meer...</a>
				</p>
				<hr>
				<h3>
					<b>Naam: </b><? echo "$rowName[4] $rowName[5]"; ?> |
					<b>Rubriek: </b><? echo "$category"; ?> |
					<b>Datum: </b><? echo "$row[4]"; ?>	|
					<b>Reacties: </b><? echo "$countComment"; ?>
				</h3>

				<br><br>
<?
				$rowC++;
			}

			if( $pageCount != $total)
			{
				$next = $rowStatus + $pageCount;
				$prev = $rowStatus - $pageCount;

				$limit = $total / $pageCount;
				$limitNew = round($limit);

				if ($limitNew > $limit)
				{
					$last = $limitNew - 1;
				}
				else
				{
					$last = $limitNew;
				}

				$last *= $pageCount;

				if ($prev < 0)
				{
					$prev = 0;
				}

				if ($next > $total)
				{
					$next = $last;
					$buffer = $rows;
				}
			}
?>
			<div id="pagePan">
				<h1>
					[
					<a href="index.php?rowStatus=0">begin</a> |
					<a href="index.php?rowStatus=<?php echo "$prev"; ?>">vorige</a> |
					<a href="index.php?rowStatus=<?php echo "$next"; ?>">volgende</a> |
					<a href="index.php?rowStatus=<?php echo "$last"; ?>">eind</a>
					]

					<br><? echo "$rowStatus - "; echo $rowStatus + $rowC; echo " ($total)"; ?>
				</h1>
			</div>
		</div>

		<div id="postEnd"></div>
	</div>
</div>

<br><br>
</body>

<?
	include("./Library/closedb.php");
?>
 
Dan klopt wat jij gebruikt sowieso niet.

In $textRow zit namelijk een string, geen array. En hij kijkt nu wel naar het aantal tekens, niet zoals je zei naar het aantal woorden. Maargoed. Als je 375 tekens wilt weergeven is het heel gemakkelijk:

In plaats van:

PHP:
                        for ($i = 0; $i <= 375; $i++)
                        {
                            echo "$textRow[$i]";                        }

(let een beetje op je indenting)

neem je dan (zoals T-J zei):

PHP:
echo substr ( $textRow, 0, 375 ), '...';

Dan heb je inderdaad kans dat je een half woord hebt, omdat tegen te gaan zullen we iets moeten uitbreiden:

PHP:
$length = 0;
$aWords = explode ( ' ', $textRow );

foreach ( $aWords as $sWord ) {

  $length += strlen ( $sWord );

  if ( $length <= 375 ) {

    echo $sWord, ' ';

  }

}

echo '...';

Wil je echt 375 woorden weergeven, dan kun je dit gebruiken:

PHP:
$aWords = explode ( ' ', $textRow );

$l = ( count ( $aWords ) > 375 ) ? 375 : count ( $aWords );

for ( $i = 0; $i < $l; $i++ ) {

  echo $aWords[ $i ], ' ';

}

echo '...';
 
Ik ben voor de laatste optie gegaan, ik heb de teller naar 50 teruggebracht omdat de meeste nieuwsberichten niet meer dan 100 woorden bevatten, maar het werkt nu voor het eerst zoals ik het eigenlijk bedoeld had! Heel erg bedankt allemaal, de hulp die hier wordt aangeboden is super :thumb:
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan