kostenloser Webspace werbefrei: lima-city


Problem mit POST-Array

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    m*******t

    Also, als erstes hab ich mal keinen richtigen titel für den thread gefunden, ich hoffe der passt so


    Naja ich programmier ein Browsergame und hab auch schon einiges. Momentan bin ich dabei Allianzen (Gruppen) zu proggen.

    Hier mal der Code und dann mein Problem:

    echo "<form method='post' action='Allianzuser.php?id=$viewaid'><table width='600'>";
    $abfrage = "SELECT id, username, allianzrang FROM user WHERE allianz = '$atag'";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis)) {
        echo "<tr><td>".$row->username."</td>";
        echo "<td><select name='".$row->id."'>";
    		$abfrage2 = "SELECT rang FROM allianzraenge WHERE allianztag = '$atag'";
    		$ergebnis2 = mysql_query($abfrage2);
    		while($row2 = mysql_fetch_object($ergebnis2)) {
    
    			echo "<option value='".$row2->rang."'"; if($row->allianzrang == $row2->rang) { echo "selected='selected'"; } 
    			echo ">".$row2->rang."</option>";
    		}
    	echo "</select></td></tr>";
    }
    echo "</table>";
    echo "<table width='600'><tr><td><br><div align='center'><input type='submit' name='raenge' value=' Einstellungen speichern '></div></td></tr></table>";
    echo "</form>";


    naja bis hierher geht alles so wie ich es will.
    Es werden hier eben alle User die in der Allianz sind, ausgegeben und dahinter ein auswahlmenü mit allen rängen die es gibt.


    Nur jetzt muss ich das ganze in einer Datenbank speichern
    und das Problem dabei ist das ja der name des auswahlmenüs (die Userid) bei jeder Allianz anders ist. Hier mein (fehlgeschlagener) Lösungsvorschlag:

    $result = mysql_query("SELECT id FROM user WHERE allianz = '$atag'");
    while ($row = @mysql_fetch_array($result)) {
    	$select = $_POST['$row->id'];
    	mysql_query("UPDATE user SET allianzrang = '$select' WHERE id = '$row->id'");
    }


    Nur leider erkennt php die variable im POST array nicht. Es kommt keine Fehlermeldung aber es wird auch nichts geändert. Ich hab das Post-array dann mal ausgeben lassen und es war leer. Alle anderen Variablen haben aber einen Wert.


    Ich hoffe ihr hab eine Lösung oder einen Lösungsvorschlag.

    Gruss

    Beitrag zuletzt geändert: 25.2.2009 22:28:27 von moonfight
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. e********l

    Ich würde dem Selectfeld keinen dynamischen Namen geben.
    Soweit ich das verstanden hat sieht man nur die Benutzer einer einzelnen Allianz oder?

    Dann kann der Name des Selectfeldes auch eindeutig sein.
    Zusätzlich kannst du die Selectfelder als Array übergeben
    echo '<td><select name="allianzuser[".$row->id."]>'.PHP_EOL;

    Damit hättest du ein dann nach dem Absenden bei mehreren Benutzern folgendes
    allianzuser[11] => 6
    allianzuser[33] => 1
    allianzuser[9] => 3


    Mit einer Foreach Schleife kannst du über das Array iterieren und die Ergebnisse der Rang Auswahl updaten
    $allianzUsers = $_POST['allianzuser'];
    
    foreach ($allianzUsers AS $key => $val) {
    	mysql_query("UPDATE user SET allianzrang = '".$val."' WHERE id = '".$key."'");
    }


    Hoffe das hilft dir weiter :)

    Beitrag zuletzt geändert: 26.2.2009 9:56:54 von evil-devil
  4. Autor dieses Themas

    m*******t

    :thumb: Perfekt, danke

    genauso wollte ich das, jetzt gehts

    gruss
  5. evil-devil schrieb:
    Mit einer Foreach Schleife kannst du über das Array iterieren und die Ergebnisse der Rang Auswahl updaten
    $allianzUsers = $_POST['allianzuser'];
    
    foreach ($allianzUsers AS $key => $val) {
    	mysql_query("UPDATE user SET allianzrang = '".$val."' WHERE id = '".$key."'");
    }




    Hi,

    der Performance halber, würde ich das ganze erstmal in einen String reischreiben und danach den query machen.

    das ganze könnte dann so aussehen:
    $allianzUsers = $_POST['allianzuser'];
    
    foreach ($allianzUsers AS $key => $val) {
    	$query = "UPDATE user SET allianzrang = '".$val."' WHERE id = '".$key."';";
    }
    mysql_query($query);


    Das hat den Vorteil, dass nicht immer wieder eine neue Verbindung zur Datenbank aufgebaut werden muss, sondern nur einmal, wo dann der ganze Update drinne steht. Vorallem, wenn der MySQL-Server nicht der Game-Server ist, spart das jede Menge Traffic.

    Eine beliebte Fehlerquelle ist allerdings, dass man am Ende des Strings das Semikolon vergisst. Das ist notwenig, da dieses der Trenner zwischen den einzelnen Befehlen in Sql ist.

    Gruß
    Sebell
  6. e********l

    Das macht keinen Unterschied. Die SQL Verbindung wird von PHP solange aktiv gehalten wie das Script läuft. D.h. wenn am Anfang des Scriptes die Verbindung aufgebaut wird, dann kann man während der Ausführung so viele Statements abschicken wie man will. Am Ende der Ausführung schließt man entweder selbst die Verbindung oder lässt PHP das automatisch machen.
  7. evil-devil schrieb:
    Das macht keinen Unterschied. Die SQL Verbindung wird von PHP solange aktiv gehalten wie das Script läuft. D.h. wenn am Anfang des Scriptes die Verbindung aufgebaut wird, dann kann man während der Ausführung so viele Statements abschicken wie man will. Am Ende der Ausführung schließt man entweder selbst die Verbindung oder lässt PHP das automatisch machen.


    Das die Verbindung aktiv gehalten wird, ist klar.

    Aber bei jedem Aufruf von mysql_query wird nachgeprüft, ob diese Verbindung noch aktiv ist, sprich es kommt zu einer Abfrage an den MySQL-Server: "Bist du noch da?" und eine entsprechenden Antwort vom Server.

    Mir wurde zu php4 Zeiten von verschiedenen Leuten gesagt, dass selbst bei 50 Abfragen dieser Effekt schon gut für Traffic sorgt.
    Mit nur einem Query, in dem die ganzen Abfragen gebündelt sind, wird der Traffic massiv reduziert.
    Laut meines Wissenstandes soll man daher bei Seiten, die stark frequentiert werden, das so machen.
    Ist dieses denn falsch, bzw. nicht mehr aktuell?

    MfG
    Sebell
  8. Autor dieses Themas

    m*******t

    ja wär mal interessant da sonst großer traffic entstehen würde.


    Nur wenn ich es so mache wie sebell es sagt dann kommt folgende Fehlermeldung:

    Warning: Invalid argument supplied for foreach() in /home/webpages/lima-city/moonfight/html/Allianz.php on line 75


    gruss

    Beitrag zuletzt geändert: 26.2.2009 13:00:04 von moonfight
  9. e********l

    PHP4...wir schreiben das Zeitalter von PHP 5 bzw. bald PHP 6. Ob noch immer geprüft wird ob die Verbindung aktiv wird weiß ich nicht, aber ich hab bisher keinerlei Leistungseinbußen feststellen können (nutze nur PHP5) bei sehr vielen Queries. Meine Applikationen haben im Durchschnitt 10-30 Queries pro Seitenaufruf. Und über mysql_query kann man AFAIK nur einen einzelnen Query absenden. Mehrere durch Semikolon getrennte Queries geht AFAIK und laut PHP Doku gar nicht. Da bräuchte man schon PDO mit Prepared Statements.

    //edit: Was natürlich sein kann ist, dass nur überprüft wird ob eine Verbindung noch existiert, wenn man das Resource Handle nicht mit übergibt. Aber wer tut das schon? Meine SQL Singleton Klasse übergibt immer ihre Connection Referenz ^^

    Beitrag zuletzt geändert: 26.2.2009 13:27:46 von evil-devil
  10. @evil-devil:
    danke!
    Überzeugt und dankbar angenommen. Nur ich frage mich, warum meine DB Klassen, die auf php5 laufen bei den Updates funktionieren. Muss da wohl mal Sherlock Homes spielen gehen und rausfinden, warum die funktionieren.

    @moonfight und alle anderen:
    Die Antwort von evil-devil ist damit die richtige. Meinen 1. Post kannst du / ihr damit in die Tonne treten.
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!