ugrás a tartalomhoz

Új komment megjelenítése frissítés nélkül

geforce9600gt · 2013. Dec. 26. (Cs), 16.39
Sziasztok

Hozzászólok valamihez, és szeretném ha az új hozzászólás egyből megjelenne frissítés nélkül.
Ez most végülis meg is van, annyi gond van vele, hogy nem jó helyre rakja ki(legalulra most), és formázatlan. Mutatom hozzá a dolgokat. Köszönöm előre is a segítséget.

A form:
if(isset($_SESSION['user_logged_in']))
				{
					echo '<form id="kommentForm" method="post" action="'.$_SERVER['PHP_SELF'].'">';
					echo '<input type="hidden" value='.$dog_id.' id="dog_id" />';
					echo '<textarea name="dog_komment" id="dog_komment"></textarea>';
					echo '<input type="button" id="addKomment" value="Hozzászólok" />';
					echo '</form>';
				}
Ajax
$('#addKomment').click(function()
	{
		if($('#dog_komment').val() != "")
		{
			var kommentSzoveg = $('#dog_komment').val();
			var dog_id = $('#dog_id').val();
			$.ajax
			({ 
				type: 'POST',
				url: 'files/add_komment.php',
				data: { komment:kommentSzoveg, id:dog_id },
				cache: 'false',
				beforeSend: function()
				{
					$('#addKomment').val('Pillanat..').attr('disabled', 'disabled');
				},
				success: function(data)
				{
					$('#kommentForm')[0].reset();
					$('#addKomment').val('Hozzászólok').removeAttr('disabled');
					$('#dog_komment').css('height', 40+px);
					$('.komment_box').append(data);
					$('.komment:last').fadeIn('slow');
				},
				error: function(e)
				{
					alert(e);
				}
			});
			return false;
		}
	});
