• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PHP User in Freundesliste abspeichern

Aber um ein neu laden zu verhindern, ist doch Ajax sinnvoller oder nicht
Genau das denke ich nämlich auch. Aktuell wird zwar das Formular abgeschickt, die Seite aber nicht neu geladen was aber auch nicht meine Absicht ist...

Ich wüsste jetzt nur nicht wie ich bei Ajax vorgehen würde wenn sich nur die Button verändern sollen :/
 
Werbung:
Dann erstelle grundsätzlich beide Button und je nach Fall blendest du einen davon aus, das geht ja per CSS/JavaScript
 
Dann erstelle grundsätzlich beide Button und je nach Fall blendest du einen davon aus, das geht ja per CSS/JavaScript

Also quasi nach dem motto, wenn Folgen gedrückt wurde dann zeige Entfolgen und blende Folgen aus ?

Hätte man dann aber nicht das Problem das bei jedem neu Besuch der Seite wieder der alte Button da stehen würde ?
 
Werbung:
okay also ich habe jetzt mal so ein paar Sachen ausprobiert. Leider konnte ich mir nicht so wirklich was unter dem vorstellen was ihr meintet deswegen habe ich mir selbst was einfallen lassen. Was haltet ihr von dieser Möglichkeit ?

Code:
<script>
function myFunc() {
document.getElementById('in1').value='Folgen' ;     
}
</script>

Code:
<form method="post" >
<?php
if ($userid == $user) {
    echo "";
} else {
    
$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root', 'lehar456');
$sql = "SELECT iduser, followed FROM abonennten WHERE iduser ='$userid' and followed = '$user'"; 
$boom = $pdo->query($sql)->fetch();
    if ($boom['iduser'] == $userid && $boom['followed'] == $user) {
       echo '<input onclick="myFunc()" id="in1" class="follow" type="submit" name="Entfolgen" value="Entfolgen">';
      } else  {
        echo '<input class="follow" type="submit" name="Folgen" value="Folgen">';
    }


if ($_POST["Folgen"]) {

$statement = $pdo->prepare("INSERT INTO abonennten (id ,iduser, followed) VALUES (NULL, '$userid', '$user')");
$statement->execute();
}
    
if ($_POST["Entfolgen"]) {
    
    $statement = $pdo->prepare("DELETE FROM `abonennten` WHERE iduser = '$userid' AND followed = '$user'");
    $statement->execute();
}
}
?>
</form>

Also im Prinzip sollte sich der Value Wert des Input Feldes ändern. Ich habe das jetzt erstmal nur für ein Input-Feld gemacht. Rein theoretisch sollte darüber dann auch immer noch die jeweilige POST-Aktion ausgeführt werden. Einziger Haken an der ganzen Geschichte. Der Value Wert ändert sich nicht haha.

Also einmal die Frage ob man das so umsetzen kann wie ich mir das hier vorstelle ?
Und dann die Frage wieso sich der Value-Wert nicht ändert ?
 
Werbung:
Ja, ich glaube schon und ich glaube auch, dass mein Vorschlag die Lösung sein müsste. Wenn man auf Folgen drückt, wird ja offenbar das Formular abgeschickt und die Seite neu geladen. Dann erst den neuen Zustand in die DB eintragen und anschließend den Button generien, dann sollte bei der Generierung der neue Zustand berücksichtigt werden.

Okay also wenn ich deinen Vorschlag richtig verstehe dann löst du das Problem ohne Ajax ? Grundsätzlich würde ich glaube ich eine Umsetzung mit Ajax nicht schlecht finden nur leider fällt es mir schwer dazu einen Code zu schreiben...

Bei deinem Vorschlag stelle ich mir aber eine Frage. Angenommen ich mache es so wie du meinst und Folge jemanden und erst dann werden die Daten beim neu laden der Website eingetragen. Würde es dann auch funktionieren wenn ich jemandem folge und danach direkt wieder entfolge ? Wenn ich dein Vorschlag nämlich richtig verstehe, müsste ich dann ja nämlich immer erst die Seite neu laden bevor ich etwas eintrage oder lösche.

