Archief - PHP: scriptoptimalisatie gevraagd

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Le Preinz

Legacy Member
Aangezien ik nu alles wat ik weet van php en mysql zo maar een chaotisch samenraapsel is van manuals, scriptjes, tutorials,.... vrees ik dat ik niet echt efficiënt mijn scripts opbouw. Ik pruts meestal tot het plots werkt.

Daarom, wat kan er allemaal beter aan volgende stukje reeds werkende code van bijvoorbeeld mijn nieuwspagina:

PHP:
											// de laatste 20 berichten zelf

$sql="SELECT * FROM nieuws ORDER BY numba DESC;";
$result=mysql_db_query($database,$sql,$db);


$i="0";

for ($x = 0; $x <=20; $x++)
	{
	if ( $row=mysql_fetch_array($result)) 
		{
				
			echo "<a name=\"$row[numba]\"></a><h4>$row[titel] </h4>";
			echo "<br><a href=\"#top\">[top]</a><br><br>";

			$bericht = str_replace($in, $uit, nl2br($row["bericht"]));

			echo ($bericht."<BR><BR>");
																	// reacties voor elk bericht ophalen
			echo "<a href=\"index.php?p=artikels/reacties&nr=".$row["numba"]."&id=0\">schrijf/ lees reacties";			
																	
					$db=mysql_connect($host,$username,$password);
				/query = mysql_query("SELECT * FROM nieuws_reac WHERE numba_in='$row[numba]'");
				$aantal = mysql_num_rows($query); 				
				echo " (".$aantal.")</a>";

			echo "<br><div align=\"right\">";
			echo "<h4>$row[poster] <br>$row[datum]</h4>";
			echo "</div>";
			echo "<HR SIZE=\"1\">";
			$i=$row["numba"];
			
		}
	}

for ($j = $i; $j >= 0 ; $j--)
{

	$nummer = $j-1;
	mysql_query("DELETE FROM nieuws WHERE numba = '$nummer'");
}
mysql_close();

EdMeister

Legacy Member
Rare code, man! ;)

Enkele opmerkingen:
- Gebruik 1 keer mysql_connect bij 't begin van uw pagina en mysql_close op 't einde (optioneel). Tussendoor nog eens connecten heeft geen zin.
- Als je bijvoorbeeld x aantal records wil laten weergeven, laat dat werk dan doen door je databank. Maak dus gebruik van 'LIMIT' in je sql-query. Bijvoorbeeld "Select kolom_x from tabel_y where blabla = boemboem LIMIT 20". 't Is dus zinloos om met je query eerst een ganse kolom te gaan inlezen en er dan met een for-lus maar de eerste 20 records van te gaan weergeven.
- Om de resultaten van je query weer te geven, wordt traditioneel meer gebruik gemaakt van een while-lus. Bijv. while($data = mysql_fetch_array($query)) { echo $data['kolomnaam']; }
- Wat is het nut van die Delete-query? :s

Le Preinz

Legacy Member
ah zulke tips zijn dus echt handig :)

die delete lus is om alle oudere (dus niet de laatste 20) te deleten. Ook niet dé manier wss :)

Dark_vagabond

Legacy Member
echo "<h4>$row[poster] <br>$row[datum]</h4>";
voor variabelen weer te geven naast gewone tekst doe je best het volgend:
echo "<h4>".$row[poster]." <br>".$row[datum]."</h4>";
(dit doe je soms)

en ' gebruiken bij array's, dus:
echo "<h4>".$row['poster']." <br>".$row['datum']."</h4>";

ook best /" vermijden en ' gebruiken:
echo "<br><div align='right'>";

en nog beter in deze gevallen is de php-code afsluiten, gegevens weergeven en weer openen:
?>
<br><div align='right'>
<?php

[Scratch]

Legacy Member
Misschiens is het ook best als je alles in 1 query doet dmv een table join, nu spreek je de database 21 keer aan voor 1 pagina. Dat is ook niet echt performance gericht. En het is ook altijd beter om niet "SELECT * FROM ..." te doen maar enkel de rows te fetchen die je nodig hebt.

Je kan misschiens iets proberen in de stijl van:

PHP:
 $sql="
SELECT 
	n.numba, 
	n.titel, 
	n.bericht, 
	n.poster, 
	n.datum, 
	nr.numba_in, 
	nr.nieuws_reac
FROM 
	nieuws n
	nieuws_reac nr
WHERE 
	n.numba = nr.numba_in 
ORDER BY 
	n.numba 
	DESC
;";

Dark_vagabond

Legacy Member
[Scratch] zei:
PHP:
 $sql="
SELECT 
	n.numba, 
	n.titel, 
	n.bericht, 
	n.poster, 
	n.datum, 
	nr.numba_in, 
	nr.nieuws_reac