És a feldolgozó php, ami kirakja az újat is
<?php
session_start();
include_once("connect.php");
$hiba = "";
$komment = mysqli_real_escape_string($kapcs, $_POST['komment']);
$id = intval($_POST['id']);
$ido = date("Y-m-d-H:i");
$user_nev = $_SESSION['user_logged_in']['vezeteknev'].' '.$_SESSION['user_logged_in']['keresztnev'];
if(empty($komment))
{
	$hiba = "Nem írt semmit a hozzászólás mezőbe.";
}
if(strlen($komment) > 5000 )
{
	$hiba = "A hozzászólása maximum 5000 karakter legyen.";	 
}
if($hiba == "")
{
	$addKomment = mysqli_query($kapcs, "INSERT INTO dog_komment(user,kutya,hozzaszolas,mikor,user_nev) 
	VALUES('".$_SESSION['user_logged_in']['id']."','".$id."','".$komment."','".$ido."', '".$user_nev."')") or die(mysqli_error($kapcs));	
	$last_id = mysqli_insert_id($kapcs);


	echo '<div class="komment" id="komment_box_'.$last_id.'">';
	if($_SESSION['user_logged_in']['thumb'] != "")
	{
		echo '<a href="profil?user='.$_SESSION['user_logged_in']['id'].'" title="">';
		echo '<img class="no_image" src="images/user/'.$_SESSION['user_logged_in']['thumb'].'" width="40" height="40" alt="" />';
		echo '</a>';
	}
	else
	{
		echo '<a href="profil?user='.$_SESSION['user_logged_in']['id'].'" title="">';
		echo '<img class="no_image" src="images/no_image.gif" width="40" height="40" alt="" />';
		echo '</a>';
	}
	echo '<h4 class="comment_user"><a href="profil?user='.$_SESSION['user_logged_in']['id'].'" 
	title="">'.$user_nev.'</a></h4>';
	echo '<h6 class="comment_date">'.$ido.'</h6>';
	if(isset($_SESSION['user_logged_in']))
	{
		echo '
		<ul class="options_div">
			<li><a href="#" class="btn"><img src="images/options.png" witdh="25" height="17" /></a>
				<ul>
					<li><a href="#">Hozzászólás szerkesztése</a></li>
					<li><a href="#">Még valami lesz itt</a></li>
					<li><a class="delete_komment" id="'.$last_id.'" href="#">Hozzászólás törlése</a></li>
				</ul>
			</li>
		</ul>
		';
	}
	include_once("smiley.php");
	echo '<p>'.smiley(nl2br($komment)).'</p>';
echo '</div>';
}
?>
Ami az utolsó kommentet kirakja, az abban az if-ben van ami ellenőrzi, hogy sikerült e az insert.
 
1

append

Poetro · 2013. Dec. 26. (Cs), 20.05
$('.komment_box').append(data);  
miatt rakja a végére. Az append helyett használj valamilyen más függvényt. Hogy miért formázatlan, azt nem tudom, valószínűleg nem megfelelő adat van a data változóban.
Legegyszerűbb a böngésződ fejlesztői eszközében megnézni, hogy hogyan néz ki a HTML struktúrád a beszúrás után, majd ennek ismeretében javítod a beszúrást.
2

A formázás gond is csak addig

geforce9600gt · 2013. Dec. 26. (Cs), 21.58
A formázás gond is csak addig van amég nem frissítem az oldalt.
3

Kivettem az appendet, akkor

geforce9600gt · 2013. Dec. 26. (Cs), 22.06
Kivettem az appendet, akkor ki se rakta az uj kommentet.

A divben amiben van az egész komment, és annak adatai hogy ki írta, mikor és az író profilképe, azok formázva jelennek meg ahogy kell..

Viszont egy komment divben van mégegy div, abban pedig linkek, na ez nem kap css-t, pedsig a class-t megkapja megnéztem.
4

Az mitől lehet, hogy csak

geforce9600gt · 2013. Dec. 26. (Cs), 22.42
Az mitől lehet, hogy csak annál a hírnél rakja ki magától az új kommentet, amelyiknél már van komment? Amelyiknél nincs még 1 se, csak frissítés után jön ki az új amit írtam.
5

Figyelj jobban

Pepita · 2013. Dec. 26. (Cs), 22.48
Poetro:
Az append helyett használj valamilyen más függvényt.

Te:
Kivettem az appendet, akkor ki se rakta az uj kommentet.
Vagyis nem használtál helyette semmit...
Viszont egy komment divben van mégegy div, abban pedig linkek
Akkor lehet, hogy az append-ed is rossz helyre ad hozzá.

Nézd át jobban a jQuery doksiját, sok más út is van a DOM manipulálására vagy HTML tartalom beszúrására. A divek körül nézz szét, hogy miért oda kerül, ahova, az append mindig a meglévő HTML végéhez fűz hozzá, ezért írta Poetro, hogy mást használj. Pl. ha van fórumtéma is (mint itt), akkor lehet ahhoz képest insertAfter(target) vagy az első kommenttel insertBefore(target).

Gondolom az egész oldalt egy másik szkripted teszi ki, ezért jelenik meg ott jól, itt meg vagy nem ugyanazt a HTML-t gyártod le belőle, vagy rossz helyre "appendálsz".
6

Ezzel már előre rakja ki, a

geforce9600gt · 2013. Dec. 26. (Cs), 22.53
Ezzel már előre rakja ki, a formázást is megoldottam.
$('.komment_box:eq(0)').before(data);

Csak az az érdekes, ha egy olyan hírhez szólok hozzá, aminél még nincsenek hozzászólások, oda nem rakja ki az új kommentet, csak oldalfrissítés után.

Aminél pedig már van komment, oda kirakja egyből.
7

Lehet a before miatt? Csak

geforce9600gt · 2013. Dec. 26. (Cs), 22.54
Lehet a before miatt? Csak akkor meg mi mással rakjam be elsőnek az újat?
8

Meg lesz az

Pepita · 2013. Dec. 26. (Cs), 23.19
Légyszíves formázottan írj kódot, nézd meg hogy kell soron belül.

Igen, az a baj, hogy nincs olyan elemed 0 kommentnél, hogy $('.komment_box:eq(0)').
Így látatlanban annyi hackelést tudok javasolni, hogy az oldal kirakásánál nézd meg, ha 0 kommented van, akkor is tegyél ki egy üres div-et:
<div class="komment_box"></div>
Remélem nincs olyan CSS rajta, amitől üresen is látható mérete lesz. Ha mégis, akkor adj neki még egy osztályt, ami eltünteti.
9

Így most valamemnnyire oké,

geforce9600gt · 2013. Dec. 27. (P), 00.35
Így most valamemnnyire oké, kiraktam egy komment_box divet akkor is ha nincs 1 komment sem, mert ugye 1 ilyen divnek kell lennie mindenképp.

1 - Elküldöm a kommentet, megjelenik egyből.

2- A második komment ugyan ide, az is megjelenik egyből, de nem elsőnek rakja ki, hanem másodiknak csak.

Ezek a hibák csak ugye ott vannak amelyik hírnél még nem volt írva 1 hozzászólás sem.

A jquery még mindig ennyi:
success: function(data)
				{
					$('#kommentForm')[0].reset();
					$('#addKomment').val('Hozzászólok').removeAttr('disabled');
					$('#dog_komment').css('height', 40+px);
					$('.komment_box:eq(0)').before(data);
					$('.options_div').dropit();
				},
10

prepend()

pkadam · 2013. Dec. 27. (P), 09.35
Nem kell üres .komment_box, inkább a kommentek szülőeleméhez add hozzá a prepend() függvénnyel az új hozzászólást. Az append()-del ellentétben ez mindig a tartalom elejére illeszti az újat.
11

Tökéletes, köszönöm szépen.

geforce9600gt · 2013. Dec. 27. (P), 11.09
Tökéletes, köszönöm szépen.
12

ott a pont

Pepita · 2013. Dec. 27. (P), 15.45
Teljesen igaz, ez a legjobb megoldás.
13

?

geforce9600gt · 2013. Dec. 28. (Szo), 22.12
?
14

Mi a kérdés?

Pepita · 2013. Dec. 30. (H), 00.32
nagyon utálom az ilyen egykarakteres kommentet.
15

Sziasztok Ismét nem működik

geforce9600gt · 2014. Jan. 10. (P), 22.51
Sziasztok

Ismét nem működik a komment progim, csak oldal frissítés után rakja ki a legutóbbi kommentet amit írtam. Mutatok pár kódot, valaki lenne szíves megnézni mi lehet a gond? Előre is köszöntöm!

Itt mentem el, és adom vissza az új kommentet:
if($hiba == "")
{
	$addKomment = mysqli_query($kapcs, "INSERT INTO dog_komment(user,kutya,hozzaszolas,mikor,user_nev) 
	VALUES('".$_SESSION['user_logged_in']['id']."','".$id."','".$komment."','".$ido."', '".$user_nev."')") or die(mysqli_error($kapcs));	
	$last_id = mysqli_insert_id($kapcs);

	// Új komment kirakása innentől
	echo '<div class="komment" id="komment_box_'.$last_id.'">';
	if($_SESSION['user_logged_in']['thumb'] != "")
	{
		echo '<a href="profil?user='.$_SESSION['user_logged_in']['id'].'" title="">';
		echo '<img class="no_image" src="images/user/'.$_SESSION['user_logged_in']['thumb'].'" width="40" height="40" alt="" />';
		echo '</a>';
	}
	else
	{
		echo '<a href="profil?user='.$_SESSION['user_logged_in']['id'].'" title="">';
		echo '<img class="no_image" src="images/no_image.gif" width="40" height="40" alt="" />';
		echo '</a>';
	}
	echo '<h4 class="comment_user"><a href="profil?user='.$_SESSION['user_logged_in']['id'].'" 
	title="">'.$user_nev.'</a></h4>';
	echo '<h6 class="comment_date">'.$ido.'</h6>';
	if(isset($_SESSION['user_logged_in']))
	{
		echo '
		<ul class="options_div">
			<li><a href="#" class="btn"><img src="images/options.png" witdh="25" height="17" /></a>
				<ul>
					<li><a href="#">Hozzászólás szerkesztése</a></li>
					<li><a href="#">Még valami lesz itt</a></li>
					<li><a class="delete_komment" id="'.$last_id.'" href="#">Hozzászólás törlése</a></li>
				</ul>
			</li>
		</ul>
		';
	}
	include_once("smiley.php");
	echo '<p>'.smiley(nl2br($komment)).'</p>';
echo '</div>';
}
Ez pedig az Ajax-os küldő:
$('#addKomment').click(function()
	{
		if($('#dog_komment').val() != "")
		{
			var kommentSzoveg = $('#dog_komment').val();
			var dog_id = $('#dog_id').val();
			$.ajax
			({ 
				type: 'POST',
				url: 'files/add_komment.php',
				data: { komment:kommentSzoveg, id:dog_id },
				cache: 'false',
				beforeSend: function()
				{
					$('#addKomment').val('Pillanat..').attr('disabled', 'disabled');
				},
				success: function(data)
				{
					$('#kommentForm')[0].reset();
					$('#addKomment').val('Hozzászólok').removeAttr('disabled');
					$('#dog_komment').css('height', 40+px);
					$('.komment_box').prepend(data);
					$('.options_div').dropit();
				},
				error: function(e)
				{
					alert(e);
				}
			});
			return false;
		}
	});
16

Hiba?

Poetro · 2014. Jan. 11. (Szo), 15.28
És milyen hibát kapsz a böngészőben vagy a PHP oldalon?

Különben mi a px változó értéke?
17

Px változó?? Amugy semmilyen

geforce9600gt · 2014. Jan. 12. (V), 21.29
Px változó??

Amugy semmilyen hibát nem ad, annyi van hogy egyből nem rakja ki a kommentet, csak oldalfrissítés után.
18

Px

Poetro · 2014. Jan. 13. (H), 09.29
Px változó??
$('#dog_komment').css('height', 40+px);
19

Ja igen, azzal a textarea

geforce9600gt · 2014. Jan. 14. (K), 12.07
Ja igen, azzal a textarea magasságát állítom amikor bele kattint.
$(document).ready(function(e) 
{
	var px = 'px';
	$('#dog_komment').click(function()
	{
		$('#dog_komment').animate({
			height: 150+px
		}, 100);
	});
    $('#addKomment').click(function()
	{
		if($('#dog_komment').val() != "")
		{
			var kommentSzoveg = $('#dog_komment').val();
			var dog_id = $('#dog_id').val();
			$.ajax
			({ 
				type: 'POST',
				url: 'files/add_komment.php',
				data: { komment:kommentSzoveg, id:dog_id },
				cache: 'false',
				beforeSend: function()
				{
					$('#addKomment').val('Pillanat..').attr('disabled', 'disabled');
				},
				success: function(data)
				{
					$('#kommentForm')[0].reset();
					$('#addKomment').val('Hozzászólok').removeAttr('disabled');
					$('#dog_komment').css('height', 40+px);
					$('.komment_box').prepend(data);
					$('.options_div').dropit();
				},
				error: function(e)
				{
					alert(e);
				}
			});
			return false;
		}
	});
	$('.delete_komment').click(function(e)
	{
		e.preventDefault();
		var kommentID = $(this).attr('id');
		if(kommentID != "")
		{
			if(confirm("Biztos, hogy törölni szeretné a hozzászólását?"))
			{
				$.ajax
				({
					url: 'files/delete_comment.php',
					data: { komment_id:kommentID },	
					cache: false,
					type: 'POST',
					success: function(data)
					{
						$('#komment_box_'+kommentID).fadeOut('slow', function()
						{
  							$(this).remove();
						});
					}
				});
			}
		}
	});
});
20

De miért nem javítod ki

Pepita · 2014. Jan. 14. (K), 19.38
40+'px'-re?!
21

Definiálta a px változót és a

bamegakapa · 2014. Jan. 14. (K), 20.45
Definiálta a px változót és a megfelelõ érték van benne.
42

Igen, azt elnéztem,

Pepita · 2014. Jan. 16. (Cs), 12.25
az első kódrészletben még nincs, azért is kérdezte Poetro is. A másodikat nem elég figyelmesen bogarásztam, de ezért egy változót deklarálni...
22

Léha

Hidvégi Gábor · 2014. Jan. 14. (K), 20.58
Lehet, hogy nincs kedve annyit gépelni.
23

JQuery

complex857 · 2014. Jan. 15. (Sze), 07.42
Ez esetben elég volna simán lehagyni, a JQuery css() sima számokból magától is "px"-et csinál (ahogy aritmetika is megy, mint pl.: "+=15") :P.
24

De nem hiszem, hogy a px

geforce9600gt · 2014. Jan. 15. (Sze), 10.06
De nem hiszem, hogy a px változó miatt nem működik a progi, hogy frissítés nélkül nem rakja ki az új kommentet.
25

Ellenőrizd a böngésződ

bamegakapa · 2014. Jan. 15. (Sze), 11.06
Ellenőrizd a böngésződ fejlesztői eszközének Network tabjában, hogy amikor elmegy az Ajax kérésed, mi jön vissza a szervertől. Ellenőrizd a success callbackben a data értékét, és hogy létezik-e a .komment_box elem.

A Javascript részben így hirtelen annyit látok, hogy a $.ajax hívásban a cache paraméter string ('false'), pedig boolean-nak kéne lennie (false). Ez hiba.

A másik, hogy a disabled állításánál a prop függvényt kéne használni az attr helyett. Itt ugyanis igazából nem az attribútumot akarod állítani, hanem az idevágó DOM elem tulajdonságát. Az attribútum csak a kezdőállapotot hivatott meghatározni. Javaslom a dokumentáció tanulmányozását.
26

Hát bonyolult ez, nem értem

geforce9600gt · 2014. Jan. 15. (Sze), 11.29
Hát bonyolult ez, nem értem már. Firefoxban néztem a konzolt, hibát csak a px-es dologra adott, de azt a részt kommenteltem a scriptben, a válasz fülön pedig ott volt az új komment a divekben meg mindenben amibe beleraktam, tehát eddig jó.

Na most, ha az adott hírnél még nincs 1 komment sem, és ha írok hozzá, akkor nem jelenik meg, csak frissítés után.

Ha olyanhoz írok, aminél már van komment, akkor annál egyből megjelenik jól az új komment.

Valami ötlet? Milyen kódot, vagy részt másoljak be?

js és javítottam a PROP-os dolgot amit írtál.
$('#addKomment').val('Pillanat..').prop('disabled', true);
27

Létezik?

Poetro · 2014. Jan. 15. (Sze), 11.54
Ugye a hozzászólást a következő szúrja be:
$('.komment_box').prepend(data);
De létezik az oldalon a .komment_box akkor is, amikor még nincs hozzászólás?
28

Ahogy Poetro is írja, és én

bamegakapa · 2014. Jan. 15. (Sze), 12.41
Ahogy Poetro is írja, és én is írtam, ellenőrizned kéne, hogy amikor nincs még egy komment sem, akkor létezik-e .komment_box elem egyáltalán, mert a tünetek alapján arra van alapos gyanú, hogy nem.

Az ellenőrzést végezheted a DOM inspectorban kézzel vagy a konzolban DOM hívásokkal (komment hozzáadás előtt), vagy akár a kódodba is illeszthetsz egy loggolást a megfelelő helyre, ami a konzolra írja majd az eredményt (célszerű a prependes sor elé, utána meg írj egy kommentet):
console.log('Talált kommentdobozok: ' + $('.komment_box').length);
$('.komment_box').prepend(data);
Ha 0-t ír ki, akkor ugye nem létezik. Persze jó pár más mód is van erre, egyszerűbbeket igyekeztem most mutatni.
29

Van komment_box divem akkor

geforce9600gt · 2014. Jan. 15. (Sze), 13.08
Van komment_box divem akkor is ha nincs még komment a hírnél.

Ugye lekérem a hírt táblából, és ha van rá találat, már akkor kiíratok egy komment_box divet, pont ezért, hogy a prepend működjön.
30

Hát, látatlanban nehéz.

bamegakapa · 2014. Jan. 15. (Sze), 13.13
Hát, látatlanban nehéz. Használhatod a Debuggert (Firefoxban is van), azzal lépésenként tudod futtatni a Javascriptet és meg tudod nézni, melyik változó mikor milyen értéket vesz fel. Így bizonyosan el tudod kapni a grabancát a hibának. Olvass kicsit utána a debugger használatának, nem fogod megbánni.
31

Na mégsem, konzol: talált

geforce9600gt · 2014. Jan. 15. (Sze), 13.18
Na mégsem, konzol: talált kommentdobozok: 0

Kiírattam máshol, mostmár így jó, akkor a prepend miatt volt a gond.

Még annyit kérdeznék, hogy szerintetek ez milyen kommentelő progi? Gondolom lehetne rajta finomítani meg alakítani még, arra várnék ötleteket.

Meg akkor ezt használnám máshol is kommentelni.
32

Még annyit kérdeznék, hogy

Hidvégi Gábor · 2014. Jan. 15. (Sze), 13.27
Még annyit kérdeznék, hogy szerintetek ez milyen kommentelő progi?
Ez a progi tökéletes abból a szempontból, hogy minden hibát elkövettél, amit csak lehet, és kezdőknek lehetne mutogatni, hogy "na, így nem szabad dolgozni". Később, amikor lesz időm, kifejtem, miért.
33

Na akkor várom.

geforce9600gt · 2014. Jan. 15. (Sze), 13.54
Na akkor várom.
34

Hibák

Hidvégi Gábor · 2014. Jan. 15. (Sze), 17.54
Az általad bemásolt kódrészletekből az derül ki, hogy alapvető dolgokkal nem vagy tisztában, így, bár kissé megkésve, de a frissítés nélküli tartalombetöltés kéne az utolsó dolog legyen, aminek az eszedbe kéne jutnia. Ha azt szeretnéd, hogy a kódod hosszú távon karbantartható legyen, érdemes megfontolni a következőket:

1, Az adatbázist kezelő műveleteket tedd külön fájlba, ne hívd közvetlenül soha a kódból a függvényeket, mert ha a későbbiekben olyan váltás történik, mint például a mysql -> mysqli esetében, jóval egyszerűbb lesz átírni a kódot.

2, Nem célszerű keverni a programlogikát a megjelenítéssel, azaz szét kéne szedni a fájlt két részre:
a, a php fájl elején elvégzed az ellenőrzéseket, lekérdezéseket, összeállítod azokat az adattömböket, amit ki kell írni,
b, a php fájl végén van a html kód, és a kapott adattömböknek megfelelően írsz ki mindent.

Ekkor (adatbázis)hiba esetén nem fog a felhasználó egy üres képernyőt kapni, hanem szépen meg tudod jeleníteni neki a hibaüzenetet.

3, Kétszer dolgozol: először akkor, amikor az eredeti HTML oldalt összeállítod, ahol a kommentek vannak, másodszor pedig az ebben a fórumtémába beküldött kódban, azon belül is a javascriptben valósítod meg az űrlap beküldéséért felelős logikát.

a, Ha jól sejtem, a komment megjelenítéséért felelős HTML kódrészlet legalább két helyen van megírva, azaz később, ha módosítani kell, ennyivel több hibázási lehetőség van,
b, a komment beküldéséért felelős kódrészlet speciálisan van megírva, a megadott form elemből szedi össze a megadott mezőket. Ha átviszed ezt később egy másik projektbe, ahol mások az azonosítók, esetleg több van belőlük vagy kevesebb, a javascript kódot is módosítani kell.

Hogyan érdemes?
a, Ugyanazt a HTML kódrészletet mindig ugyanazzal a php kóddal szabad előállítani.
b, Kell találni/írni egy olyan JS függvényt, ami egy megadott formról összeszed minden űrlapelem-adatot, és elküldi a <form> method attribútumában található scriptnek (gyanítom, hogy a jQueryben van ilyen).

4, Hibás a programlogika abból a szempontból, hogy ha sikerült az adatbázisba elmenteni az épp beküldött kommentet, csak ennek az egy kommentnek küldi vissza a HTML kódját - viszont nem kezeli azt az esetet, ha közben már más is hozzászólt (például a mostanit egy óráig pötyögte az illető).

5, A jQuery függvényekkel láthatóan csak próbálkozol, de fogalmad sincs, hogy mit csinálnak (lásd append() az elején), arra való a dokumentáció, hogy olvassák el.

6, Érzésem szerint (javíts ki, ha tévedek) a kommentelés nem működik kikapcsolt javascripttel. Ha így van, semmi sem indokolja, hogy így legyen.
35

Köszi a részletes és normális

geforce9600gt · 2014. Jan. 15. (Sze), 19.05
Köszi a részletes és normális leírást. Tehát akkor mindent, amit ki kell iratni, azt állítsam össze az oldalon legelején, és ahol ki kell iratni, ott csak egy $valami válotozót irassak ki? Erre mutatok egy kódot mindjárt, hogy ilyenre gondoltál e. A menüm így van megcsinálva.
<?php
$menuDown = mysqli_query($kapcs, "SELECT * FROM menu WHERE status=1 ORDER BY id ASC");
if(mysqli_num_rows($menuDown) > 0 )
{
	$menu = '';
	$menu .= '<ul>';
	while($nav = mysqli_fetch_assoc($menuDown))
	{
		$menu .= '<li><a href="http://'.$_SERVER['HTTP_HOST'].'/'.$nav['seo'].'" title="'.$nav['szoveg'].'">'.$nav['szoveg'].'</a>';
		if($nav['dropdown'] == "1")
		{
			$dropdown = mysqli_query($kapcs, "SELECT * FROM almenu WHERE status=1 AND menu_id='".$nav['id']."'");
			if(mysqli_num_rows($dropdown) > 0 )
			{
				$menu .= '<ul>';
				while($almenuLink = mysqli_fetch_assoc($dropdown))
				{
				    $menu .= '<li><a href="http://'.$_SERVER['HTTP_HOST'].'/'.$almenuLink['seo'].'" title="'.$almenuLink['szoveg'].'">'.$almenuLink['szoveg'].'</a></li>';
				}
				$menu .= '</ul>';
			}
		}
		$menu .= '</li>';
	}
	$menu .= '</ul>';
}
?>
Majd az oldalon belül:
<div class="navigation_center dropdownMenu" id="dropdownMenu">
	<?php
	include_once("files/menu.php");
	echo $menu;
	?>
    </div>
A kikapcsolt javascript. Igenb az kell a kommenteléshez, de ma már mi működik JS nélkül?

Attól függetlenül, hogy működik a dolog, semmiképp ne maradjon ebben a formában? Javascript kódom se jó?
36

Igen, nagyjából így kéne

Hidvégi Gábor · 2014. Jan. 15. (Sze), 19.29
Igen, nagyjából így kéne megcsinálni, én például a következőképp oldanám meg:

1, a kimenő adatokat egy szép nagy tömbbe tenném, pl. $adatok
2, mint írtam a 34-es hozzászólás 1-es pontjában, külön függvényeket készítenék a lekérdezéseknek. Pl. a lekerdez($sql) függvény lefuttatná a paraméterül kapott lekérdezést, a választ pedig betenné egy tömbbe; ha hiba történt, akkor nem tömböt ad vissza, hanem hibakódot
3, a fájl tetején a menü összeállítása kb. így történne:
function adatok_lekerdezese() {
  $valasz = lekerdez("SELECT * FROM menu WHERE status=1 ORDER BY id ASC");
  //hiba esetén
  if (!is_array($valasz)) {
    return $valasz;
  }
  $adatok['menu'] = $valasz;
  $valasz = lekerdez("SELECT * FROM kommentek WHERE akármi");
  if (!is_array($valasz)) {
    return $valasz;
  }
  $adatok['kommentek'] = $valasz;
}


4, Aztán a végén a HTML-ben pedig ezt csinálhatod:
<ul id="menu">
<?php foreach ($adatok['menu'] as $menupont) { ?>
  <li><a href="<?php print $menupont['href']; ?>">="<?php print $menupont['felirat']; ?></a>
<?php } ?>
</ul>


Ez persze nagyon vázlatos megoldás.
37

Akkor az oké amit bemásoltam

geforce9600gt · 2014. Jan. 15. (Sze), 20.11
Akkor az oké amit bemásoltam az elöbb, a menü összeállítása és kiírása? Mert ha igen, akkor profiloldalt és egyebeket is ilyenkre kellene átírnom.
38

Az nem OK, mert továbbra is

bamegakapa · 2014. Jan. 16. (Cs), 10.32
Az nem OK, mert továbbra is egy helyen gányolsz az SQL-el és a HTML-el.

Amiket Gábor ír, remek tanácsok, és tulajdonképpen ezek az első lépések abba az irányba, hogy a spagettikód állapotából elinduljál a kódszervezés rögös, ám szükséges útján. Nem is az számít, hogy ezt függvényekkel vagy objektumokkal éred el, hanem az, hogy a kódod átlátható, olvasható, módosítható, fejleszthető legyen - akár mások, akár a jövőbeli önmagad számára.

Említed, hogy amit most írsz, többször fel akarod használni. Annyira ne tervezz hosszú távra vele, mert ahogy egyre többet tanulsz majd a kódszervezésről, folyamatosan újra akarod írni majd úgyis, mert rájössz a súlyos hiányosságaira.

Vesd bele magad a kódszervezés kitanulásába - sajnos ez az a pont, amikor az ember rájön, hogy a webfejlesztés jóval több, mint aminek az ember gondolta, amikor belekezdett (velem legalábbis így volt). Az egy dolog, hogy a CSS, Javascript, PHP, stb. lehetőségei, függvényei közül melyik pontosan mit csinál, arra ott a dokumentáció - a kérdés, hogyan építesz fel mindebből egy jó rendszert.
39

A kikapcsolt javascript.

bamegakapa · 2014. Jan. 16. (Cs), 10.55
A kikapcsolt javascript. Igenb az kell a kommenteléshez, de ma már mi működik JS nélkül?

Ha a Javascript nem feltétlenül szükséges valamihez, például olyan egyszerű esetekben, mint egy hozzászólás, akkor általában rossz döntés szükségessé tenni. A Javascriptre alapvetően úgy gondolj, mint egy plusz réteg, ami kényelmi funkciókat biztosít. Weboldalaknál mindenképpen, webalkalmazás az más kérdés, persze.

Attól függetlenül, hogy működik a dolog, semmiképp ne maradjon ebben a formában? Javascript kódom se jó?

Semmiképp, ha engem kérdezel. Azt felejtsd el, hogy valami "működik", mert ez az érv nem segít neked ebben a szakmában. Azt nézd, hogyan lehetne jobb. A Javascript kódod ugyanúgy spagetti.
40

De akkor a php-t olyanra mint

geforce9600gt · 2014. Jan. 16. (Cs), 11.51
De akkor a php-t olyanra mint amit bemásoltam menüt, igaz?
41

Az miben más? Olyanra, amit

bamegakapa · 2014. Jan. 16. (Cs), 12.02
Az miben más? Olyanra, amit Gábor mutatott.
43

Mér most akkor az sem jó? A

geforce9600gt · 2014. Jan. 16. (Cs), 12.37
Mér most akkor az sem jó? A menüm.
44

Leírtuk párszor, hogyan

Hidvégi Gábor · 2014. Jan. 16. (Cs), 12.41
Leírtuk párszor, hogyan lehetne jobb (a menü is, és úgy általában a kód). Nem bántani akarlak, de szerintem szövegértési problémával küzdesz, ami ebben a szakmában eléggé behatárolja a lehetőségeidet.
46

Nem jó

Pepita · 2014. Jan. 16. (Cs), 13.09
Még mindig egybe van hányva PHP, MySQL és HTML.
Olvasd végig figyelmesebben amiket írtunk. Teljesen nem csináljuk meg helyetted.
Megkérdezhetem, hány éves vagy?
47

Ismét kérdezem, mitől más a

bamegakapa · 2014. Jan. 16. (Cs), 13.11
Ismét kérdezem, mitől más a menüd? Ugyanúgy spagettikód, a HTML előállítása és az adatbázis hívások egy halomban. Olvasd végig újra, amiket írtunk, különös tekintettel Gábor példáira.

Vagy függvényekre, vagy objektumokra lesz szükséged. El kell szeparálnod a különböző feladatokat, és nem különböző spagettifájlokba, amiket aztán include-olsz. Egy függvény egy dolgot csináljon, ne egy helyen legyen az adatbázisművelet, a HTML előállítás, stb.
45

Ez igen!

Pepita · 2014. Jan. 16. (Cs), 13.03
Kezdők figyelem!
A 34-es hozzászólást mindenki szépen könyvjelzőzze, és ha elakad valamiben, először olvassa újra!
Nagyon jól összeszedted, gratula hozzá, csak 1-2 dolgot tennék hozzá.

2.a.b.: Én inkább 3 részre osztanám (MVC-szerűen, bár nem tudom, miért nem CMV-nek hívjuk, mert úgy jön sorban):
a. beérkező adatok és a jogosultságok ellenőrzése;
b. adatbázis-műveletek, válaszadatok előállítása (természetesen 1. szerint);
c. a b-től (vagy a-tól) kapott adatokkal a kimenet (HTML) előállítása.

Persze az a és b szorosan összefügg, mégis jobb, ha külön van. Ezzel együtt most még nem javasolnék keretrendszer-tanulást, jobb, ha párat kiszenvedsz 0-ról, akkor tanulod meg igazán.

3: Magyarul sablonozol.

4: Javaslat: először is csináld meg JS nélkül működőre, aztán ha még annyira Ajaxozni akarsz, akkor mindig az összes (ehhez a hírhez tartozó) kommentet kérd le és jelenítsd meg, vagy azt a limitet, amit JS nélkül is.

+7: Kezdj el tartalomtípusokban gondolkodni, a menü egy aránylag állandó tartalom, ezt külön állítod elő, esetleg cache-eled is, külön tartalomtípus a hír, megint más a komment, a felhasználó is egy, stb. Ezeket külön-külön kezeld, jól elkülönített (pl. más fájlok) programrészek foglalkozzanak velük, minden rétegszinten (1 és 2-es pont).
48

Nem is tudom, talán neki jót

bamegakapa · 2014. Jan. 16. (Cs), 13.17
Nem is tudom, talán neki jót tenne, ha most beletanulna egy jófajta frameworkbe. Jól emlékszem, nehéz belátni, mi a baj a spagettikóddal, ha egyszer "működik". Egy jól felépített framework tanulása ugyan talán fájdalmas lesz, de segíthet megismerni a kódszervezés praktikáit és fogalmait.
49

Ha képes magától

Pepita · 2014. Jan. 16. (Cs), 13.31
nem spagettit gyártani, akkor könnyedén beletanul bármelyik fw-be. Ha megfordítod a sort, akkor soha nem lesz jó programozó (szerintem), mindig csak a fw-re tud támaszkodni. És amint jön egy feladat, amit a fw magától nem tud, máris ott a spagetti megint. Én jobbnak tartom, hogy egyszer - akár csak egy mini próbaprojekten - "szűz és szép" PHP kódot írjon, utána forduljon keretrendszerek felé. Én is így tettem, sőt, ha "nagyon új kereket készülök feltalálni", azt is fw-ön kívül teszem először, és ha beválik, akkor viszem be. Sok munka, de megéri.
50

És ennek most a működésre

geforce9600gt · 2014. Jan. 16. (Cs), 13.42
És ennek most a működésre nézve van hátránya, vagy pedig késöbb nehéz lesz továbbfejleszteni, módosítani a kódot?
52

Mint valószínűleg látod,

bamegakapa · 2014. Jan. 16. (Cs), 14.07
Mint valószínűleg látod, "működik". Épp úgy, mint egy összetákolt, összecsapott viskó. Csak éppen az emberiség idővel megtanulta, hogy ha bizonyos konvenciókat betart egy ház építésekor, akkor az eredmény időtállóbb lesz. A párhuzam ugyanígy működik más szakmákban is, a webfejlesztés sem kivétel.

Jól szervezett kódban könnyebb a hibakeresés, hibajavítás, tesztelés (ez spagettikódban eleve problémás lenne), fejlesztés. Eleve jóval kisebb az esélye a hibák elkövetésének, mert a kód átlátható, részekre bontott. Spagettikóddal te magad is nagy bajban leszel, ha mondjuk egy hónap után bele kell nyúlnod, mondjuk kijavítani egy hibát, mert addigra már nem emlékszel, mi hogy is volt és nincs követhető struktúra, ami vezessen.
53

Én is így haladtam, de

bamegakapa · 2014. Jan. 16. (Cs), 14.16
Én is így haladtam, de mindenkinél nem működik ugyanaz. Van, aki nem képes magától felismerni a kódszervezés szükségességét, vagy hogy mi lenne a megfelelő módja. Ilyenkor a jó framework segíthet, bevezethet a szemléletbe.

Nálunk az is közrejátszott, hogy volt más programnyelveken tapasztalatunk. A spagettikód semmilyen nyelven nem kifizetődő :).
55

Valóban

Pepita · 2014. Jan. 16. (Cs), 17.50
nem mindenkinél működik ugyanaz, de autót vezetni sem úgy tanulsz meg jobban, ha beülsz egy mindent magától tudó autóba, hanem ha Trabanton kezded, mert ha azt el tudod vezetni, később nem okoz problémát a jobb autó vezetése.
Az is igaz, hogy
Van, aki nem képes magától felismerni a kódszervezés szükségességét
, de neki többen és többfelől rávilágítottunk.

A spagettikód semmilyen nyelven nem kifizetődő :).
Ez pontosan így igaz. De pl. anno a Commodore-ok világában nem is álmodhattunk arról, hogy nem egy fájlban van a teljes program... :) (Mondjuk ez csak részben igaz, de a következő részt - ha volt - általában az előző memóriahelyére töltötted be.)
Szerintem a spagetti, ahonnét mindenki elindul, van aki képes továbblépni néhány nagyobb lépést egészen a jól felépített OOP-ig, van aki kevesebbet - és van aki megreked a spagettinél.