Zu Ajax habe ich mir aber auch Gedanken gemacht. Wir gehen ja von diesem Code aus:

PHP:
<form method="post">
<?php
if ($userid == $user) {
    echo "";
} else {
    
$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root', 'lehar456');
$sql = "SELECT iduser, followed FROM abonennten WHERE iduser ='$userid' and followed = '$user'"; 
$boom = $pdo->query($sql)->fetch();
    if ($boom['iduser'] == $userid && $boom['followed'] == $user) {
       echo '<input id="in1" class="follow" type="submit" name="Entfolgen" value="Entfolgen">';
      } else  {
        echo '<input id="in2" class="follow" type="submit" name="Folgen" value="Folgen">';
    }


if ($_POST["Folgen"]) {

$statement = $pdo->prepare("INSERT INTO abonennten (id ,iduser, followed) VALUES (NULL, '$userid', '$user')");
$statement->execute();
}
    
if ($_POST["Entfolgen"]) {
    
    $statement = $pdo->prepare("DELETE FROM `abonennten` WHERE iduser = '$userid' AND followed = '$user'");
    $statement->execute();
}
}
?>
</form>

Das hier wären meine Ajax versuche:

Code:
<script>

function button() {
        $.ajax({
            url: "Button_change.php",
            data: {imgurl: imgurl},
            type: "POST",
            success: function(input) {
                console.log("Success input = " + input); // kann später auch raus
            },
            error: function( /* Parameter entspr Doku */ ) {}
        })
    }   
$(".follow").on("click", button);
        button();
</script>

Das ist wie gesagt nichts mit Hand und Fuß und macht teils nicht wirklich Sinn. So Frage ich mich bspw. was ich bei data: eintragen müsste. Normalerweise var aber die gibt es bei mir ja nicht...
In der Datei Button_change.php müsste dann ja auch in etwa der selbe PHP-Code stehen den ich schon besitze oder nicht ? (Der über diesem Code)
 
Nachdem ich das Ganze etwas weiter durchdacht habe, kann man das PHP im wesentlichen für beides verwenden, Formular-Submit und Ajax. Ich würde gern versuchen, eine Testseite aufzubauen. Dazu zum Verständnis was Du vor hast: Ein User hat irgendwie eine ID und will einem anderen folgen. Wo kommt der andere her? Gibt es da eine Liste, aus der der erste Benutzer auswählen kann? Oder gibt er den Namen des anderen Users in einem Eingabefeld ein?

Nun ja. Es gibt auf meiner Website einen Bereich in dem alle Uploads, aller User ausgelesen werden. Zusätzlich zu diesen Uploads lese ich auch sämtliche User-Informationen aus. Sobald man auf den Namen eines Users klickt wird dessen ID über die GET-Methode an die nächste Seite übermittelt. In meinem Code ist die ID in der Variable $user gespeichert.

$userid ist dabei die ID des Users der gerade eingelogt ist. Und nun ja egal wie man auf die Seite eines anderen Users kommt. Ich arbeite immer mit der id und der GET-Methode



PS: Ich habe auch gerade mal deinen ersten Vorschlag ausprobiert doch leider wird der neue Zustand nicht wie gedacht angezeigt oder ich habe einfach etwas falsch gemacht :/
 
Ja, ich glaube schon und ich glaube auch, dass mein Vorschlag die Lösung sein müsste. Wenn man auf Folgen drückt, wird ja offenbar das Formular abgeschickt und die Seite neu geladen. Dann erst den neuen Zustand in die DB eintragen und anschließend den Button generien, dann sollte bei der Generierung der neue Zustand berücksichtigt werden.