FROM 
	nieuws AS n
	nieuws_reac AS nr
WHERE 
	n.numba = nr.numba_in 
ORDER BY 
	n.numba 
	DESC
;";

AS niet vergeten hier
en wat uitleg ^^
hier zeg je dat nieuws de naam n krijgt en nieuws_reac de naam nr
vervolgens selecteer je numba uit de tabel n(ieuws) enzovoorts

[Scratch]

Legacy Member
"AS" hoeft niet als je een alias gebruik voor een table name, dat hoeft enkel bij column names :)

En volgende de phpcode die in de eerste post staat wordt numba uit $row gehaald en $row komt van de select uit de nieuws tabel, dus staat numba toch in de nieuws table??

Dark_vagabond

Legacy Member
[Scratch] zei:
"AS" hoeft niet als je een alias gebruik voor een table name, dat hoeft enkel bij column names :)

zo doe ik het en dat werkt ^^

[Scratch] zei:
En volgende de phpcode die in de eerste post staat wordt numba uit $row gehaald en $row komt van de select uit de nieuws tabel, dus staat numba toch in de nieuws table??

daar heb ik toch niets over gezegd???
ik heb de join gewoon uitgelegd

Le Preinz

Legacy Member
[Scratch] zei:
Misschiens is het ook best als je alles in 1 query doet dmv een table join, nu spreek je de database 21 keer aan voor 1 pagina. Dat is ook niet echt performance gericht. En het is ook altijd beter om niet "SELECT * FROM ..." te doen maar enkel de rows te fetchen die je nodig hebt.

Je kan misschiens iets proberen in de stijl van:

PHP:
 $sql="
SELECT 
	n.numba, 
	n.titel, 
	n.bericht, 
	n.poster, 
	n.datum, 
	nr.numba_in, 
	nr.nieuws_reac
FROM 
	nieuws n
	nieuws_reac nr
WHERE 
	n.numba = nr.numba_in 
ORDER BY 
	n.numba 
	DESC
;";

Ik ben dus bezig mijn pagina wat aan te passen met jullie nuttige tips :)
Maar ik snap toch niet tenvolle deze query. Ik krijg bv al niet de titel van mijn nieuwsbericht ge-echood.

Le Preinz

Legacy Member
Dark_vagabond zei:
zo doe ik het en dat werkt ^^



daar heb ik toch niets over gezegd???
ik heb de join gewoon uitgelegd

elke table heeft die numba, is een unieke nummer voor elke rij.
Maar ik heb idd de numba nodig van de nieuws table.

Dark_vagabond

Legacy Member
Le Preinz zei:
Ik ben dus bezig mijn pagina wat aan te passen met jullie nuttige tips :)
Maar ik snap toch niet tenvolle deze query. Ik krijg bv al niet de titel van mijn nieuwsbericht ge-echood.

doe is AS erbij

en ge hebt toch mysql_fetch_array($sql); gebruikt he :crazy:

Le Preinz

Legacy Member
nog steeds errors: voor een vb: http://www.chiro-wijnegem.be/index.php?p=artikels/nieuws2

ik heb enkel in jullie opgegeven code een , gezet achter nieuws n,

PHP:
 $sql=" 
SELECT 
    n.numba, 
    n.titel, 
    n.bericht, 
    n.poster, 
    n.datum, 
    nr.numba_in, 
    nr.nieuws_reac 
FROM 
    nieuws AS n, 
    nieuws_reac AS nr 
WHERE 
    n.numba = nr.numba_in 
ORDER BY 
    n.numba 
    DESC 
;"; 

$result=mysql_db_query($database,$sql,$db);

$i="0";

for ($x = 0; $x <=20; $x++)
	{
	if ( $row=mysql_fetch_array($sql)) 
		{
				
			echo "<a name='>".$row[numba]."'></a><h4>".$row[titel]."</h4>";
			echo "<br><a href='#top'>[top]</a><br><br>";

			$bericht = str_replace($in, $uit, nl2br($row['bericht']));

			echo ($bericht."<br><br>");
																	// reacties voor elk bericht ophalen
			echo "<a href='index.php?p=artikels/reacties&nr='".$row['numba']."&id=0'>schrijf/ lees reacties";			
			$query = mysql_query("SELECT * FROM nieuws_reac WHERE numba_in='$row[numba]'");
			echo mysql_num_rows($query); 				
			echo "</a>";

			echo "<br><div align='right'>";
			echo "<h4>".$row['poster']."<br>".$row['datum']."</h4>";
			echo "</div>";
			echo "<hr size='1'>";
			$i=$row['numba'];
			
		}
	}

DarkBone

Legacy Member
$row=mysql_fetch_array($sql)

moet worden

$row=mysql_fetch_array($result)

