tag:forum.selfhtml.org,2005:/self php header("location ") oder window.close ohne funktion – SELFHTML-Forum 2021-04-15T09:57:35Z https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787277#m1787277 PHP-Neuling 2021-04-14T11:18:58Z 2021-04-14T11:18:58Z php header("location ") oder window.close ohne funktion <p>Hi zusammen :)</p> <p>Jetzt bin ich schon wieder hier, und zermadere mir mein Kleinhirn.</p> <p>Das Problem ist so simpel, dass ich wahrscheinlich deswegen die Kurve nicht kriege. Oder irgendwie so ...</p> <p>Ich habe für eine Datenbankübersicht ein einfaches delete script geschrieben.</p> <p>Es ist ein Script, welches für mehrere Tabellen gültig ist. Das Script per se funktioniert auch. Aber in diesem speziellen Fall werde ich das script nicht wieder los.</p> <p>Ich hänge an das Ende des Scriptes üblicherweise ein</p> <p>Header("Location: index.php");</p> <p>um nach erfolgter Löschung oder Speicherung direkt wieder eine aktuelle version der Seite zu ziehen.</p> <p>Das funktioniert auch immer, eigentlich.</p> <p>Bei diesem kurzen DELETE script funktioniert das überhaupt nicht. Der PHP Code wird ausgeführt, anschließend bleibt die Seite weiß.</p> <pre><code class="block language-html"><span class="token prolog"><?php header('Content-Type: text/html; charset=utf-8'); header("Expires: on, 01 Jan 1970 00:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); ini_set("display_errors", true); require '../include/db.php'; IF(isset($_GET['NEWS'])) { $ID1 = $_GET['NEWS'] ; $TYPE = "br_news";} else { IF(isset($_GET['TERM'])) { $ID1 = $_GET['TERM'] ; $TYPE = "br_termine";} else { IF(isset($_GET['MTGL'])) { $ID1 = $_GET['MTGL'] ; $TYPE = "br_mitglieder";}}} $Entfernen = $db->query("DELETE FROM " .$TYPE. " WHERE ID = $ID1 "); $Entfernen->execute() or die($db->error); Header("Location: index.php"); } ?></span> </code></pre> <p>Was soll also passieren:</p> <p>Über die index.php wird einem link über del.php? der TYPE mitgegeben. Bspw.</p> <p><a href="del.php?NEWS=2">click</a></p> <p>Die 2 ist die ID des DB Eintrags. NEWS/MTGL/TERM brauche ich zum wählen der korrekten DB.</p> <p>das query läuft durch. Die entsprechenden Einträge werden also korrekt gelöscht. Aber die Seite bleibt weiß.</p> <p>Testweise habe ich auch javascript zugefügt um die Seite zu schließen/umzuleiten. Oder einfach nur einen HTML Teil angefügt.</p> <p>Sobald das Script gelaufen ist wird nichts mehr geladen. weder PHP code noch HTML. Auch ein</p> <p>echo 'Raketenfürst'; direkt nach dem Execute wird nicht mehr ausgeführt.</p> <p>Wo habe ich denn den Hänger ?</p> <p>Vg</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787278#m1787278 Rolf B 2021-04-14T11:37:07Z 2021-04-14T11:40:57Z php header("location ") oder window.close ohne funktion <p>Hallo PHP-Neuling,</p> <p>den ini_set wird er wohl nicht ausführen, weil er das Script gar nicht erst startet. Dem } am Ende fehlt das {-Gegenstück.</p> <p>Deine IF-Kette ist übrigens verbesserungsfähig.</p> <ul> <li>Konsistenz beim Schreiben der Schlüsselwörter. <code>if</code> und <code>else</code> oder <code>IF</code> und <code>ELSE</code></li> <li>Zeilenumbrüche. Es gibt natürlich die unterschiedlichsten <a href="https://de.wikipedia.org/wiki/Einr%C3%BCckungsstil#Bekannte_Einr%C3%BCckungsstile" rel="nofollow noopener noreferrer">Stile beim Setzen von { und } und beim Einrücken von bedingtem Code</a>, aber "all in one line" macht man höchstens dann, wenn es einen IF und ein kurzes Statement im then-Teil gibt. Aber <strong>gut</strong> ist auch das nicht. Für</li> </ul> <pre><code class="block good language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_news"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>sollte immer Zeit sein. Vertikaler Platz muss nicht extra bezahlt werden </p> <ul> <li>Ein Ketten-If kann man eleganter schreiben als mit dreifach geschachtelten Klammern.</li> </ul> <pre><code class="block good language-php"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_news"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'TERM'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'TERM'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_termine"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'MTGL'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'MTGL'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_mitglieder"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>Und schließlich mal wieder ein Klassiker.</li> </ul> <pre><code class="block bad language-php"><span class="token variable">$Entfernen</span> <span class="token operator">=</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"DELETE FROM "</span> <span class="token operator">.</span><span class="token variable">$TYPE</span><span class="token operator">.</span> <span class="token string double-quoted-string">" WHERE ID = <span class="token interpolation"><span class="token variable">$ID1</span></span> "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Ich würde diesen Code ja gerne dunkelrot und blinkend machen. Sicherlich haben wir Dir schon was vom <a href="https://wiki.selfhtml.org/wiki/Programmiertechnik/Kontextwechsel" rel="nofollow noopener noreferrer">Kontextwechsel</a> erzählt? Dein Code erlaubt Injektion von SQL, das deine DB zerstört.</p> <p>Referenzbeispiel dafür: <a href="https://xkcd.com/327/" rel="nofollow noopener noreferrer">https://xkcd.com/327/</a></p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787302#m1787302 tk 2021-04-14T19:29:43Z 2021-04-14T19:29:43Z php header("location ") oder window.close ohne funktion <p>Hallo,</p> <blockquote> <p>Bei diesem kurzen DELETE script funktioniert das überhaupt nicht. Der PHP Code wird ausgeführt, anschließend bleibt die Seite weiß.</p> </blockquote> <p>Wie ist display_errors eingestellt? Eine weiße Seite deutet darauf hin dass das Script aufgrund eines Fehlers abgebrochen wurde.</p> <blockquote> <pre><code class="block bad language-php"><span class="token variable">$Entfernen</span> <span class="token operator">=</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"DELETE FROM "</span> <span class="token operator">.</span><span class="token variable">$TYPE</span><span class="token operator">.</span> <span class="token string double-quoted-string">" WHERE ID = <span class="token interpolation"><span class="token variable">$ID1</span></span> "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Wie Rolf schon schrieb: das ist ein gefährliches Sicherheitsscheunentor (eine Lücke ist das schon nicht mehr)! Das zu beheben wäre ganz einfach: statt $ID1 ein »?« (oder einen benannten Parameter bei PDO) in den Query schreiben, prepare() statt query() verwenden und $ID1 in einem Array an execute() übergeben, fertig.</p> <blockquote> <pre><code class="block language-php"><span class="token variable">$Entfernen</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token operator">-></span><span class="token property">error</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Mal abgesehen davon dass ein execute() wenig sinnvoll ist wenn du query() verwendest (das braucht man nur bei prepare()): Was verwendest du denn um auf die Datenbank zuzugreifen? Wenn du mysqli verwendest, <a href="https://www.php.net/mysqli.query#refsect1-mysqli.query-returnvalues" rel="nofollow noopener noreferrer">enthält</a> $Entfernen an dem Punkt ein true. Boolsche Werte haben aber natürlich keine Methode execute() und damit schlägt die Zeile mit einem Fatal Error fehl – das Ergebnis (bei display_errors=0) ist eben eine leere Seite.</p> <blockquote> <pre><code class="block bad language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>del.php?NEWS=2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>click<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span> </code></pre> </blockquote> <p>Aktionen die Daten verändern (anlegen, ändern oder löschen) sollten per <a href="https://wiki.selfhtml.org/wiki/PHP/Tutorials/Formulare#Wann_ist_GET_oder_POST_zu_verwenden.3F" rel="nofollow noopener noreferrer">POST-Request erfolgen, nicht per (GET-)Link</a>.</p> <p>Gruß,<br> Tobias</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787279#m1787279 PHP-Neuling 2021-04-14T11:44:15Z 2021-04-14T12:00:02Z php header("location ") oder window.close ohne funktion <p>Hi Rolf. und wieder mal danke für deine Mühe</p> <p>die letzte "}" war ein copypaste fehler. Zwischenzeitlich hatte ich noch ein submit drumrum gebaut</p> <p>Die Hinweise zur Ordnung und Sicherung (Kontextwechsel) habe ich verstanden Da war ich jetzt einfach etwas vorschnell</p> <p>Hier nochmal überarbeitet (noch ohne Kontextwechsel) und mit Schaltfläche. Header greift dennoch nicht</p> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_news"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'TERM'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'TERM'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_termine"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'MTGL'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'MTGL'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_mitglieder"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'DELETE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'DELETE'</span><span class="token punctuation">]</span><span class="token operator">==</span> <span class="token string single-quoted-string">'loeschen'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$Entfernen</span> <span class="token operator">=</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"DELETE FROM "</span> <span class="token operator">.</span><span class="token variable">$TYPE</span><span class="token operator">.</span> <span class="token string double-quoted-string">" WHERE ID = <span class="token interpolation"><span class="token variable">$ID1</span></span> "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$Entfernen</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token operator">-></span><span class="token property">error</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Header</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Location: close.php"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787280#m1787280 Der Martin 2021-04-14T12:04:42Z 2021-04-14T12:04:42Z php header("location ") oder window.close ohne funktion <p>Hallo,</p> <blockquote> <p>die letzte "}" war ein copypaste fehler. Zwischenzeitlich hatte ich noch ein submit drumrum gebaut</p> </blockquote> <p>wie bitte??</p> <blockquote> <p>Hier nochmal überarbeitet (noch ohne Kontextwechsel) und mit Schaltfläche. Header greift dennoch nicht</p> </blockquote> <p>Wo ist da eine Schaltfläche?</p> <blockquote> <pre><code class="block language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'NEWS'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_news"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'TERM'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'TERM'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_termine"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'MTGL'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ID1</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'MTGL'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$TYPE</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"br_mitglieder"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'DELETE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'DELETE'</span><span class="token punctuation">]</span><span class="token operator">==</span> <span class="token string single-quoted-string">'loeschen'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$Entfernen</span> <span class="token operator">=</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"DELETE FROM "</span> <span class="token operator">.</span><span class="token variable">$TYPE</span><span class="token operator">.</span> <span class="token string double-quoted-string">" WHERE ID = <span class="token interpolation"><span class="token variable">$ID1</span></span> "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$Entfernen</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token operator">-></span><span class="token property">error</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">Header</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Location: close.php"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Ich habe mal die Code-Auszeichnung korrigiert: Nicht HTML, sondern PHP.<br> Außerdem scheinst du jetzt zweigleisig zu fahren: Einige Parameter erwartest du per GET (also als URL-Parameter), einige per POST. Ernsthaft? - Okay, das ist nicht verboten, aber dann muss man beim Request auch sauber darauf achten, dass man alle Parameter richtig bestückt.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Wer respektiert werden will, sollte zunächst damit anfangen, andere zu respektieren. </div> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787281#m1787281 PHP-Neuling 2021-04-14T12:10:31Z 2021-04-14T12:10:31Z php header("location ") oder window.close ohne funktion <p>Hi</p> <p>Die Schaltfläche befindet sich im HTML kontext. Die hatte ich jetzt just nicht mit herauskopiert</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>hidden<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>DELETE<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loeschen<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Wirklich löschen ?<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value javascript language-javascript">submit</span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span> </code></pre> <p>Daher auch ein POST. Das ist eigentlich überhaupt nicht nötig, und auch gar nicht gewollt. Das Script soll direkt löschen.</p> <p>Ich wollte lediglich die geschweifte Klammer erklären am Ende des PHP.</p> <p>Egal ... Summasummarum. leitet dennoch nicht weiter. Weder so, noch so, noch ohne alles, auch nicht im Kontextwechsel</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787285#m1787285 PHP-Neuling 2021-04-14T12:43:09Z 2021-04-14T12:43:09Z php header("location ") oder window.close ohne funktion <p>okay, ich habs :)</p> <p>Verstehen tu ich's nicht. Aber nachdem ich mein Statement umgebaut habe funktioniert die Weiterleitung einwandfrei</p> <p>Vielen Dank euch</p> <p>Vg</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787289#m1787289 Rolf B 2021-04-14T13:03:15Z 2021-04-14T13:03:15Z php header("location ") oder window.close ohne funktion <p>Hallo PHP-Neuling,</p> <p>auch wenn Du das jetzt nicht mehr verwendest - das geht eleganter mit dem Form.</p> <ol> <li> <p>Dein onclick ist wirkungslos. Die Submit-Aktion wird durch type="submit" ausgelöst, und wenn Du bei Click eine Funktion namens submit aufrufen willst, müsstest Du onclick="submit()" schreiben. So, wie es jetzt ist, ist es ein Syntaxfehler und wird ignoriert.</p> </li> <li> <p>Ein Submit-Button braucht nur dann einen Click-Handler, wenn du explizit den Submit durch diesen Klick überwachen willst (es gibt auch Submit durch ENTER Taste oder ggf. andere Buttons). Willst Du generell den Submit des Form überwachen, registriere Dich auf das submit-Event des Forms.</p> </li> <li> <p><input type="submit"> ist nachteilig, weil Text und Value nicht trennbar sind. Man nimmt dafür besser das Button-Element. Dem gibst Du einen name und einen value, und die bekommst Du dann bei Klick auf den Button oder ENTER Taste im Form auch gepostet.</p> </li> </ol> <pre><code class="block good language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>DELETE<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>loeschen<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Wirklich löschen?<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span> </code></pre> <p>type="submit" kann man auch weglassen, das ist der Defaut. Und den Button mit einem Fragezeichen zu beschriften ist irreführend, wenn es die Bestätigung ist... Da gehört ein ‼️ hin.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787291#m1787291 Der Martin 2021-04-14T13:28:11Z 2021-04-14T13:28:11Z php header("location ") oder window.close ohne funktion <p>Hallo Rolf,</p> <blockquote> <ol> <li>Dein onclick ist wirkungslos.</li> </ol> </blockquote> <p>das stimmt soweit. Aber ...</p> <blockquote> <p>müsstest Du onclick="submit()" schreiben. So, wie es jetzt ist, ist es ein Syntaxfehler und wird ignoriert.</p> </blockquote> <p>... nicht deshalb. Es ist kein Syntaxfehler, sondern ein korrekter, gültiger Ausdruck. Er ermittelt eine Referenz auf die submit-Methode und tut dann einfach nichts damit. Auch das</p> <pre><code class="block language-js"><span class="token number">42</span><span class="token punctuation">;</span> </code></pre> <p>ist eine gültige Javascript-Anweisung. Nutzlos, aber korrekt.</p> <blockquote> <p>Und den Button mit einem Fragezeichen zu beschriften ist irreführend, wenn es die Bestätigung ist... Da gehört ein ‼️ hin.</p> </blockquote> <p>Yesss!!</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Wer respektiert werden will, sollte zunächst damit anfangen, andere zu respektieren. </div> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787292#m1787292 Rolf B 2021-04-14T13:49:57Z 2021-04-14T13:49:57Z php header("location ") oder window.close ohne funktion <p>Hallo Martin,</p> <p>whoa - was passiert denn da in onclick? Was ist der Kontext, in dem Code gesucht wird?</p> <p>Ich habe mal ein bisschen gespielt - es macht den Eindruck, als würde er eine Funktion zuerst am Button-Element suchen, dann am Form und dann global.</p> <p>Also</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token special-attr"><span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value javascript language-javascript"><span class="token function">hugo</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span>huhu<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> </code></pre> <p>ruft eine hugo-Methode auf, wenn ich sie an diesen Button klebe. Oder an HTMLButtonElement.prototype. Oder ich klebe sie ans Form. Oder an HTMLFormElement.prototype. Oder an window. WTUF? Ist das irgendwo dokumentiert?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787309#m1787309 PHP-Neuling 2021-04-15T04:43:16Z 2021-04-15T04:43:16Z php header("location ") oder window.close ohne funktion <p>Vielen lieben Dank euch allen</p> <p>ich hatte da tatsächlich einen syntax-fehler. Die Didaktik bei prepared Statements ist wohl noch nicht ganz in Fleisch und Blut übergegangen...</p> <p>Das ist auch immer ein Problem wenn man zum Erlernen und Fehlersuchen verschiedene Quellen nimmt. Denn verschiedene Quellen benutzen verschiedene Lösungswege (die auch manchmal gar nicht funktionieren), die untereinander nicht zwangsweise kompatibel sein müssen.</p> <p>Mein Delete Statement sieht jetzt so aus</p> <pre><code class="block language-html">if($db->query("DELETE FROM $TYPE WHERE ID = $ID1")){ printf("%d bearbeitete Zeilen.\n", $db->affected_rows); } $db->close; </code></pre> <p>den print habe ich zum testen drin. Im normalfall folgt der header("location") nach dem ->close</p> <p>Ist manchmal schwer zu sehen, welche Syntax jetzt zusammen passt oder nicht.</p> <p>Prozeduale oder Objektive Schreibweise</p> <p>Mysqli oder mysql oder pdo</p> <p>Da renne ich immer mal wieder in Fallen ... Genau so war es jetzt hier mit dem Execute()</p> <p>Den Code für den Button habe ich, so wie er ist, tatsächlich aus einem Lehrbuch (!), und habe den bislang immer für alle Knöpfe übernommen</p> <p>Ich probier aber mal rum ob man das auch einkürzen kann</p> <p>Ich bin euch sehr dankbar :)</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787314#m1787314 tk 2021-04-15T07:21:53Z 2021-04-15T07:21:53Z php header("location ") oder window.close ohne funktion <p>Hallo,</p> <blockquote> <p>Mein Delete Statement sieht jetzt so aus</p> <pre><code class="block bad language-php"><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"DELETE FROM <span class="token interpolation"><span class="token variable">$TYPE</span></span> WHERE ID = <span class="token interpolation"><span class="token variable">$ID1</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"%d bearbeitete Zeilen.\n"</span><span class="token punctuation">,</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token property">affected_rows</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token property">close</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Das ist leider immer noch genauso falsch und gefährlich wie vorher! Wie ich schon schrieb lag dein Problem an der execute()-Zeile, die bei dem von dir verwendeten mysqli einen Fatal-Error ausgelöst. Bei der Entwicklung solltest du die Ausgabe von Fehlermeldungen einschalten um solche Fehler selbst direkt zu sehen auch ohne ins errorlog schauen zu müssen.</p> <p>Die letzte Zeile scheint mir aber auch falsch zu sein - du möchtest die <a href="https://www.php.net/mysqli.close" rel="nofollow noopener noreferrer">Methode close()</a> aufrufen (was allerdings nicht notwendig ist), eine Eigenschaft close (also ohne die Klammern dahinter) gibt es nicht.</p> <blockquote> <p>Ist manchmal schwer zu sehen, welche Syntax jetzt zusammen passt oder nicht.</p> <p>Prozeduale oder Objektive Schreibweise</p> <p>Mysqli oder mysql oder pdo</p> </blockquote> <p>Die mysql-Erweiterung gibt es nicht mehr, es bleiben nur noch mysqli und PDO. Ich würde zu PDO (und damit objektorientiert) raten, das unterstützt benannte Parameter in prepared Statements, und das Zuweisen der Parameter ist einfacher. Dein Lösch-Query sähe dann so aus:</p> <pre><code class="block language-php"><span class="token variable">$stm</span> <span class="token operator">=</span> <span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"DELETE FROM "</span><span class="token operator">.</span><span class="token variable">$TYPE</span><span class="token operator">.</span><span class="token string double-quoted-string">" WHERE ID = :id"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stm</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'id'</span> <span class="token operator">=></span> <span class="token variable">$ID1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>wenn du bei mysqli bleiben willst, musst du statt „:id“ ein Fragezeichen verwenden und vor dem execute() noch die Werte über bind_param() zuweisen (das was ich gestern geschrieben hatte war nicht ganz korrekt, das mysqli-execute kann keine Parameter entgegennehmen, das muss vorher gemacht werden).</p> <blockquote> <p>Da renne ich immer mal wieder in Fallen ... Genau so war es jetzt hier mit dem Execute()</p> </blockquote> <p>Gewöhn dir ab besten an <strong>immer</strong> prepared Statements zu verwenden und verwende query() nur dann wenn du einen statischen Query ausführen willst der keinerlei Parameter enthält. Und denk daran die Löschaktion über einen POST-Request anzustoßen, nicht über einen Link.</p> <blockquote> <p>Den Code für den Button habe ich, so wie er ist, tatsächlich aus einem Lehrbuch (!), und habe den bislang immer für alle Knöpfe übernommen</p> </blockquote> <p>Von wann ist das Lehrbuch? Bücher neigen dazu relativ schnell zu veralten, auch Internetseiten sind oft veraltet (bei denen ist es aber oft nicht erkennbar von wann die Seite stammt). Leider ist es (v.a. für Anfänger) meist schwer zu erkennen welche Seite/welches Buch was taugt und welche(s) nicht.</p> <p>Gruß,<br> Tobias</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787316#m1787316 PHP-Neuling 2021-04-15T07:40:26Z 2021-04-15T08:08:44Z php header("location ") oder window.close ohne funktion <p>uff. escapen wie o.g. ist also nicht ausreichend</p> <p>okay schei** drauf. Ich münze jetzt alles auf PDO um. Ist langfristig scheinbar das einzig vernünftige, und ich falle vielleicht nicht mehr so schnell auf die Nase mit solch Kleinigkeiten</p> <p>...</p> <p>die Frage die hier stand war natürlich total dämlich ...</p> <p>Ich nutze ab jetzt überall pdo</p> <p>vielen vielen Dank</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787322#m1787322 Rolf B 2021-04-15T08:14:33Z 2021-04-15T08:14:33Z php header("location ") oder window.close ohne funktion <p>Hallo PHP-Neuling,</p> <blockquote> <p>escapen wie o.g. ist also nicht ausreichend</p> </blockquote> <p>Wo escapest Du denn was? Wenn Du es tun würdest, dann könnte es auch ausreichen. Den TYPE generierst Du selbst, denn muss man nicht escapen. Das Problem ist die ID. Wenn sie numerisch ist, könnte auch ein intval() ausreichen, um nur eine Zahl durchzulassen. Andernfalls gibt's in mysqli die Methode <a href="https://www.php.net/manual/en/mysqli.real-escape-string.php" rel="nofollow noopener noreferrer">real_escape_string</a> (die heißt aus historischen Gründen so) und in PDO gibt's <a href="https://www.php.net/manual/en/pdo.quote.php" rel="nofollow noopener noreferrer">quote</a>.</p> <p>Die Variable mit dem DB-Handle kannst Du nennen wie Du willst. Meinetwegen auch $oracle.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787327#m1787327 tk 2021-04-15T09:18:31Z 2021-04-15T09:18:31Z php header("location ") oder window.close ohne funktion <p>Hallo Rolf,</p> <p>ergänzend:</p> <blockquote> <p>Andernfalls gibt's in mysqli die Methode <a href="https://www.php.net/manual/en/mysqli.real-escape-string.php" rel="nofollow noopener noreferrer">real_escape_string</a> (die heißt aus historischen Gründen so) und in PDO gibt's <a href="https://www.php.net/manual/en/pdo.quote.php" rel="nofollow noopener noreferrer">quote</a>.</p> </blockquote> <p>… was in dem Fall hier aber nicht ausreichend würde, dafür müssten im Query noch Anführungszeichen um $ID1 stehen, sonst könnten mit der Übergabe von <code>1 OR 1</code> immernoch alle Datensätze gelöscht werden.</p> <p>Aber wie schon gesagt: besser immer prepared Statements verwenden, dann spart man sich das escapen.</p> <p>Gruß,<br> Tobias</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787329#m1787329 PHP-Neuling 2021-04-15T09:26:12Z 2021-04-15T09:26:12Z php header("location ") oder window.close ohne funktion <p><code>$stmt = $pdo->prepare("DELETE FROM ".$TYPE." WHERE ID = :id"); $stmt->execute(['id' => $ID1]);</code></p> <p>ich lerne nun mit PDO umzugehen. zukünftig werde ich auch nichts anderes mehr nehmen, und bestehende mysqli anwendungen umarbeiten</p> <p>Am Ende ist es sogar "einfacher" mit PDO stmt's, wenn man's erstmal raus hat. Sah aber immer kompliziert komisch aus .. :-D</p> <p>Danke Euch</p> https://forum.selfhtml.org/self/2021/apr/14/php-header-location-oder-window-close-ohne-funktion/1787335#m1787335 Rolf B 2021-04-15T09:57:35Z 2021-04-15T09:57:35Z php header("location ") oder window.close ohne funktion <p>Hallo tk,</p> <blockquote> <p>Anführungszeichen um $ID1</p> </blockquote> <p>latürnich. Das hatte ich übersehen. Ich muss nur Strings escapen, und Strings muss ich in Anführungszeichen setzen.</p> <p>Zahlen muss ich zu Zahlen machen und ohne Anführungszeichen einsetzen, weswegen ich auf intval verwies.</p> <p>Einen String an einen Query Parameter zu übergeben, der eine Zahl erwartet, dürfte zu SQL Fehlern führen...</p> <p>Kontextwechsel ist nichts für einfache Gemüter </p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>