Seitenzähler bei Aufruf von Link zu externer Seite erhöhen und Auflistung/Sortierung nach Klicks

allv

Neues Mitglied
Dieser Thread wurde aus dem Projekt-Forum-Thread verschoben, da es hier primär um PHP-Thematiken geht:

Ursprungsbeitrag:

Hallo,
um die Plattform https://allv.wwhp.de, die ausschließlich ehrenamtlich betrieben wird, weiter zu entwickeln, bin ich auf der Suche nach professioneller Hilfe. Die zur Zeit zu lösende Aufgabe ist, ein Datenfeld im Format INT in einer SQL-Datenbank um eins zu erhöhen (x++), wenn ein Link zu einer externen Seite ausgeführt wird. Es müssen also zwei Aktionen mit einem Klick ausgeführt werden. Der Hintergrund ist der, dass wie bei Google die Seite mit den meisten Klicks oben steht. Sortierung zuerst nach den Klicks dann alphabetisch. Die Seite selbst ist mit html und PHP geschrieben.
Bitte melde dich nur bei ernstem Interesse.

Folgende Diskussion:
Moin, verstehe ich das richtig, dass du das System selbst weiter entwickelst aber technisch bei der Umsetzung des Seitenzählers nicht weiter kommst?

Wenn das der Fall ist, kann ich dir da gerne günstig oder kostenlos weiterhelfen (je nach Aufwand) oder es dir beibringen. Es klingt auch allgemein wie ein Problem, das sich hier direkt im Forum lösen lässt.

Wenn es um dauerhafte Seitenbetreuung geht, habe ich da leider nicht ausreichend Zeit für.

Hallo Mat,
das siehst du genau richtig. Die Seite habe ich als Laie komplett erstellt und gemeinsam mit einigen Enthusiasten die Datenbank gefüllt und von Usern füllen lassen. Der Begriff "Seitenzähler" scheint mir jedoch zu einfach.
Es freut mich, dass du geantwortet hast und deine Hilfe anbietest. Du wirst dich aber damit abfinden müssen, dass deine Mühe ehrenamtlich bleibt.
Hier einige Details:

PHP:
$abfrage = "SELECT * FROM Ehrbula WHERE ( gebiet LIKE '%$suche%' OR kommune LIKE '%$suche%' OR vollname LIKE '%$suche%' OR text LIKE '%$suche%' ) AND ( land LIKE '$wahl' OR kreis LIKE '$wahl' ) AND aktiv LIKE 'frei' ORDER BY vollname";

foreach ($pdo->query($abfrage) as $zeile)
{
  echo "<td align='center' valign='top' width='200'>";

  if ( $zeile['link'] != "" )
  {
   echo "<a href='",$zeile['link'],"' target='_blank'>";
   // Hier müsste also ein JS eingebaut werden, das den Link ausführt und einen Wert in dem entsprechenden Datensatz ( $zeile['id'] ) in der $zeile['zaehler'] um 1 erhöht.
  }
  echo "<img src='banner/", $zeile['banner'] ,"' class = 'images' /></a></td>";
  echo "<td><b>", $zeile['vollname'],"</b><br>", nl2br( $zeile['text'] );
  echo "</td></tr>";
}

Meine Idee dazu ist, das mit der ersten auszuführenden Aktion ein include ('datei.php'); erfolgt, wo ich den Eintrag in die Datenbank selbst leicht einrichten kann. Nur weiß ich nicht wie ich die id des Satzes in die include-Datei bekomme.
Und mit der zeiten Aktion der Link ausgeführt wird.
 
Zuletzt bearbeitet von einem Moderator:
Oh je, da besteht auf jeden Fall dringender Verbesserungsbedarf. Du hast Sicherheitslücken im Code und nutzt teils noch HTML fürs Styling.

Dein Datenbankcode ist anfällig für SQL Injections. Informiere dich auf jeden Fall über Prepared Statements bei PDO, welche in diesem Fall zu nutzen wären.
Du darfst unter keinen Umständen Nutzereingaben (z.B. aus der Suche) direkt in einen SQL-Query einbinden.

Hier z.B. ein gutes PDO-Tutorial: https://phpdelusions.net/pdo#prepared


Meine Idee dazu ist, das mit der ersten auszuführenden Aktion ein include ('datei.php'); erfolgt, wo ich den Eintrag in die Datenbank selbst leicht einrichten kann. Nur weiß ich nicht wie ich die id des Satzes in die include-Datei bekomme.
Und mit der zeiten Aktion der Link ausgeführt wird.
Verstehe nicht ganz, was du meinst.
Code aus eingebundenen Dateien mit require/include wird praktisch einfach nur an die jeweilige Stelle, wo du die Datei einbindest, eingefügt und ausgeführt, sodass Variablen wie üblich verfügbar sind.
Mehr dazu hier: https://www.php.net/manual/de/function.include.php

Grundsätzlich empfiehlt es sich aber, z.B. eine Funktion zu erstellen, diese aus einer Datei wie z.B. functions.php einzubinden und dann die ID als Parameter an die Funktion zu übergeben.

Ich würde übrigens unabhängig davon überlegen, nicht auf eine JavaScript-Lösung für den Aufruf von Links zu setzen, sondern stattdessen mit PHP eine Art Proxy zu bauen, worüber man zum jeweiligen Link weitergeleitet wird und gleichzeitig der Aufruf in der DB gespeichert wird.

Könnte dann ungefähr so aussehen:
PHP:
echo '<a href="/proxy.php?url=' . $zeile['link'] . '" target="_blank" rel="noopener">';
 
Ja, sieht auf jeden Fall wie etwas aus, wobei wir hier im Forum direkt weiterhelfen können.