Wenn ich auch nochmal so richtig darüber nachdenke dann stellt sich mir da ein Frage und zwar gehst du hierbei glaube ich davon aus das grundsätzlich erstmal ein Button "Folgen" erzeugt wird und sonst nichts weiter.

Wird dieser Button betätigt, wird die Seite neu geladen und erst dann fange ich an mit der Datenbank an zu arbeiten...

Doch ich muss ja schon vorher eine Datenbankabfrage mache um abzuchecken ob der User dem anderen nicht bereits folgt.

Also wie gesagt kann auch sein das ich mich irre aber ich mache mir da Gedanken drüber :) Denke mal das Ajax die bessere Wahl wäre ?
 
Werbung:
So, ich habe mal eine Demo gemacht, um zu demonstrieren, wie es gehen kann

Das wäre doch eine schöne Übungsaufgabe für den Einstieg in ein SPA-Framework wie Angular, React oder Vue. ;)

Konzeptionell braucht es erstmal ein simples User-Model mit Namen und Followern. Letztere als Array von IDs, welches sich bei NoSQL-Datenbanken embedden lässt. Du kannst es statt dessen natürlich auch mit SQL und Tables machen.

Push ein paar User in die Datenbank und rendere die im HTML als Card-Boxen. Im Template legst du für die Card beide Buttons - Folgen und Entfolgen - an. Welcher davon gerendert wird, hängt von Status-Variablen ab, die beim Klick auf true oder false gesetzt werden.
 
Verbesserungsfähig:
1. Den Button statisch lassen und nur Value und HTML austauschen, dann muss nur einmal der Eventlistener registriert werden.
2. Ist eine Aktion gesetzt braucht die Datenbank nicht abgefragt zu werden, weil man ja schon weiß, welchen Zustand der Button haben muss.

Also dazu habe ich eine Frage. Grundsätzlich ist das ja wirklich eine Menge Code dafür das nur der Value-Wert eines Buttons geändert werden soll und ich suche eine relativ einfache Lösung. Ich werde mir deinen Code heute Abend noch im Detail anschauen. Dein erster Punkt ist jedoch interessant denn etwas ähnliches habe ich mir auch gedacht...

Ist es nicht einfacher das ganze so zu lösen wie ich bereits schon mal vorgeschlagen habe ? Über diesen Code:

Code:
<script>
function myFunc() {
document.getElementById('in1').value='Folgen' ;    
}
</script>

Code:
<form method="post">
<?php
if ($userid == $user) {
    echo "";
} else {
   
$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root', 'lehar456');
$sql = "SELECT iduser, followed FROM abonennten WHERE iduser ='$userid' and followed = '$user'";
$boom = $pdo->query($sql)->fetch();
    if ($boom['iduser'] == $userid && $boom['followed'] == $user) {
       echo '<input onclick="myFunc()" id="in1" class="follow" type="submit" name="Entfolgen" value="Entfolgen">';
      } else  {
        echo '<input id="in2" class="follow" type="submit" name="Folgen" value="Folgen">';
    }


if ($_POST["Folgen"]) {

$statement = $pdo->prepare("INSERT INTO abonennten (id ,iduser, followed) VALUES (NULL, '$userid', '$user')");
$statement->execute();
}
   
if ($_POST["Entfolgen"]) {
   
    $statement = $pdo->prepare("DELETE FROM `abonennten` WHERE iduser = '$userid' AND followed = '$user'");
    $statement->execute();
}
}
?>
</form>

Zugegeben. Aktuell will es nicht funktionieren das sich der Value-Wert des Input-feldes ändert, aber grundsätzlich muss das doch so möglich sein ?
Ich meine letztendlich reicht es ja wenn sich der Value-Wert nach betätigen verändert und dabei trotzdem eine Aktion ausgeführt wird.

In diesem Zusammenhang habe ich auch etwas ähnliches im Netz gefunden. Wäre das nicht etwas was für mich auch in Frage kommen würde ?
Code:
<input name="blah" onchange="mainInfo(this.value);">