kopke erbij houden hé

en trouwens, waarom doet ge een for-lus van 20 keer ?

gebruik een LIMIT 20 in uw query en doe dan gewoon:

while ($row=mysql_fetch_array($result))
{
// afbeelden
}

Le Preinz

Legacy Member
$row=mysql_fetch_array($result)
kopke erbij houden hé

Dat stond er eerst maar in psot #12 hier werd gezegd dat ik dat moest doen.
en waarom die for lus, omdat ik toen het bestaan nog niet wist van die LIMIT 20

Zal dat al even aanpassen maar vrees dat het nog niet zal werken

edit:
PHP:
<?php 
	include("setup.php"); 
	include("emo/emoswitch.php");
	$db=mysql_connect($host,$username,$password);


										// de laatste 20 berichten zelf
 $sql="SELECT  n.numba, n.titel,  n.bericht, n.poster, n.datum, nr.numba_in, nr.nieuws_reac FROM nieuws AS n nieuws_reac AS nr WHERE n.numba = 100 ORDER BY n.numba DESC LIMIT 20"; 

$result=mysql_db_query($database,$sql,$db);


while ( $row=mysql_fetch_array($result)) 
		{
				
			echo "<a name='>".$row[numba]."'></a><h4>".$row[titel]."</h4>";
			echo "<br><a href='#top'>[top]</a><br><br>";

			$bericht = str_replace($in, $uit, nl2br($row['bericht']));

			echo ($bericht."<br><br>");
																	// reacties voor elk bericht ophalen
			echo "<a href='index.php?p=artikels/reacties&nr='".$row['numba']."&id=0'>schrijf/ lees reacties";			
			$query = mysql_query("SELECT * FROM nieuws_reac WHERE numba_in='$row[numba]'");
			echo mysql_num_rows($query); 				
			echo "</a>";

			echo "<br><div align='right'>";
			echo "<h4>".$row['poster']."<br>".$row['datum']."</h4>";
			echo "</div>";
			echo "<hr size='1'>";
			$i=$row['numba'];
		}
	


mysql_close();

?>

werkt nog steeds niet, in de bepaling van die $sql denk ik. want die while ( $row=mysql_fetch_array($result)) wilt hij niet aanpakken.

EdMeister

Legacy Member
Zet eens het volgende achter uw sql-query:
PHP:
$result=mysql_db_query($database,$sql,$db) or die(mysql_error());
Dan zie je direct waar de fout zit in je query.

En btw, nu ik eens vluchtig naar uw query kijk:
Moet "FROM nieuws AS n nieuws_reac AS nr" niet "FROM nieuws n, nieuws_reac nr" zijn?

Le Preinz

Legacy Member
Hier zat de fout:
nr.nieuws_reac

table.table is nogal stom. Dus heb ik het veranderd in nr.numba (elke table heeft die numba rij bij mij)

Maar de query zoals hij nu opgebouwd geeft wel een resultaat maar niet het resultaat dat ik wens.

Van de ene table nieuws zou ik van de laatste 20 rijen de velden titel, bericht, poster, datum en numba opvragen.

En dan voor elke bericht van nieuws het aantal rijen opvragen waarin het veld numba_in van table nieuws_reac gelijk is aan de numba van het bericht uit nieuws.

merci al voor de hulp

zero2one

Legacy Member
en waarom die for lus, omdat ik toen het bestaan nog niet wist van die LIMIT 20
Dit is basiskenis SQL, ik raad u aan om ergens een basiscursus SQL op de kop te tikken, dat zal u al veel kopzorgen besparen. Ik vermoed dan ook dat uw database layout ook niet echt geoptimaliseerd zal zijn. Weet dat de eerste stap om een scrip vlot te laten werken een snelle en goed geïndexeerde databaselayout + zo weinig mogelijk query's vraagt !!

draai uw query eens in phpmyadmin dan krijgt ge direct wat extra info waar ongeveer uw query fout zit.

ik vermoed dat er ergens een kolomnaam verkeerd staat of zo

Gebruik voor de LIMIT de juistere syntax: LIMIT 0,20 (start op 0 en toon 20 records) ik weet het de 2 werken maar dit is duidelijker

en leer werken met INNER JOIN:

PHP:
SELECT
    n.numba,
    n.titel,
    n.bericht,
    n.poster,
    n.datum,
    nr.numba_in,
    nr.nieuws_reac

FROM
    nieuws n
    INNER JOIN nieuws_reac nr ON (n.numba = nr.numba_in)
    
ORDER BY
    n.numba DESC

LIMIT 0,20

DarkBone

Legacy Member
Enneuh, eigenlijk is LEFT JOIN toch beter geschikt, want nu worden de nieuwsberichten die geen commentaar hebben niet afgebeeld.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan