Avatar billede clausvintherlarsen Nybegynder
14. september 2005 - 22:06 Der er 9 kommentarer og
1 løsning

Opdatering af mange poster i Database på en gang

Jeg har en database hvor i jeg har listet små 150 brugere. Jeg har rimelig ofte brug for at opdatere informationer for mange brugere på en gang, og har derfor lavet en formular der lister samtlige brugere, samt de nuværende værdier i databasen skrevet ud i input felter i en formular:

http://stabilt.kicks-ass.org/amberlight/guild/AddARPPoints.php

Koden bag formularen ser således ud:

// Fetches all users from Roster Table
$BrugerQuery = mysql_query("SELECT * FROM members ORDER BY class ASC, name ASC");

?>

<HEAD>
    <link rel="stylesheet" href="stylesheet.css" type="text/css">
</HEAD>



<form action="<?PHP echo("$PHP_SELF?Step=UPDATE");?>" name="Pointlist" method="Post" enctype="multipart/form-data">
   
<table width="600" cellspacing="0" cellpadding="0">
    <tr>
        <td width="100"><span class="Text"><b>Name</b></span></td>
        <td width="80"><span class="Text"><b>Class</b></span></td>
        <td width="110"><span class="Text"><b>Class Points</b></span></td>
        <td width="110"><span class="Text"><b>Hybrid Points</b></span></td>
        <td width="200"><span class="Text"><b>Custom Note</b></span></td>
    </tr>



<?PHP
while($BrugerRow = mysql_fetch_array($BrugerQuery))
    {
        echo("<tr>");
            echo("<td><span class=\"Text\">$BrugerRow[name]</span></td>");
            echo("<td><span class=\"Text\">$BrugerRow[class]</span></td>");
            echo("<td><input type=\"text\" name=\"cp$BrugerRow[member_id]\" value=\"$BrugerRow[cp]\" class=\"TekstFelt\"></td>");
            echo("<td><input type=\"text\" name=\"hp$BrugerRow[member_id]\" value=\"$BrugerRow[hp]\" class=\"TekstFelt\"></td>");
            echo("<td><input type=\"text\" name=\"customnote$BrugerRow[member_id]\" value=\"$BrugerRow[customnote]\" class=\"TekstFelt\"></td>");
        echo("</tr>");
       
    }

?>

<tr>
    <td valign="top"></td>
    <td valign="top"><input type="submit" value="Update Points" class="AnsogKnap"></td>
    <td valign="top"></td>
</tr>
   
</table>

</form>


Jeg har sørget for at hvert felt har et navn der refererer til bruger ID'et.



Tabellen i MySQL databasen er konstrueret således:
CREATE TABLE `members` (
  `member_id` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(64) NOT NULL default '',
  `guild_id` int(11) unsigned NOT NULL default '0',
  `class` varchar(32) NOT NULL default '',
  `cp` int(9) NOT NULL default '0',
  `hp` int(9) NOT NULL default '0',
  `customnote` text NOT NULL,
  `level` int(11) NOT NULL default '0',
  `note` varchar(255) NOT NULL default '',
  `guild_rank` int(11) default '0',
  `guild_title` varchar(64) default NULL,
  `officer_note` varchar(255) NOT NULL default '',
  `zone` varchar(64) NOT NULL default '',
  `group` varchar(16) NOT NULL default '',
  `online` int(1) default '0',
  `last_online` datetime default NULL,
  `update_time` datetime default NULL,
  PRIMARY KEY  (`member_id`),
  KEY `member` (`guild_id`,`name`),
  KEY `name` (`name`),
  KEY `class` (`class`),
  KEY `level` (`level`),
  KEY `guild_rank` (`guild_rank`),
  KEY `last_online` (`last_online`)
) TYPE=MyISAM AUTO_INCREMENT=260 ;




Mit problem er at få scriptet til at gennemløbe formularen, samt at opdatere posterne cp, hp og customnote for hver enkelt bruger.