Code:
function mainInfo(id) {
    $.ajax({
        type: "GET",
        url: "dummy.php",
        data: "mainid =" + id,
        success: function(result) {
            $("#somewhere").html(result);
        }
    });
};

Code:
<?php
    if(isset($_GET['mainid'])){
        mainInfo($_GET['mainid']);
    }
?>


Wie gesagt am liebsten wäre mir ein Code der den Value-Wert ändert und trotzdem eine Funktion ausführt :) und dabei aus Interesse die Frage wieso das nicht schon bei meinem gepusteten Code funktioniert ?
 
Also ich habe mir jetzt mal deinen Code genauer angeschaut und dabei haben sich bei mir ein paar Fragen ergeben..

Code:
Benutzer: u Folgen:
        <select id="users">
            <option value="a" selected>a</option>
            <option value="b">b</option>
            <option value="c">c</option>
            <option value="d">d</option>
            <option value="e">e</option>
        </select>
        <div id="button" ></div>

Ich verstehe diesen Part nicht ganz. Warum habe ich ein Auswahlfeld, zudem das ganze was ich da ausgewählt habe ja auch nicht in follow.php wieder aufgegriffen wird oder übersehe ich das einfach. Also schon klar das dass ganze zum teste dient aber wo werden diese Informationen aufgegriffen ?

Verstehe ich das richtig das in #button dann der jeweilige Button ausgegeben werden soll ?

In dem anderen Code den du gepostet hattest stand etwas von include("Connect.php"). Soll das die $pdo sein ?

Dann werden in deinem Code auch diese beiden Variablen gar nicht definiert, hast du das so gelassen weil das bei mir der Fall ist ?
$userid = $_GET['userid'];
$user = $_GET['user'];



Denke aber das wir auf einem guten Weg sind :D
 
Werbung:
Habe das ganze mal eben in meinem Code ausprobiert und folgende Probleme sind aufgetreten. Ich bin auf die Seite eines Users gegangen dem ich bereits folge. Trotzdem wurde ein Button mit "Folgen" ausgegeben. Als ich dann einfach mal drauf geklickt habe kam folgender Fehler:

Notice: Undefined index: user in [...] on line 5

das heißt das die Daten $user = $_GET['user']; nicht richtig übermittelt werden. Wie müsste ich das in den Ajax Code schreiben damit genau das passiert ?
 
Ja aber das verunsichert mich jetzt ein wenig. Trotzdem brauche ich die SELECT Anweisung in follow.php oder nicht ? Das mit der Connect.php Datei habe ich bereits gelöst und die $pdo einfach in die follow.php Datei geschrieben.

So und jetzt zum letzten:
Code:
folgenajax({ userid: "u", user: "a" });
            $("#users").on("change", function () {
                var usr = $("#users option:selected").val();
                folgenajax({ userid: "u", user: usr });
            });

hier drin definiere ich $user richtig ? Nun ist es ja so das ich #users gar nicht habe. Also dachte ich mir das ich das ganze einfach mal so mache:

Code:
folgenajax({ userid: "u", user: "a" });
            $user.on("change", function () {
                var usr = $user.val();
                folgenajax({ userid: "u", user: usr });
            });

Das ändert aber nichts. Weiter oben im Script sind die Variablen
$userid = $_GET['userid'];
$user = $_GET['user'];

ja definiert. Also habe ich alles dahingehend nochmal geändert:

Code:
<script>
            function folgenajax(dat) {
                $.ajax({
                    url: "follow.php",
                    data: dat,
                    type: "GET",
                    success: function(output) {
                        console.log("Success input = " + output); // kann später auch raus
                        $("#button").html(output);
                        $(".follow").on("click", function () {
                            var usr = $user.val();
                            var data = { userid: $userid, user: usr, action: $(this).val() };
                            folgenajax(data);
                        });
                    },
                    error: function( /* Parameter entspr Doku */ ) {}
                })
            }
            folgenajax({ userid: $userid, user: usr });
            $user.on("change", function () {
                var usr = $user.val();
                folgenajax({ userid: $userid, user: usr });
            });
        </script>

Aber es hilft auch nichts. Wahrscheinlich ist mein Vorgehen auch falsch ?
 
Werbung:
Höchstwahrscheinlich nicht. Nur leider weiß ich nicht, wo Du den User, dem gefolgt/entfolgt werden soll, her bekommen kannst. Du musst doch in irgend einer Form ein Liste von Usern haben, aus denen der eingelogte auswählen kann? Wenn er das tut, musst Du den Ajax-Request absetzen, um den richtigen Zustand des Buttons einzustellen.

Also es gibt auf meiner Website einen Bereich auf dem alle Uploads aller user ausgelesen werden. Zusätzlich wird zu den Uploads auch der Name des Users ausgelesen der ein jeweiliges Bild hochgeladen hat. Um den Benutzernamen eines Users, findet sich folgendes Tag:

<a href=Profilline_Test.php?user=".$row['id'].">".$row['benutzername']."<a>

So komme ich auf die im a-Tag angegeben Seite. Wie du siehst lasse ich mir dabei die id des jeweiligen Users mit übermitteln. Deswegen bin ich der Meinung das ich die SELECT Anweisung benötige.

in der Datei Profilline_Test.php befindet sich jetzt der Ajax-Request. Ganz oben in Profilline_Test.php sind
$userid = $_GET['userid'];
$user = $_GET['user'];

definiert.
 
  • <a href=Profilline_Test.php?user=".$row['id'].">".$row['benutzername']."<a>

  • <div class="button" data-user="<?php echo $row['id']; ?>"></div>
Okay also ich muss zugeben das ich ein wenig verwirrt bin. Wieso brauche ich diesen Button ? Der wäre nämlich ein wenig störend im Rest des Codes...

Habe das jetzt so gemacht:
Code:
<a href=Profilline_Test.php?user=".$row['id']." style:'font-weight: normal; data-user='".$row['id']."''>

Code:
<script>
            function folgenajax(dat) {
                $.ajax({
                    url: "follow.php",
                    data: dat,
                    type: "GET",
                    success: function(output) {
                        console.log("Success input = " + output); // kann später auch raus
                        $("#button").html(output);
                        $(".follow").on("click", function () {
                            var usr = $(this).data("data-user");
                            var data = { userid: $userid, user: usr, action: $(this).val() };
                            folgenajax(data);
                        });
                    },
                    error: function( /* Parameter entspr Doku */ ) {}
                })
            }
            folgenajax({ userid: "29", user: "32" });
      
        </script>

Ich habe ganz unten die Zahlen manuell eingegeben. So folgenajax({ userid: $userid, user: "usr }); funktioniert es leider nämlich nicht.

Code:
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
$userid = $_GET['userid'];
$user = $_GET['user'];
var_dump($user);
var_dump($userid);
if (isset($_GET['action'])) $action = $_GET['action']; else $action = "";
 
if ($action == "Folgen") {
    $statement = $pdo->prepare("INSERT INTO abonnenten (iduser, followed) VALUES ('$userid', '$user')");
    $statement->execute();
}
 
if ($action == "Entfolgen") {
    $statement = $pdo->prepare("DELETE FROM `abonnenten` WHERE iduser = '$userid' AND followed = '$user'");
    $statement->execute();
}
 
$pdo = new PDO('mysql:host=localhost;dbname=Datenbank_NEU', 'root', 'lehar456');
$sql = "SELECT iduser, followed FROM abonennten WHERE iduser ='$userid' and followed = '$user'";
//var_dump($sql);
//var_dump($pdo->query($sql));
$result = $pdo->query($sql)->fetchAll();
if(count($result) == 0) {
    echo '<input class="follow" type="button" name="Folgen" value="Folgen">';
} else  {
    echo '<input class="follow" type="button" name="Entfolgen" value="Entfolgen">';
}
?>

Und siehe da. Der Button erkennt schon mal ob ich einem User folge oder nicht. Jedoch ist der Button ohne Funktion so das leider nichts passiert wenn man drauf klickt. Wie müsste ich das denn richtig schreiben ?

Also letztendlich ist doch von vornherein bekannt welcher User gemeint ist. Durch den a-Tag ganz oben wird doch zu jedem einzelnen User ermittelt welche ID gehört. Diese muss ich einfach nur weiter geleitet bekommen oder nicht...

Dann verstehe ich auch nicht wieso ich den Code verwenden soll. Das ganze wird zwar an sich richtig ausgelesen aber ich kann da ja auf gar nichts drauf klicken weil kein Button oder ähnliches erzeugt wird:
Code:
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
include("connect-local.php");
$userid = $_GET['userid'];
$user = $_GET['user'];
if (isset($_GET['action'])) $action = $_GET['action']; else $action = "";

switch ($action) {
    case "Folgen":
        $statement = $pdo->prepare("INSERT INTO abonnenten (iduser, followed) VALUES ('$userid', '$user')");
        $statement->execute();
        echo "Entfolgen";
        break;
    case "Entfolgen":
        $statement = $pdo->prepare("DELETE FROM `abonnenten` WHERE iduser = '$userid' AND followed = '$user'");
        $statement->execute();
        echo "Folgen";
        break;
    default:
        $sql = "SELECT iduser, followed FROM abonnenten WHERE iduser ='$userid' and followed = '$user'";
        $result = $pdo->query($sql)->fetchAll();
        if(count($result) == 0) {
            echo 'Folgen';
        } else  {
            echo 'Entfolgen';
        }
}
?>
 
Zuletzt bearbeitet:
Werbung:
Hat jemand ne Idee woran das liegen könnte ? Wieso lassen sich userid und user nicht übergeben ?

PS: Also ich bin gerade die ganze Zeit am testen und es scheint als wenn der Button definitiv schon mal erkennt ob einem User bereits gefolgt wird oder eben nicht. Nur der Klick darauf ist noch ohne Funktion und somit ändert sich auch nicht der Value-Wert des Input-Feldes/Buttons
 
Zuletzt bearbeitet:
Das liegt wahrscheinlich daran, dass Du noch keinen Eventlistener registriert hast. Sieh dir den zweiten Codeabschnitt in Posting #47 an.

Stimmt du hattest recht, Ich habe den Eventlistener hinzugefügt doch leider ist das ganze immer noch ohne Funktion. Ich verstehe das nicht. Der Button erkennt offensichtlich ob einem User bereits gefolgt wird oder nicht. Es fehlt nur noch das sich auch der Inhalt des Buttons ändert....

Das ganze sieht jetzt so aus:

Code:
<script>
            function folgenajax(dat) {
                $.ajax({
                    url: "follow.php",
                    data: dat,
                    type: "GET",
                    success: function(output) {
                        console.log("Success input = " + output); // kann später auch raus
                        $("#button").html(output);
                        $(".follow").on("click", function () {
                            var usr = $(this).data("data-user");
                            var data = { userid: $userid, user: usr, action: $(this).val() };
                            // bei userid musst Du die ID des Benutzers eintragen, der gerade eingeloggt ist
                            folgenajax(data);
                        });
                        $(".follow").trigger("click");
                    },
                    error: function( /* Parameter entspr Doku */ ) {}
                })
            }
            folgenajax({ userid: "29", user: "32" });
           
        </script>

Passt das soweit und der Fehler liegt eher in der follow.php oder habe ich hier noch etwas übersehen ?
 
Zurück
Oben