tag:forum.selfhtml.org,2005:/self php, Funktionen, Klassen und Fehlersuche – SELFHTML-Forum 2021-07-05T14:14:22Z https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789939#m1789939 Jörg 2021-07-05T11:06:13Z 2021-07-05T11:06:13Z php, Funktionen, Klassen und Fehlersuche <p>Hallo,</p> <p>ich lasse in einer Schleife ien Script durchlaufen, bei dem der 1. Schleifendurchgang noch funktioniert, der 2. aber nicht mehr.</p> <p>Die entscheidende Stelle im Script ist ein Funktionen-Klassen-Konstrukt, das ich bisher auch in einer Schleife genutzt hatte, aber indem sich die Seite selber neu aufrief. Nun habe ich es umgeschrieben und eine while-Schleife macht diesen job.</p> <p>Warum stockt das Script an dieser Stelle?</p> <p>Hinweis: Die Query im ersten Durchlauf wird geschrieben, die zweite nicht mehr. Möglicherweise darf ich hier die Funktion nicht mehrfach aufrufen? Mein error_reporting ist eingeschaltet, zeigt mir aber nichts an.</p> <p>Jörg</p> <pre><code class="block language-php"><span class="token keyword">function</span> Blablub <span class="token punctuation">{</span> <span class="token operator">...</span><span class="token operator">.</span> <span class="token keyword">require_once</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'../fpdf/mc_table_turn1.php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">session_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'ID'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$ID</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">PDF_Table_Header</span> <span class="token keyword">extends</span> <span class="token class-name">PDF_MC_Table_TURN1</span> <span class="token punctuation">{</span> <span class="token comment">//Kopfzeile</span> <span class="token keyword">function</span> <span class="token function-definition function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">global</span> <span class="token variable">$con</span><span class="token punctuation">;</span> <span class="token keyword">global</span> <span class="token variable">$ID</span><span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function-definition function">foo</span><span class="token punctuation">(</span><span class="token variable">$bar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">global</span> <span class="token variable">$con</span><span class="token punctuation">;</span> <span class="token keyword">global</span> usw<span class="token operator">...</span><span class="token punctuation">;</span> <span class="token variable">$query_namen</span><span class="token operator">=</span><span class="token string double-quoted-string">"select ... "</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$query_namen</span></span>"</span><span class="token punctuation">;</span> <span class="token operator">...</span><span class="token operator">.</span><span class="token operator">.</span> </code></pre> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789940#m1789940 MudGuard http://www.andreas-waechter.de/ 2021-07-05T11:14:21Z 2021-07-05T11:14:21Z php, Funktionen, Klassen und Fehlersuche <p>Hi,</p> <blockquote> <p>Die entscheidende Stelle im Script ist ein Funktionen-Klassen-Konstrukt, das ich bisher auch in einer Schleife genutzt hatte, aber indem sich die Seite selber neu aufrief. Nun habe ich es umgeschrieben und eine while-Schleife macht diesen job.</p> <p>Warum stockt das Script an dieser Stelle?</p> </blockquote> <p>Das Problem liegt vermutlich in den Teilen des Scripts, die Du verheimlichst.</p> <p>Wo ist denn die Schleife, um die es geht?</p> <p>Was versteckt sich hinter "..."?</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789941#m1789941 dedlfix 2021-07-05T11:20:30Z 2021-07-05T11:20:30Z php, Funktionen, Klassen und Fehlersuche <p>Tach!</p> <blockquote> <p>Warum stockt das Script an dieser Stelle?</p> </blockquote> <p>Dein gezeigter Code ist syntaktisch unvollständig, so dass nicht zu sehen ist, was worin geschachtelt ist. Deshalb hier nur der allgmeine Tipp: betreibe Debugging. Wenn Wunsch und Wirklichkeit voneinander abweichen, muss man herausfinden, wo das geschieht. An irgendeiner Stelle ist vielleicht ein Variableninhalt oder Funktionsergebnis oder Ergebnis eines Ausdrucks anders als erwartet. Zudem können Kontrollausgaben an strategisch wichtigen Punkten aufzeigen, welche Wege die Ausführung geht, oder auch nicht geht.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789942#m1789942 Jörg 2021-07-05T11:33:42Z 2021-07-05T11:33:42Z php, Funktionen, Klassen und Fehlersuche <blockquote> <p>Wenn Wunsch und Wirklichkeit voneinander abweichen, muss man herausfinden, wo das geschieht.</p> </blockquote> <p>Na, die habe ich gefunden:</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">PDF_Table_Header</span> <span class="token keyword">extends</span> <span class="token class-name">PDF_MC_Table_TURN1</span> </code></pre> <p>Genau an dieser Stelle bricht das script bei Durchlauf 2 ab.</p> <p>Jörg</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789943#m1789943 Tabellenkalk 2021-07-05T11:39:03Z 2021-07-05T11:39:03Z php, Funktionen, Klassen und Fehlersuche <p>Hallo,</p> <blockquote> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">PDF_Table_Header</span> <span class="token keyword">extends</span> <span class="token class-name">PDF_MC_Table_TURN1</span> </code></pre> <p>Genau an dieser Stelle bricht das script bei Durchlauf 2 ab.</p> </blockquote> <p>kaufst du dir jedes Mal ein neues Auto, wenn du einkaufen fahren möchtest?</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789944#m1789944 dedlfix 2021-07-05T11:42:26Z 2021-07-05T11:42:26Z php, Funktionen, Klassen und Fehlersuche <p>Tach!</p> <blockquote> <p>Genau an dieser Stelle bricht das script bei Durchlauf 2 ab.</p> </blockquote> <p>Ist das eine Rätselaufgabe? Wenn nicht, gibt bitte nachvollziehbaren Code. Am besten ist dazu ein auf das Problem reduzierter Prototyp.</p> <p>Vielleicht schachtelst du Dinge ungünstig. Wenn zum Beispiel eine Funktion in einer anderen steht, muss man dafür sorgen, dass die Deklaration der inneren Funktion nur einmal ausgeführt wird. Ansonsten bricht PHP ab, weil es keine zwei Funktionen mit demselben Namen anlegen kann.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789945#m1789945 Jörg 2021-07-05T11:43:39Z 2021-07-05T11:43:39Z php, Funktionen, Klassen und Fehlersuche <p>Hallo Kalk,</p> <blockquote> <blockquote> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">PDF_Table_Header</span> <span class="token keyword">extends</span> <span class="token class-name">PDF_MC_Table_TURN1</span> </code></pre> <p>Genau an dieser Stelle bricht das script bei Durchlauf 2 ab.</p> </blockquote> <p>kaufst du dir jedes Mal ein neues Auto, wenn du einkaufen fahren möchtest?</p> </blockquote> <p>Normalerweise schon. </p> <p>Problem ist, ich weiß nicht, wie ich aus der Nummer raus komme. Und ich weiß auch nicht, warum mein error_reporting nicht meckert.</p> <p>Jörg</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789946#m1789946 Jörg 2021-07-05T11:57:01Z 2021-07-05T11:57:01Z php, Funktionen, Klassen und Fehlersuche <p>Hi,</p> <blockquote> <blockquote> <p>Genau an dieser Stelle bricht das script bei Durchlauf 2 ab.</p> </blockquote> <p>Ist das eine Rätselaufgabe? Wenn nicht, gibt bitte nachvollziehbaren Code. Am besten ist dazu ein auf das Problem reduzierter Prototyp.</p> </blockquote> <p>Genau das habe ich doch gemacht. Oder nicht?</p> <blockquote> <p>Vielleicht schachtelst du Dinge ungünstig.</p> </blockquote> <p>Neuer Versuch:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token variable">$i</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">function</span> <span class="token function-definition function">Blablub</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//....</span> <span class="token keyword">require_once</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'../fpdf/mc_table_turn1.php'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">session_start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'ID'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$ID</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">PDF_Table_Header</span> <span class="token keyword">extends</span> <span class="token class-name">PDF_MC_Table_TURN1</span> <span class="token punctuation">{</span> <span class="token comment">//Kopfzeile</span> <span class="token keyword">function</span> <span class="token function-definition function">Header</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">global</span> <span class="token variable">$con</span><span class="token punctuation">;</span> <span class="token keyword">global</span> <span class="token variable">$ID</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">foo</span><span class="token punctuation">(</span><span class="token variable">$bar</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">global</span> <span class="token variable">$con</span><span class="token punctuation">;</span> <span class="token variable">$query_namen</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"select ... "</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$query_namen</span></span>"</span><span class="token punctuation">;</span> <span class="token comment">//.....</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></code></pre> <p>So ich mein Beispiel selber correct verstanden habe, sollte diese Schleife auch im 2. Duchlauf an der Stelle "class PDF_Table_Header extends PDF_MC_Table_TURN1" abbrechen.</p> <p>Jörg</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789948#m1789948 Rolf B 2021-07-05T12:38:24Z 2021-07-05T12:44:29Z php, Funktionen, Klassen und Fehlersuche <p>Hallo Jörg,</p> <p>da hast Du Funktionen und Klassen vermutlich komplett mistverstanden.</p> <p>So nicht:</p> <pre><code class="block language-php"><span class="token variable">$i</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">function</span> <span class="token function-definition function">Blablub</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">PDF_Dings</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Wenn der nicht käme:</p> <pre><code class="block"><b>Fatal error</b>: Cannot redeclare Blablub() (previously declared in [...] </code></pre> <p>Käme unweigerlich beim zweiten Aufruf von Blablub der hier:</p> <pre><code class="block"><b>Fatal error</b>: Cannot declare class PDF_Dings, because the name is already in use </code></pre> <p>Wenn Du das nicht zu sehen bekommen hast, ist dein Error-Reporting nicht korrekt eingeschaltet.</p> <p>Genau darauf bezog sich die Frage, ob Du Dir für jedes Einkaufen ein neues Auto kaufst. Bei Dir ist es noch schlimmer: Du baust jedesmal eine neue Straße (Blablub), um mit den neugekauften Auto (PDF_Dings) darauf einkaufen zu fahren</p> <p>Das willst Du nicht. Du kaufst einmal ein Auto, du baust einmal eine Straße und fährst munter einkaufen:</p> <pre><code class="block language-php"><span class="token variable">$i</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator"><</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">Blablub</span><span class="token punctuation">(</span><span class="token variable">$i</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">Blablub</span><span class="token punctuation">(</span><span class="token variable">$i</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// do sth with $i</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">PDF_Dings</span> <span class="token keyword">extends</span> <span class="token operator">...</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> </code></pre> <p>Eine Funktion ist ein Stück Code mit einem Namen, das Du wiederverwendest. Eine Klasse ist ein Klumpen aus Variablen und Funktionen, die Du wiederverwendest. Deswegen wird beides separat definiert (am Anfang oder am Ende). PHP ist die Reihenfolge egal; du kannst Funktionen auch am Ende definieren, er findest sie trotzdem, weil er den Code zweimal durchliest. Zuerst um ihn in Bytecode zu compilieren, und dann, um ihn auszuführen.</p> <p>Wenn PHP die Definition antrifft, wird das nur gespeichert, aber nicht ausgeführt. Die Ausführung erfolgt, wenn Du die Funktion aufrufst.</p> <p>Das gilt auch für Klassen. Du kannst eine Klasse nur einmal definieren, danach ist der Name belegt.</p> <p><strong>ALLERDINGS</strong> gilt das nur, wenn Klasse oder Funktion auf dem Top-Level definiert werden. Du kannst eine Funktion oder Klasse auch irgendwo zwischen geschweiften Klammern definieren, dann entsteht sie erst, wenn diese Codestelle ausgeführt wird. Sie ist danach aber global verfügbar (anders als in JavaScript, wo lokale Funktionen lokal bleiben):</p> <pre><code class="block language-php"><span class="token function">blablub</span><span class="token punctuation">(</span><span class="token number">99</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// scheitert</span> <span class="token function">MakeBlub</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">blablub</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// funktioniert</span> <span class="token keyword">function</span> <span class="token function-definition function">MakeBlub</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">function</span> <span class="token function-definition function">blablub</span><span class="token punctuation">(</span><span class="token variable">$n</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Der Blub ist auf Stufe <span class="token interpolation"><span class="token variable">$n</span></span>\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Für dein Beispiel heißt das: Definiere die Funktion und die Klasse separat. Schachtele sie nicht ineinander. Du hast dann drei Bereiche:</p> <ul> <li>Hauptprogramm</li> <li>Funktion Blablub</li> <li>Klasse PDF_Table_Header und ihre Methoden</li> </ul> <p>Der Datenaustausch zwischen diesen Bereichen erfolgt rein über Parameter.</p> <p>Du solltest die Session auch nicht in Blablub starten. Sowas tut man nur einmal zu Programmbeginn, oder man definiert einen Autostart für die Session.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789953#m1789953 dedlfix 2021-07-05T13:28:42Z 2021-07-05T13:28:42Z php, Funktionen, Klassen und Fehlersuche <p>Tach!</p> <blockquote> <blockquote> <p>Am besten ist dazu ein auf das Problem reduzierter Prototyp.</p> </blockquote> <p>Genau das habe ich doch gemacht. Oder nicht?</p> </blockquote> <p>Nein. Ein Prototyp ist ein Programm, das laufen kann, an dem man die prinzipielle Funktionsweise einer Lösung nachweisen kann.</p> <p>Du hast Codefragmente gezeigt. Darin waren Funktionen und Klassen angefangen, und dann kamen Punkte. Es gab keine schließenden Klammern, anhand derer man sehen konnte, wo sie enden. Der Code war auch nicht besonders gut eingerückt, um die Struktur zu erkennen.</p> <blockquote> <p>Neuer Versuch:</p> </blockquote> <p>Schon besser. Das Problem lässt sich nun erkennen und wurde ja auch schon in anderen Postings erklärt. Deswegen beschränke ich mich hier nur auf eine kleine Anmerkung: Da kann noch viel mehr gekürzt werden. Die Session hat keine Bewandnis, ebensowenig braucht es die nicht weiter verwendeten Variablen.</p> <p>Wenn man solche Probleme hat, die man nicht versteht, kann die Prototyp-Vorgehensweise hilfreich sein. Man baut sich das Problem in einer neuen Anwendung nach, und lässt dabei alles weg, was nicht notwendig ist, um das Phänomen nachzustellen. Dann kann man sich auf das wesentliche konzentrieren und daran Untersuchungen anstellen.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2021/jul/05/php-funktionen-klassen-und-fehlersuche/1789962#m1789962 Jörg 2021-07-05T14:14:22Z 2021-07-05T14:15:32Z php, Funktionen, Klassen und Fehlersuche <p>Hallo Rolf,</p> <blockquote> <p>da hast Du Funktionen und Klassen vermutlich komplett mistverstanden.</p> </blockquote> <p>Funktionen sicher nicht, aber Klasse wohl.</p> <blockquote> <p>Wenn Du das nicht zu sehen bekommen hast, ist dein Error-Reporting nicht korrekt eingeschaltet.</p> </blockquote> <p>Was soll ich denn machen?</p> <pre><code class="block">error_reporting(E_ALL); ini_set('display_errors','ON'); </code></pre> <p>Das blöde ist, dass man das bei meinem Provider auch noch im Konfigurationsmenü einstellen kann, dann aber global, was ich nicht will.</p> <p>Ok, habs mittlerweile gefunden. Man muss im Konfigmenü des Providers erstmal freigeben, dass Scripte die globalen Einstellungen überschreiben dürfen <em>arghs</em></p> <blockquote> <p>Eine Funktion ist ein Stück Code mit einem Namen, das Du wiederverwendest. Eine Klasse ist ein Klumpen aus Variablen und Funktionen, die Du wiederverwendest. Deswegen wird beides separat definiert (am Anfang oder am Ende).</p> </blockquote> <p>Habe jetzt alle Klassen und Funktionen an den Scriptanfang geschrieben, Scriptende hatte zuvor nicht funktioniert. Keine Ahnung, warum. Jedenfalls schlug eine Query fehl, was sie nicht tut, wenn ich alle Funktionen und Klassen an den Scriptanfang stelle. Und ich bin grad zu entnervt, diesem Phänomen auf den Grund zu gehen.</p> <blockquote> <p>PHP ist die Reihenfolge egal; du kannst Funktionen auch am Ende definieren, er findest sie trotzdem, weil er den Code zweimal durchliest. Zuerst um ihn in Bytecode zu compilieren, und dann, um ihn auszuführen.</p> </blockquote> <p>Trotzdem schön, zu wissen, ich habe mich immer gefragt, ob das einen unterschied macht.</p> <blockquote> <p>Für dein Beispiel heißt das: Definiere die Funktion und die Klasse separat. Schachtele sie nicht ineinander. Du hast dann drei Bereiche:</p> <ul> <li>Hauptprogramm</li> <li>Funktion Blablub</li> <li>Klasse PDF_Table_Header und ihre Methoden</li> </ul> </blockquote> <p>Habe ich gemacht und siehe da: Es funkt. </p> <blockquote> <p>Du solltest die Session auch nicht in Blablub starten. Sowas tut man nur einmal zu Programmbeginn, oder man definiert einen Autostart für die Session.</p> </blockquote> <p>Mache ich auch normalerweise. Hatte das jetzt hier mit reingenommen wegen der Verständlichkeit.</p> <p>Danke, Rolf! Jetzt läuft "der Kas" und ich bin echt froh drum. Das ist ein Riesenscript mit fast 5000 Codezeilen, darin finde ich mich nicht so ganz easy zurecht Entsprechend entnervt bin ich gerade. Aber meine Nerven finde ich wieder und dann läuft das Teil ja immer noch <em>lol</em></p> <p>Jörg</p>