Er der nogen der kan vise mig hvordan jeg kan gøre dette?
Avatar billede jakobdo Ekspert
14. september 2005 - 22:27 #1
Du kan ikke opdatere flere felter samtidig, hvis ikke de skal have sat samme værdi!
F.eks. alle skal have hp = "www.exp.dk" kan godt lade sig gøre.
Men vil du opdatere mange felter til samme værdi, eller mange felter til forskellige værdier?
Avatar billede clausvintherlarsen Nybegynder
15. september 2005 - 06:10 #2
Jeg ved du kan lave et gennemløb af alle felter og værdier i en formular. Informationerne står i en form for array så vidt jeg husker. Dvs. Det er muligt at hive informationer from i stil med:

cp124 = 2000
hp124 = 1800
customnote124 = Hej med dig

cp125 = 1200
hp125 = 1900
customnote125 = Hej

Problemet er at jeg ikke kan huske hvordan jeg kan komme frem til de informationer.



Hvis jeg kunne komme frem til de informationer ville det da være muligt at lave et gennemløb af alle felterne, splitte navnet på feltet, derved få oplysning om hvilket felt der skal opdateres i databasen, samt ved hvilket bruger_id det skal opdateres, og med hvilken værdi.


Jeg skal altså opdatere mange felter til forskellige værdier!
Avatar billede jakobdo Ekspert
15. september 2005 - 08:13 #3
For at danne et hurtigt overblik, kunne du poste alle data til filen: debug.php
Den fil skal så indeholde:
<?php
echo "<pre>";
print_r($_POST);
echo "</pre>";
?>

Så kan vi lige kigge hvordan din struktur er.
Avatar billede clausvintherlarsen Nybegynder
15. september 2005 - 16:24 #4
Det er lige det jeg er ude efter ;)

Den array som alle informationer ligger i hedder så altså $_POST


Så skal jeg bare have sorteret og gennemløbet alle informationerne...

Link til info:
http://stabilt.kicks-ass.org/amberlight/guild/debug.php
Avatar billede jakobdo Ekspert
15. september 2005 - 18:48 #5
Du kan sortere et array med www.php.net/sort
(i det er der link til andre sorterings funktioner, men det kommer helt an på hvordan du ønsker rækkefølgen)

Du kan gennemløbe dit array med:

foreach($_POST as $felt)
{
echo $felt . "<br>";
}
Avatar billede clausvintherlarsen Nybegynder
15. september 2005 - 22:01 #6
Thanks! Har fået løst problemet nu!...

Svar, og du skal få point ;)
Avatar billede jakobdo Ekspert
15. september 2005 - 22:06 #7
Et svar!
Kan du vise lidt kode, så jeg kan se hvad du endte med at løsning?
Avatar billede clausvintherlarsen Nybegynder
15. september 2005 - 22:24 #8
// Controls the number off curent users in the database
            $BrugerQuery = mysql_query("SELECT * FROM members ORDER BY class ASC, name ASC");

            while($BrugerRow = mysql_fetch_array($BrugerQuery))
                {
                    // Laver variabler til indhenting af info
                    $BrugerID = $BrugerRow[member_id];

                    // Henter info om den pågælende bruger
                    $cpUpdate = $_POST["cp".$BrugerID];
                    $hpUpdate = $_POST["hp".$BrugerID];
                    $CustomNote = $_POST["customnote".$BrugerID];
                   
                    // Opdaterer databasen
                    mysql_query("UPDATE members SET cp = '$cpUpdate' , hp = '$hpUpdate' , customnote = '$CustomNote' WHERE member_id = '$BrugerID'") ;
                   
                   
                   
                   
                }
Avatar billede jakobdo Ekspert
15. september 2005 - 22:28 #9
Smart!
Dog synes jeg du burde tjekke om data er ens i:
$BrugerRow['cp'] == $_POST["cp".$BrugerID];
$BrugerRow['hp'] == $_POST["hp".$BrugerID];
$BrugerRow['customnote'] == $_POST["customnote".$BrugerID];
Er alle 3 ens, så lad hver med at opdater.
Avatar billede jakobdo Ekspert
16. september 2005 - 16:16 #10
Takker for point!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester