Helpdesk
Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung
weitere Rubriken
PhilosophieTräumeOrteEsoterikLiteraturAstronomieHelpdeskGruppenGamingFilmeMusikClashVerbesserungenAllmysteryEnglish
Diskussions-Übersichten
BesuchtTeilgenommenAlleNeueGeschlossenLesenswertSchlüsselwörter
Schiebe oft benutzte Tabs in die Navigationsleiste (zurücksetzen).

Programmieren: Hilfe & Austausch

920 Beiträge ▪ Schlüsselwörter: Programm, Code, Html ▪ Abonnieren: Feed E-Mail

Programmieren: Hilfe & Austausch

10.02.2013 um 22:20
Anmerkung.

Bei limit n,7 sind es bis zu 49 DB Anfragen (maximal) nur um die Kommentarseite zu erstellen. Dazu kommen noch mehrere Anfragen für die restliche Seite.

Maximal etwas über 50 Anfragen pro Seitenaufruf. Zu viel. Wissend dass es auch mit unter 5 gehn würde.


melden

Programmieren: Hilfe & Austausch

10.02.2013 um 22:32
Sry. Es können noch viel mehr werden. 7*7 ist ne völlig falsche Rechnung... Pro parent maximal eine tiefe von 7 childs. Allerdings lässt sich unterhalb der maximalen Verzeichnistiefe ja beliebig erweitern und auf jedes Elternelement können x beliebige childelemente unterhalb der maximalen tiefe kommen...

Die Datenbank wird bei jedem kommentar abgefragt, auch wenn es selbst keine weiteren weiteren Unterelemente hat.


melden

Programmieren: Hilfe & Austausch

10.02.2013 um 22:41
Dazu kommen verschiedene funktionen innerhalb der get_child function die eher ressourcenfressend sind. Verschlüsseln, entschlüsseln etc.

Unter den Vorraussetzungen ist die Lösung im Grunde nichtmal mehr OK sondern stümperhaft.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

11.02.2013 um 10:41
@Dr.BT_

Ich glaube das weiß ich nicht, ich verstehe nicht mal wie diese Tabelle(n?) auf gebaut sind dass sowas überhaupt möglich ist. ^^


melden

Programmieren: Hilfe & Austausch

12.02.2013 um 01:17
Der Aufbau ist einfach. @AnGSt


$sql = select * from comments where newsId = 123 and parentId = 0 Order by date limit 0,7;

Danach verschachtelte div container mit dem Ergebnis erstellen und innerhalb des parent containers wird die getChild Methode aufgerufen. Jedes Child wird in den div container des parent integriert und das eben bis die maximale tiefe erreicht ist.

Die childfunktion ist abgetrennt von der ersten query welche die absoluten parents ausliest. Beim erzeugen der topparents wird kein linker border gesetzt. Erst innerhalb der getchild Funktion wird ein linker border genutzt.

Die tiefenvariable wird pro erfolgreichem Loop ingrementiert. Anhand der variable mit der aktuellen Tiefe wird eine Farbe ausgewählt. Jedes element hat ein linkes padding von 10. Das erzeugt die Tiefenstruktur.

Alle außer das toplevelelement haben einen linken border. Durch die verschachtelte integration der childs ergibt sich die konsistenz des linken borders. Das div wird höher mit jedem child. Selbiges passiert mit den childDivs innerhalb eines childs.


Das ausgegebene html sieht so aus:

Vorsicht Baustelle:
[objerror]Bild nicht mehr verfügbar (/img/icon_set/36.png)[/objerror] [url=index.php?c=comments&parent=513#comment-513]Reply[/url] <a class="c-17">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. # Hier wird getChild aufgerufen (noch innerhalb des parent divs): # Identisches html, neu dazu kommt der linke border # und das padding-left:10px; Das selbe Strukturprinzip wird innerhalb der # getCHild Methode so lange gelooped bis die max Tiefe erreicht wurde. # Der reply container wird anhand eines $_GETs in das betreffende div integriert

Es gibt mehrere Wege. Der aktuell von mir genutzte ist der ineffektivste da sehr viele einzelne queries abgeschickt werden können.


Ein Weg der die Anzahl an queries auf eine feste Größe schrumpft wäre noch recht einfach. (Mittelmaß) Wobei es dann immer noch recht viele werden können. max 7*7 bzw. bei einer Tiefe von 10, max 10*10 etc.


Die Profilösung setzt ein recht intensives Verständnis über nested sets vorraus.


melden

Programmieren: Hilfe & Austausch

12.02.2013 um 01:26
Sind mysql prozeduren effektiver als php basierte Lösungen?

http://www.java2s.com/Tutorial/MySQL/0240__Cursor/Usingwhilelooptoloopthroughacursor.htm

PS: Padding-left = 20px;


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

12.02.2013 um 08:10
ok, habe ich gelesen. was genau willst du machen? den query beschleunigen? zeig mal den query. ich würde childs und parents in die selbe tabelle legen, parents mit parent-pointer null.


melden

Programmieren: Hilfe & Austausch

12.02.2013 um 08:48
@AnGSt

Moin,

alle Kommentare sind im selben Table. TopLevelParents sind in der Spalte "parent" genullt.

Childs tragen dort jeweils die id des jeweiligen parent der auch ein child sein kann.

Sql ist ganz simpel gehalten.

Habs mal auf das nötigste runtergetrimmt:

function getChild($parent){ $sql2 = mysql_query('SELECT id,parentID,author,date,message FROM comments '. 'WHERE parentID="'.$parent.'";'); while ( $result2 = mysql_fetch_array($sql2) ) { echo ""; # HTML erzeugen $createInnerHTML->{'innerHTML'}($result); # Funktion erneut aufrufen getChild($result['parentID']); echo ""; } # Get TopLevelParent $start_from = ($page-1) * 7; $string = isset($_GET['showAll']) ? "" : "LIMIT ".$start_from.", 7" ; $sql1 = mysql_query("SELECT id,parentID,author,date,message FROM comments WHERE articleID='".$articleID."' AND parentID = '0' ORDER BY id DESC ".$string.""); while( $result = mysql_fetch_array($sql1) ){ echo ""; # HTML erzeugen $createInnerHTML->{'innerHTML'}($result); # getChildloop initialisieren getChild($result['parentID']); echo ""; }


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

12.02.2013 um 09:10
für queries die in einer schleife verwendet werden, würde ich prepared statements benutzen, falls es dir nur um die geschwindigkeit geht. an sonsten sehe ich an deinem code so nichts was ich anders machen würde.


melden

Programmieren: Hilfe & Austausch

12.02.2013 um 09:19
Mittelklasse wäre z.B. irgendwas in die Richtung:

Eine neue Spalte namens countDepth. Wird ein Kommentar abgegeben erhöht sich der Wert countDepth des betreffenden parents um 1.

Schnell zusammengepfrimelter Code:



function getChilds($TopLevelParent,$parentID,$countDepth){
for($i=0;$i<=count($countDepth);$i++){
$fetchChilds = "select parentID,countDepth from comments where parentID = '".$parentID."'";
while($results = mysql_fetch_array($fetchChilds)){
$TopLevelParent = array_push($results);
return $TopLevelParent;
}
}


#Get TopLevelParents
$query1 = select parentID, ID,countDepth from comments where parentID = 0 .....
while($result1 = mysql_fetch_array('$query1')){
$i = 0;
$TopLevelParent.$i = array();
$parentID = $result1['parentID'];
$countDepth = $result1['countDepth'];
$TopLevelParent.$i = $result;
$TopLevelParent.$i = getChilds($TopLevelParent.$i,parentID,$countDepth);
$i++;

}

$Sort = array_keys($TopLevelParent.$i);
sort by parent ids...... etc.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

12.02.2013 um 09:25
ich sehe nicht was das bringen soll. und den query im fetch zu machen ist bestimmt noch langsamer.


melden

Programmieren: Hilfe & Austausch

12.02.2013 um 09:33
Hast recht. Ich denk ich lass es so. Wenn es nur eine Kategorienliste ohne "limit n,n" wäre könnte man "select * from comments" nutzen und danach sortieren. Durch das limit wird das ganze leider bissl schwieriger.

Hab die Seite mit einer handvoll simultaner request getestet und es gab keine merkbaren Latenzen. und mit sovielen Nutzern rechne ich auch nicht.

Wer brauch schon nested sets...^^

PS: obiges Beisspiel hat ein "paar" Fehler drinnen. $i wird resetet und der for Loop brauch frische Werte für die Variablen etc.


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:04
@acc

hast du mal kurz zeit?

habe eine frage zu js und php

für eine smileyfunze habe ich schon ein script. das funktioniert auch. jetzt wollte ich das script an anderer stelle verwenden und nach langem überlegen werden die bilder nun angezeigt, das js ist auch im quelltext zu sehen als auch die bilder bzw. die php.funktion ist auch da. leider werden die bilder bei klick nicht in die textarea gefügt bzw. der bbcode dafür...

ich finde den fehler nicht -.-


das js
<script type="text/javascript"> var n = 1; function add(code) { document.getElementById('formular').beitrag.value += "" + code ; } </script>

das form
<form name=\"formular\" id=\"formular\" action=\"antwort_schreiben.php?'.SID.'\" method=\"post\">

die textare
<textarea name=\"daten\" id=\"textarea\" cols=\"60\" rows=\"10\"></textarea>

kannst du grob nen fehler erkennen?


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:10
@Prof.nixblick
du willst doch was in die textarea (mit der id "textarea") einfügen und nicht in den form-tag (mit der id formular). versuchs mal so:
document.getElementById('textarea').innerHTML += code;


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:12
@acc

danke danke danke danke das ging :D sehr gut :D

aber warum ging das in dem anderen script? habs genau so rausgenommen? das muss ich mir merken!

danke nochmal :D


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:18
@Prof.nixblick
np :ok:

naja, also das "value" läßt mich drauf schließen, dass es im ursprünglichen script einen input-tag (welcher über ein value-attribut verfügt) angesteuert hat. was "beitrag" sein soll, keine ahnung. war wohl irgendwie vordefiniert oder einfach falsch :D die angabe '+= "" + code' war ebenso sinnlos :D

hier mal noch ein link zum nachschlagen und weiterbilden: http://www.w3schools.com/js/default.asp


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:21
btw empfehl ich dir formulare per ajax (am besten jquery) abzusenden http://api.jquery.com/jQuery.post/


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:22
@acc

habs grade noch in dem alten script getestet, funzt da auch.

merci für den link!!!!!!

ob ich das schon kann? ich bin noch anfänger :D


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:25
@Prof.nixblick

klar. wozu erst in alte techniken arbeiten, um dann doch auf die neuen umzusteigen? ;)

php ist tot, html auf version 5, css auf version 3. die zukunft sind eventbasierte applikationen, so wie nodejs oder ruby.


melden

Programmieren: Hilfe & Austausch

03.03.2013 um 23:26
@acc

php is tot? :o: mach kein mist, habs grad mal so in den anfängen kappiert!


melden