Szerk.: a házépítős példád nagyon tetszik, azt mondom: a jól felépített házhoz ne használjon feltétlenül kész betont, hanem inkább lapátoljon a betonkeverőbe maga (fw helyett).
51

Keretrendszer

Hidvégi Gábor · 2014. Jan. 16. (Cs), 13.55
Lehet, hogy így van, de ha már keretrendszer, akkor nem mindegy, hogy melyik. Múltkor egy ismerősöm megkért, hogy nézzek bele egy Yii-s projektjébe, ami egy CMV (szerintem is így logikus) rendszer, és emiatt egymilliom fájlra szét volt aprózva, amit egy IDE nélkül hosszú távon lehetetlen programozni.

Szóval nem egyszerű a problémakör.
54

Ez már szerintem az ízlések

bamegakapa · 2014. Jan. 16. (Cs), 14.22
Ez már szerintem az ízlések és pofonok része a dolognak. Én épphogy egy nagy fájlt vagyok képtelen használni, számomra áttekinthetetlen IDE nélkül :).

Ha olyat választ, ami szakmailag elfogadott (a Yii-t nem próbáltam, de sokan mondják, hogy jó), azzal már biztos, hogy előrébb van, mintha spagettikóddal iparkodik. Szerencsés esetben úgyis tovább fejlődik, igénye lesz más frameworköket is megismerni, hogy azok hogyan oldanak meg bizonyos problémákat.
56

Én épp azért

Pepita · 2014. Jan. 16. (Cs), 18.01
javaslom, hogy ne "egyből" fw, mert ha már írt magától aránylag tiszta kódot, akkor könnyebben kipróbál egymás után több keretrendszert is, rászánja az időt és olvas is róluk, mindegyik választottal megcsinálja a Hello World-öt, és így sokkal inkább ki tudja választani a neki megfelelőt.

Egyébként én IDE nélkül szinte a fejlesztést tartom lehetetlennek, persze ez erős túlzás, néha hobbyból még assembly-zek is, ahhoz pedig még mindig a megszokott DOS-os szövegszerkesztőt használom, kötegfájllal fordítok. :)
De - ha nem is teljesen kezdőnek - én javaslom mindenkinek a számára kényelmes IDE használatát, nagyon meg tudja gyorsítani - könnyíteni a fejlesztést. Persze ennek kiválasztása is van olyan nehéz, mint a keretrendszeré. Aztán még ott a verziókezelés... - lehet sorolni.