Das mit den sicheren SQL-Abfragen ist auch keine große Umstellung. Es könnte zum Beispiel so aussehen (Achtung, Code aus dem Kopf, hab's nicht getestet):

Mit bereinigten Eingaben:
$sql = "SELECT * FROM Ehrbula WHERE ( gebiet LIKE :suche OR kommune LIKE :suche OR vollname LIKE :suche OR text LIKE :suche ) AND ( land LIKE :wahl OR kreis LIKE :wahl ) AND aktiv LIKE 'frei' ORDER BY vollname"; 
$parameter = ['suche' => $suche, 'wahl' => $wahl];
$abfrage = $pdo->prepare($sql);
$abfrage->execute($parameter);
$zeilen = $abfrage->fetchAll(PDO::FETCH_ASSOC);

foreach ($zeilen as $zeile) {
  echo "<td align='center' valign='top' width='200'>";

  if ( $zeile['link'] != "" ) {
   echo "<a href='",$zeile['link'],"' target='_blank'>"; // inkl. Link zu Zähler
  }
  echo "<img src='banner/", $zeile['banner'] ,"' class = 'images' /></a></td>";
  echo "<td><b>", $zeile['vollname'],"</b><br>", nl2br( $zeile['text'] );
  echo "</td></tr>";
}


Das mit dem Proxy-Link würde ich auch so machen, wie @JR Cologne das vorgeschlagen hat. Also zuerst wird eure Weiterleitungsseite geladen, die speichert dann die Statistik und leitet den Besucher an die eigentliche Seite weiter. So könnt ihr auch direkt bestimmen, dass zum Beispiel pro Session und Zielseite der Zähler nur 1 mal inkrementiert werden darf (damit jemand nicht 1000 mal auf den selben Link klickt und damit die Statistik verändert).

Den Rest schaffen wir sicher auch mit ein wenig hin und her hier im Forum. Mach dafür am besten einen neuen Thread auf in https://dev-community.de/forums/php.18/ , weil hier im Projektforum jeder Beitrag erst freigeschaltet werden muss.
 
Hallo JR Cologne,
Danke für die Hinweise. Die Sache mit der SQL Injection war mir schon bewusst und bei Updates und Neueinträgen habe ich auch mit den Platzhaltern gearbeitet, nur nahm ich an, dass bei einer Abfrage nichts injeziert werden kann, weil ja nur gelesen wird.
Die Sache mit dem include ist mir im Nachhinein auch bewusst geworden. Die Variablen bleiben ja verfügbar. Das ganze war, wie gesagt nur eine Idee eines Laien und ist eventuell untauglich.
Deinen anderen Hinweis mit einer Art Proxy finde ich sehr interessant. Ich war bislang der Auffassung, dass nur mit Java oder Javaskript mehrere Aktionen mit einem Klick machbar sind.
Ich versuche deine Beispielzeile zu verstehen. Sollte es tatsächlich so einfach sein, dass in der proxy.php der Eintrag in der Datenbank erfolgt und dann die zeile['link'] ausgeführt wird? Und mit rel='noopener' alles verborgen bleibt?
 
Sehr gut, dann zieht es sich zumindest nicht durch die ganze Website.

Bei einer bloßen Select-Abfrage kann genauso eine SQL-Injection stattfinden. Die PDO-Methode query() eignet sich nämlich nicht nur für Select-Statements, sondern führt jeden beliebigen SQL-Befehl aus.
Unabhängig davon, welcher SQL-Befehl von dir ausgeführt wird, kann ein potenzieller Angreifer mit etwas rumprobieren durch bestimmte Eingaben erwirken, dass der SQL-Befehl an der Stelle, wo die Variable eingefügt wird, beendet wird und dahinter dann direkt einen komplett anderen SQL-Befehl einfügen, der z.B. alle Daten extrahiert oder die gesamte Datenbank löscht.

Ich war bislang der Auffassung, dass nur mit Java oder Javaskript mehrere Aktionen mit einem Klick machbar sind.
Ich versuche deine Beispielzeile zu verstehen. Sollte es tatsächlich so einfach sein, dass in der proxy.php der Eintrag in der Datenbank erfolgt und dann die zeile['link'] ausgeführt wird?
Wir führen in diesem Fall nicht mehrere Aktionen aus. Mit JavaScript kannst du clientseitig (also lokal im Browser) bestimmte Aktionen z.B. bei einem Klick ausführen. Mit Java hat das übrigens nichts zu tun.

Tatsächlich macht mein Beispiel aber was ganz anderes. Es verlinkt schlicht und ergreifend auf eine andere Seite, in dem Fall ein PHP-Skript. Der Nutzer wird also auf die andere Seite geleitet, hierbei übergeben wir per URL-Parameter den eigentlichen Link, der aufgerufen werden soll.
Diesen Parameter mit dem Link lesen wir dann bei Aufruf des PHP-Skripts durch Klick und Aufruf der Seite proxy.php aus.
In dem PHP-Skript können wir dann unsere beliebige serverseitige Logik ausführen, um den Linkaufruf in der DB zu speichern usw. und zum Schluss leiten wir den Nutzer zum eigentlichen Link weiter.

Der Zusatz rel="noopener" ist einfach eine Sicherheitsmaßnahme für den Link, damit die Website, die du mit dem Link aufrufst, nicht auf bestimmte Infos über die verlinkende (also deine) Seite zugreifen kann.
Mittlerweile ist das nicht mehr unbedingt bei ausgehenden Links erforderlich, da viele Browser das standardmäßig setzen, aber es schadet auch nicht.
Mehr Infos hier: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/noopener

Wobei in dem Fall ja eigentlich erstmal deine eigene Seite proxy.php aufgerufen werden würde, sodass ich mir nicht sicher bin, ob das überhaupt Sinn ergibt. Müsste man sich genauer anschauen...
Letztendlich ist es etwas, was nicht zwingend erforderlich ist und nichts mit der wesentlichen Implementierung der gewünschten Funktionsweise zu tun hat.
Kannst du also ignorieren.


Wie von @Mat vorgeschlagen, macht es wahrscheinlich Sinn, das Ganze im PHP-Forum zu diskutieren.
@allv
Soll ich den gesamten Thread hier verschieben oder möchtest du lieber ein neues Thema eröffnen?
Falls du weiterhin auf der Suche nach fester ehrenamtlicher Hilfe bist, würde ich den ersten Beitrag hier stehen lassen und nur unsere Diskussion zur konkreten Umsetzung in das PHP-Forum verschieben. Ansonsten das ganze Thema.
 
Hallo JR Cologne, hallo Mat,
Ich bin von Eurem Engagement begeistert. Danke Danke.
@JR Cologne
Ja, bitte verschiebe die Diskussion zum Thread.
Wenn ich dich richtig verstanden habe: die proxy.php besteht nur aus dem PHP-Skript, das die beiden Aktionen ausführt aber nicht explizit im Browser angezeigt wird. Wenn das so ist, finde ich es genial zielführend. Ich habe aber keine Ahnung wie man so ein Skript schreibt, wahrscheinlich ganz normalen Quelltext nur wie wird der Link ohne Zutun des Users ausgeführt?
@Mat
Danke für den Quelltext zur DB Abfrage. Ich habe ihn getestet. Das mit der $wahl funktioniert tadellos aber die Suche, die vorher nach einem Schnipsel durch %$suche% suchte, zeigt kein Ergebnis mehr.
 
Hoffe, das passt jetzt so für dich.
Hab versucht, es einigermaßen sinnvoll zusammen zu basteln.

Wenn ich dich richtig verstanden habe: die proxy.php besteht nur aus dem PHP-Skript, das die beiden Aktionen ausführt aber nicht explizit im Browser angezeigt wird. Wenn das so ist, finde ich es genial zielführend. Ich habe aber keine Ahnung wie man so ein Skript schreibt, wahrscheinlich ganz normalen Quelltext nur wie wird der Link ohne Zutun des Users ausgeführt?

Richtig. Ein PHP-Skript ist ja erstmal serverseitig. Wenn du kein HTML ausgibst, dann würde praktisch eine weiße leere Seite angezeigt werden.

Da das Speichern in der DB usw. aber i.d.R. so schnell gehen sollte, wird der Nutzer davon ggf. gar nichts mitbekommen, weil er direkt auf die externe Seite weitergeleitet wird. Die Weiterleitung würde dann auch serverseitig, mittels eines Location-Headers, geschehen.

Alternativ kannst du natürlich für den Nutzer noch ne nette Seite bauen, die er für paar Sekunden sieht, bevor er weitergeleitet wird. Das ist aber nicht unbedingt erforderlich.

Indem der Nutzer auf den normalen HTML-Link klickt, wird ja die Proxy-Seite einfach geöffnet und ausgeführt. Der Nutzer muss also nichts anderes machen als er eh tun würde.
Oder was meinst du mit wie wird der Link ohne den User ausgeführt?
 
Zuletzt bearbeitet:
Alles gut. Die Vorgehensweise ist mir jetzt klar und ich bin erstaunt, wie leicht das geregelt werden kann. Nun werde ich mich erst mal belesen und evtl. noch auf Unterstützung bei der Erstellung des Skriptes warten.
Nochmals Danke
 
Das mit der $wahl funktioniert tadellos aber die Suche, die vorher nach einem Schnipsel durch %$suche% suchte, zeigt kein Ergebnis mehr.

Oh, Verzeihung. Die Joker % müssen drin bleiben, ja.

Es hängt von der SQL-Variante ab, was da möglich ist. Was aber immer funktionieren sollte ist, mit PHP zu formatieren statt im SQL-String. Also nur diese Zeile anpassen:
PHP:
$parameter = ['suche' => "%$suche%", 'wahl' => $wahl];

Wenn das nicht geht, kann man es noch versuchen mit bindValue:
PHP:
$sql = "SELECT * FROM Ehrbula WHERE ( gebiet LIKE :suche OR kommune LIKE :suche OR vollname LIKE :suche OR text LIKE :suche ) AND ( land LIKE :wahl OR kreis LIKE :wahl ) AND aktiv LIKE 'frei' ORDER BY vollname";
$abfrage->bindValue(':suche', "%$suche%");
$abfrage->bindValue(':wahl', "$wahl")
$abfrage = $pdo->prepare($sql);
$abfrage->execute();
$zeilen = $abfrage->fetchAll(PDO::FETCH_ASSOC);
 
Zuletzt bearbeitet:
Die erst Variante hatte ich gestern auch schon erfolglos versucht aber die zweite (mit ; in Zeile 3) geht tadellos. Danke.
Gestern hat auch noch die Ausführung folgender Funktion in dem extra PHP-Skript funktioniert, so wie JR Cologne vorgeschlagen hat. Heute mit mal nicht mehr!?
PHP:
function weiter() {
    echo "<a href=' " . $link . " '></a>";
}
weiter();
Der Link wurde richtig mit der Methode GET übergeben, wenn es nur die eine Variable ist.
Dann gibt es noch Folgendes:
Mehrere Variablen mit GET weiterleiten, etwa so:
PHP:
echo '<a href="/proxy.php?url=' . $zeile['link'] . ' , id=' . $zeile['id'] . ' , zahl=' . $zeile['klicks'] . ' " target="_blank">';
ist gewiss falsch, aber ich finde nicht die richtige Schreibweise. Die Trennung ohne Komma und mit Semikolon bringt auch nichts. Auf proxy.php kommt es so an
https://www.seite.de , id=907 , zahl=0
Und das ist nur der Inhalt der Variable $_GET['url']
 
Zuletzt bearbeitet von einem Moderator:
Gestern hat auch noch die Ausführung folgender Funktion in dem extra PHP-Skript funktioniert, so wie JR Cologne vorgeschlagen hat. Heute mit mal nicht mehr!?
PHP:
function weiter() {
echo "<a href=' " . $link . " '></a>";
}
weiter();
Das Codebeispiel ist falsch, allerdings weiß ich nicht, in welchem Kontext usw. du es überhaupt verwendest bzw. ob das dann überhaupt Sinn ergibt.

Die Variable müsstest du als Parameter der Funktion definieren und dann entsprechend übergeben.

PHP:
function weiter($link) {
    echo "<a href=' " . $link . " '></a>";
}
// Aufruf, wo Link ausgegeben werden soll
weiter($zeile['link']);


Der Link wurde richtig mit der Methode GET übergeben, wenn es nur die eine Variable ist.
Dann gibt es noch Folgendes:
Mehrere Variablen mit GET weiterleiten, etwa so:
PHP:
echo '<a href="/proxy.php?url=' . $zeile['link'] . ' , id=' . $zeile['id'] . ' , zahl=' . $zeile['klicks'] . ' " target="_blank">';
ist gewiss falsch, aber ich finde nicht die richtige Schreibweise. Die Trennung ohne Komma und mit Semikolon bringt auch nichts. Auf proxy.php kommt es so an
https://www.seite.de , id=907 , zahl=0
Und das ist nur der Inhalt der Variable $_GET['url']
Die Syntax der URL-Parameter ist falsch, wie du schon vermutest, daher funktioniert das nicht. Richtig wäre folgende URL: /proxy.php?url=...&id=...

Die Zahl der Klicks würde ich nicht übergeben. Diese erhöhst du ja einfach immer um 1 in der Datenbank und musst daher nicht wissen, was der bisherige Wert war.
 
OK, gleich hab' ich's. Der Datenbankeintrag geht wie erwartet, nur die Weiterleitung funktioniert nicht (bzw. nicht mehr, hat aber schon mal) die leere Skriptseite bleibt stehen, der Link wird nicht ausgeführt. Geht es noch anders als mit function?

PHP:
$link = $_GET['url'];

function weiter($link) {
    echo '<a href="'.$link.'"></a>';
  // auch so probiet: echo "<a href=' " . $link . " '></a>";
}
weiter($link);

//wenn ich weiter(zeile['link']) verwende, meckert gleich die php.ini weil dieses Arry in dem Skript nicht vorkommt
 
Zuletzt bearbeitet von einem Moderator:
Benutz mal PHP Codeblöcke in deinen Beiträgen: den Code-Button verwenden, oder selber tippen: [CODE=php]echo $hello. ' world';[/CODE]

Also die Funktion "weiter" ist in proxy.php, ja? Es würde mich wundern, wenn die Umleitung mit "echo" funktioniert hat. Echo gibt hier ja nur einen klickbaren Link aus und macht sonst garnichts.

Du brauchst da noch irgendwo einen header-Befehl.

Zum Beispiel sowas:

PHP:
function weiter($link) {
    header("Location: $link");
    die(); // keinen Weiteren Code ausführen
}

$url = $_GET['url'];
$url = filter_var($url, FILTER_SANITIZE_URL); // saubermachen
weiter($url);
 
Ja, richtig. Wir haben da wohl bzgl. der Funktion aneinander vorbei geredet, weil unklar war, wo du diese dann überhaupt verwendest.
Der Link muss natürlich nur dort ausgegeben werden, wo der Nutzer auf den Link zur externen Seite klicken soll.
Die Proxy-Seite leitet einfach serverseitig weiter, das funktioniert ohne Link.

Ggf. würde ich überlegen, ob man noch prüft, ob der Link denn tatsächlich so in der DB existiert. Du gibst ja die ID des Eintrags weiter, also könntest du damit die URL abrufen und prüfen, ob diese mit der über GET übergebenen URL übereinstimmt. Nur dann leitest du den User weiter.
Oder du machst gleich eine Datenbankabfrage mit WHERE id = :id && url = :url und wenn dann gar nichts zurückkommt, weißt du, dass der Link so nicht existiert.

Natürlich hat man in beiden Fällen dann zwangsläufig eine Abfrage an die DB zum Finden des Links und eins zum Updaten des Zählers, aber das wäre noch zu verkraften.
Würde halt sicherstellen, dass niemand deinen Proxy für andere Zwecke benutzt.
Großartig schlimm wäre das allerdings auch nicht, weil nichts wirklich passieren kann, sodass ich dir die Entscheidung überlassen würde, ob du das machst oder nicht.
 
@JR Cologne
Danke für deine umfangreichen Erklärungen. Die richtige Weiterleitung der richtigen URL und ID ist nicht das Problem. Habe ich geprüft und wird sauber übergeben. Die Prüfung, ob überhaupt ein Link vorhanden ist erfolgt schon vorher und wenn nicht kann das Skript gar nicht erst aufgerufen werden.
@Mat
Danke für den Hinweis "Codeblock". Ich habe mich noch nicht viel in Foren bewegt.
Noch ein paar Fragen:
PHP:
function weiter($link) {
    header("Location: $link");
    die(); // keinen Weiteren Code ausführen
}

$url = $_GET['url'];
$url = filter_var($url, FILTER_SANITIZE_URL); // saubermachen
weiter($url);
  • Die Funktion heisst weiter($link), in Zeile 8 wird weiter($url) ausgeführt?
  • ich hatte eigentlich die URL vorher schon der Variable $link zugewiesen dann verstehe ich nicht die Zeile 6.
  • Meine php.ini gibt Folgendes aus: Parse error: syntax error, unexpected stringcontent "", expecting "-" or identifier or variable ornumber in /homepages….. on line 35 das wäre hier Zeile 2
Meine Behauptung, dass die Umleitung schon mal fuktioniert hat, kann ich mir nur erklären, dass da was aus dem Cache mit einer anderen Version ausgeführt wurde, kann es aber nicht genau sagen. Ist schon merkwürdig.
 
Zuletzt bearbeitet von einem Moderator:
  • Die Funktion heisst weiter($link), in Zeile 8 wird weiter($url) ausgeführt?
    Ja, in Zeile 1-4 wird die Funktion nur definiert, aber noch nicht aufgerufen. Der URL-Parameter wird vorbereitet und dann in Zeile 8 an die Funktion übergeben
  • ich hatte eigentlich die URL vorher schon der Variable $link zugewiesen dann verstehe ich nicht die Zeile 6.
    Es gibt in der ursprünglichen Version 2 Variablen mit dem Namen $link: 1. die Variable $link = $_GET['url']; und 2. die Variable $link innerhalb der Funktion weiter($link). Die Variable wird überschrieben, und zwar mit sich selbst. Das geht hier noch gut, aber man sollte sich nicht darauf verlassen. Deswegen benutze ich die 2 Unterschiedlichen Namen, um sie klar zu trennen und damit man sofort sieht, welche Variable grad benutzt wird.
  • Meine php.ini gibt Folgendes aus: Parse error: syntax error, unexpected stringcontent "", expecting "-" or identifier or variable ornumber in /homepages….. on line 35 das wäre hier Zeile 2
    Vielleicht gefällt ihm der leere Link nicht, den er übergeben bekommt. Kannst in der weiter-Funktion noch testen, ob er leer ist und nur wenn er nicht leer ist, weiterleiten. Da sollten sowieso noch einige Überprüfungen rein. Wenn unklar ist, was er übergeben bekommt, kannst du den Inhalt ausgeben mit dd($link) oder dd($_GET['url']). (Edit: var_dump statt dd, danke an @JR Cologne ) :oops:
 
Zuletzt bearbeitet:
@allv Am besten zeigst du uns mal dein gesamtes Script der Datei proxy.php.

Bzgl. der Variablen außerhalb und innerhalb der Funktion solltest du dir vielleicht nochmal die Grundlagen zum Geltungsbereich (Scope) der Variablen anschauen. Sehr einfache, anschauliche Erklärung zum Beispiel hier: https://www.w3schools.com/php/php_variables_scope.asp

Bzgl. der Fehlermeldung gehe ich am ehesten von einem Syntax-Fehler aus. Mit einem leeren Link o.ä. sollte das eigentlich nichts zu tun haben, aber erstmal sagt mir die Fehlermeldung auch nichts.

Die Funktion dd() gibt es in PHP standardmäßig nicht, das ist ne Symfony/Laravel-Sache, wie dir wahrscheinlich auch bewusst ist, nur bist du es wahrscheinlich so vom Debuggen gewöhnt, @Mat. :D
Das standardmäßige Äquivalent ist Folgendes, @allv, falls du mal Variablen ausgeben willst:
PHP:
var_dump($link);
die();
 
Zuletzt bearbeitet:
@JR Cologne
du favorisierst mit deinen Hinweisen, für die ich dankbar bin, sicher die Hilfe zur Selbsthilfe. Das ist eine gute Methode, aber ich mit meinen fast 70 Lebensjahren habe erst mal nur das Interesse dieses Projekt am Laufen zu halten. Ich werde kein Webdesigner mehr werden. Hier die Skript-Datei:
PHP:
<?php
$link = $_GET['url'];
$id = $_GET['id'];
$zahl = $_GET['zahl'];

include 'dblog.php';

$zahl++;

$statement = $pdo->prepare('UPDATE Ehrbula SET mitglieder = ? WHERE id = ?');
$statement->execute([$zahl, $id]);

function weiter($link)
{
    header("Location: $link");
    die(); // keinen Weiteren Code ausführen
}
$url = $_GET['url'];
$url = filter_var($url, FILTER_SANITIZE_URL); // saubermachen

weiter($url);

/*   echo $link ."<br>".$id."<br>".$zahl;

var_dump($url);
die();
*/


?>
Die Zeile 23 und 25 zeigen die korrekten Werte. Wenn ich Zeile 21 auskommentiere // kommt von der php.ini keine Fehlermeldung, wenn nicht bezieht sich die Fehlermeldung auf Zeile 15

Warning: Cannot modify header information -headers already sent by (output started at/homepages/.../proxy.php:1) in /homepages/.../proxy.php on line 15
übersetzt:
Warnung:Kopfinformationen nicht ändern - bereits per Kopf gesendete Header (Ausgabegestartet /homepages/.../proxy.php:1) in/homepages/.../proxy.php auf Linie 15

 
@JR Cologne
du favorisierst mit deinen Hinweisen, für die ich dankbar bin, sicher die Hilfe zur Selbsthilfe. Das ist eine gute Methode, aber ich mit meinen fast 70 Lebensjahren habe erst mal nur das Interesse dieses Projekt am Laufen zu halten. Ich werde kein Webdesigner mehr werden.
Sorry, das konnte ich natürlich nicht ahnen. Absolut nachvollziehbar.

Ich denke, dass es insbesondere bei Neulingen relativ wichtig ist, darauf zu achten, dass die Grundlagen einmal strukturiert erlernt werden und man erst anschließend ins "Learning by doing" übergeht.
In deinem Fall mache ich da aber gerne eine Ausnahme.

Zum Code:

Du kannst Zeile 18 löschen und stattdessen in Zeile 19 usw. die Variable $link verwenden. Du hast die URL aus $_GET ja bereits oben in der Variable $link gespeichert.
Oder, wenn du Mat's Vorschlag folgen willst, kannst du die Variable oben in $url umbenennen, dann Zeile 18 entfernen und Zeile 19 so lassen.

Der Syntax-Fehler scheint ja dann verschwunden zu sein?

Den Fehler "headers already sent" habe ich schon erwartet.
Kannst du mal gucken, dass vor <?php definitiv kein Leerzeichen oder sonst was steht.
Zudem würde ich den schließenden Tag ?> am Ende einfach gänzlich entfernen.
Wenn du dann immer noch die Fehlermeldung mit den Headern bekommst, sag nochmal Bescheid.
 
@JR Cologne und @Mat,
Kleine Ursache, große Wirkung. Der Laie sieht oft Probleme wo keine sind.
Euch beiden nochmals herzlichen Dank. Es funktioniert jetzt so, wie ich es wollte und ich bin dazu noch ein klein wenig schlauer geworden. Die Sache mit der Zählung pro Session werde ich auch noch irgendwann hinbekommen, ist aber erstmal nicht so relevant.
Euch beiden noch eine schöne Zeit.
 
Zurück
Oben Unten