19. februar 2004 - 22:24Der er
75 kommentarer og 1 løsning
opdatere tabel med data fra en form
Problemer med at opdatere tabel.
Jeg logger ind via et login system og det kører. Add.php indeholder en dropdown boks hvori man kan vælge spilleren (fra db) der skal opdaters data omkring:
----- add.php -----
<?php require('tjeklogin.php'); ?>
<title>Opdater spillerdata</title>
<b>Status:</b> <?php echo $_SESSION['Status']; ?><br /> <div class="overskrift">Opdater data for seneste kamp</div><br /> <br>
<?php require 'include.php'; // Forbindelse til database $res = mysql_query("select navn from spillere"); $opt = "<select name='navn' size='1'>"; while ($row = mysql_fetch_row($res)) { $opt .= "<option value='".$row[0]."'>".$row[0]."</option>"; } $opt .= "</select>"; ?>
mysql_query("UPDATE spillere SET kampe_dbu=kampe_dbu+$kampe_dbu, maal_dbu=maal_dbu+$maal_dbu, kampe_cup=kampe_cup+$kampe_cup, maal_cup=maal_cup+$maal_cup, kampe_friendly=maal_friendly+$maal_friendly, kampe_indoors=kampe_indoors+$kampe_indoors, maal_indoors=maal_indoors+$maal_indoors, gule=gule+$gule, roede=roede+$roede, ol=ol+$ol, stemmer=stemmer+$stemmer WHERE navn='$_POST[navn]'") or die ("Af en eller anden årsag blev der ikke opdateret");
echo 'Data er opdateret'; ?>
Jeg har prøvet at indtaste lidt data i add.php og opdater.php skriver dette ud: array(10) { ["kampe_dbu"]=> string(1) "1" ["maal_dbu"]=> string(1) "2" ["maal_friendly"]=> string(0) "" ["gule"]=> string(1) "2" ["roede"]=> string(1) "2" ["maal_indoors"]=> string(0) "" ["ol"]=> string(1) "2" ["stemmer"]=> string(1) "2" ["maal_cup"]=> string(0) "" ["send"]=> string(7) "Opdater" } Af en eller anden årsag blev der ikke opdateret
1) I hele din UPDATE sql, bruger du $kampe_dbu osv. når du opdaterer, men hvis de er sendt fra en form med metoden POST, skal du tilgå dem i de superglobale array $_POST.
Variablen $kampe_dbu skal altså ændres til $_POST[kampe_dbu] og så frem deles for alle variabler der er kommet gennem formen. (Under altagelse af at du ikke har tildelt de variable du bruger fra $_POST, så som : $kampe_dbu = $_POST)
2) Nej, det er ok at skrive det sådan som du har gjort!
1) erstat din OR DIE ("Af en eller anden årsag ...") med OR DIE ("Der er sket noget forkert :(" . mysql_error()); Så vil du få en fejlmeddelse plus fejlen!
2. som tefcke siger er det lige meget - men lær det, MySQL er sart over for nogle navne til variabler, så omringer du dem med `` er det ikke noget problem!
Og tefcke - hvis man alligevel skal bruge $_POST og virkelig lave korrekt PHP, hvorfor er det så lige meget med korrekt MySQL?
Der ikke noget der hedder korrekt php, der er mange måder at gøre den samme ting på, nogen mere elegante, og andre mere effiktive. F.eks giver tekststrenge med doublequotes en mulighed for at indsætte variable direkte, og variable vil blive tolket som variable. Det giver en klar læslig fordel frem for at konkatenerer tekststrenge med variable. Jeg ved ikke om det er mere korrekt at bruge ` uden om dine kolonne navne, men det er klart at det kan forvirre databasen, hvis man begynder at bruge reserverede ord som kolonne navne eller tabel navne.
Men lige netop i de felter kappel opdaterer er der ikke noget som tyder på et sådant overlap, så hvorfor komplicerer det med alle de backticks, hvor man nemt kan komme til at glemme at afslutte et!
Men under alle omstændighedder, så har jeg aldrig nogen sinde brugt backticks i sql, og jeg har aldrig haft nogen problem ved det (ud over de rent konstruktions mæssige), så hvis du kan finde et sted hvor der står det er mere korrekt at bruge dem, så er jeg overbevist :)
Halvt nede, under tabellen står der: "An identifier may be quoted or unquoted. If an identifier is a reserved word or contains special characters, you MUST quote it whenever you refer to it."
Så det er vel "korrekt" nok at undlade backticks (så længe man ikke har med reserverede ord at gøre)
Mit budskab er at det mest korrekt for nye PHP-programmører at bruge det. For fire år siden fattede jeg ikke hvorfor jeg fik fejl i en mysql_query - det var så pga. et felt "order" fx. Ved at gøre det til en vane, en gode vane, at skrive ` rundt om er du sikker på det virker :) Og at det ikke er derfor - men jeg indrømmer da gerne jeg kun skriver det selv, når jeg arbejder for andre, eller hvis jeg laver større scripts
Nu er "order" jo også et reserveret ord ;) Men ja, nogen gange kan det have sine fordele at bruge backticks rundt om alle henvisninger, men efter min mening burde det undgås, for der er jo en grund til at det kaldes et reserveret ord :) Men en smags sag, det er det (for det meste)!
Nok om korrekthed af querys og php kode, den diskussion kan man tage andetsteds, lad os fokusere på at få hjulpet kappel, det er derfor vi er her.
You have an error in your SQL syntax near 'maal_cup=maal_cup+,kampe_friendly=kampe_friendly+,maal_friendly=maal_friendly+,k' at line 1
her er koden jeg bruger:
<?php require('tjeklogin.php'); ?>
<?php
include('include.php');
mysql_select_db($database, $db);
mysql_query("UPDATE spillere SET kampe_dbu=kampe_dbu+{$_POST['kampe_dbu']},maal_dbu=maal_dbu+{$_POST['maal_dbu']},kampe_cup=kampe_cup+{$_POST['kampe_cup']},maal_cup=maal_cup+{$_POST['maal_cup']},kampe_friendly=kampe_friendly+{$_POST['kampe_friendly']},maal_friendly=maal_friendly+{$_POST['maal_friendly']},kampe_indoors=kampe_indoors+{$_POST['kampe_indoors']},maal_indoors=maal_indoors+{$_POST['maal_indoors']},gule=gule+{$_POST['gule']},roede=roede+{$_POST['roede']},ol=ol+{$_POST['ol']}, stemmer=stemmer+{$_POST['stemmer']} WHERE navn='{$_POST['navn']}'") or die (mysql_error());
mysql_query("UPDATE spillere SET kampe_dbu=kampe_dbu+".$_POST['kampe_dbu'].",maal_dbu=maal_dbu+".$_POST['maal_dbu'].",kampe_cup=kampe_cup+".$_POST['kampe_cup'].",maal_cup=maal_cup+".$_POST['maal_cup'].",kampe_friendly=kampe_friendly+".$_POST['kampe_friendly'].",maal_friendly=maal_friendly+".$_POST['maal_friendly'].",kampe_indoors=kampe_indoors+".$_POST['kampe_indoors'].",maal_indoors=maal_indoors+".$_POST['maal_indoors'].",gule=gule+".$_POST['gule'].",roede=roede+".$_POST['roede'].",ol=ol+".$_POST['ol'].", stemmer=stemmer+".$_POST['stemmer']." WHERE navn='".$_POST['navn']."'") or die (mysql_error());
har denne linje noget at sige i forhold til fejlen? add.php: <input name="send" type="submit" value="Opdater">eller er det rigtig nok. Kan du ellers se hvad der er galt?
Det ser om som om der ikke kommer noget gennem dit $_POST array, lav en: var_dump($_POST); der hvor du sender formen til, så vil du kunne se om dine værdier du har indtastet i formen, rent faktisk kommer med!
kappel >> ok, det er jo heller ikke så godt. Som du kan se i det array, så er der op til flere entrys som er tomme (bla. maal_friendly, maal_indoors og maal_cup). Det er derfor den brokker sig over din mysql query. Det er nemlig syntaktisk forkert (når de tomme variable indsættes) når der står: maal_cup = maal_cup + ,
Der er to løsninger, enten så skal alt du vil opdaterer i din sql query have én værdi, eller også skal du kontruerer din sql query ud fra om der er data i dine variable.
Sådan, det skulle klare problemet med dine tomme variable. Vær lige opmærksom på at navnet på den spiller du skal opdateres ikke kommer gennem din form. Jeg ved, ikke hvor du får navnet fra, men det ved du nok selv :) (Jeg kan se at du i siden som du sender fra (add.php) bruger $opt som spiller navn. Du kan så evt. lave et hidden input felt ex.: <input type="hidden" name="navn" value="<?php echo $opt;?>" /> så kan du nemlige bruge $_POST['navn'] i din WHERE i sql sætningen!
Jeg henter navn på spilleren fra tabellen i db vha: <?php require 'include.php'; // Forbindelse til database $res = mysql_query("select navn from spillere"); $opt = "<select name='navn' size='1'>"; while ($row = mysql_fetch_row($res)) { $opt .= "<option value='".$row[0]."'>".$row[0]."</option>"; } $opt .= "</select>"; ?>
hvad skal jeg så gøre med add.php? og stadig bruge hidden?
mtrolle > Det kan han vel ikke hvis nogen af de ting han har liggende i sit POST array er tomme variable! Han er nød til at konstruerer sin query ud fra hvad der er postet!
mtrole >> jeg aner det faktisk ikke! For hvis nu felt er af typen integer, hvordan opdaterer man så : nummer = nummer + ''? tal = tal + en tom streng?!? Giver det mening? Hvad vil sql mene om en sådan sammensætning? Laver den implicit type konvertering af '' til 0 eller noget andet? har faktisk aldrig prøvet det før!
og så viser du lige hvad den skriver når den exiter på opdater.php (bare lad som om du var ved at opdaterer din database normalt, vil nemlig godt se hvordan din query kommer til at se ud!)
Det ser ud til at virke. Jeg har testet lidt og mener ikke jeg kan tilføje værdier til felter som har værdien NULL, kan det passe? Nu skal bare have lavet et eller andet så man kan tjekke der bliver opdateret og samtidig få vist de nye data for spilleren, tror du det kan lade sig gøre?
Jeg går i seng, skal tidligt op, men er på imorgen ved 9 tiden, så kigger jeg lige om du et forslag :-) Sov godt og ha det munter /kappel
Du har da lavet dine felter i databasen som en form for integer type, med en default værdi = 0?
Kan ikke se hvor NULL skulle komme ind i billedet henne!
Du kan vel bare i det du har opdaterert (efter mysql_query()) lave en: header("Location: opdater.php?res=ok");
Så bliver du sendt tilbage til der hvor du opdaterer fra. Så kan du der udskrive at nu er spilleren blevet opdateret, samtidig med at man er klar til at opdaterer endnu en spiller!
Hvis noget går galt på opdater.php, så stopper udførelsen af scriptet. Så skal du nok bare i else delen af bunden af opdater.php skrive noget ala: exit("<p>No data supplied, cant update!</p>");
her er tabellen: (har prøvet at få hjælp tl at dele den op i 2 eller 3, men forgæves, synes godt nok den er stor, ved du om det betyder noget mht. hastighed? der bliver indsat 18 spillere.
Hvad betyder: header("Location: opdater.php?res=ok"); ?
-------- Hvis noget går galt på opdater.php, så stopper udførelsen af scriptet. Så skal du nok bare i else delen af bunden af opdater.php skrive noget ala: exit("<p>No data supplied, cant update!</p>");
Det er skrevet allerede med:
} else { // Nothing to update! echo 'ERROR : Nothing to update!'; }
den skriver: Warning: Cannot add header information - headers already sent by (output started at /customers/kappels.net/kappels.net/httpd.www/eif/kamp/opdater.php:5) in /customers/kappels.net/kappels.net/httpd.www/eif/kamp/opdater.php on line 38
når opdater.php ser spdan ud: mysql_query($sql) or die( mysql_error() ); echo "Spilleren {$_POST['navn']} er blevet opdateret!"; header("Location: opdater.php?res=ok"); } else { // Nothing to update! echo 'ERROR : Nothing to update!'; } ?>
Konklusion: Der er noget galt, når værdien er NULL. Jeg prøvede nemlig lige at tilføje værdier vha PHPMYADMIN til navnet Mads (var tom før, bestod af NULL værdier) brugte så bagefter add.php og opdater.php og kunne den godt opdatere felterne i Mads
Ligeledes tilføjede jeg en værdi til Mikkel for roede (med phpmyadmin) og bagefter kunne den godt opdateres vha add.php og opdater.php?
Jeg ved ikke hvordan den reagerer når du prøver at opdaterer et INT felt som har værdien INT: felt = felt + 2 --> hvis felt så er NULL: felt = NULL + 2!?! Hvis din default værdi så havde været 0 i stedet, så ville det give mening. felt = felt + 2 --> flet = 0 + 2!
Ang. det med header fejlen, så må man ikke udskrive noget før man bruger sin header(). Det gør du jo nemlig lige før den! echo "Spilleren {$_POST['navn']} er blevet opdateret!"; // Ulovligt med header() header("Location: opdater.php?res=ok");
Du kan bruge header til at sende folk til en given side. Her bruger jeg den til at sende folk tilbage til add.php når databasen er blevet opdateret!
Ang. header: Så skal jeg bare bytte om på: echo "Spilleren {$_POST['navn']} er blevet opdateret!"; // Ulovligt med header() header("Location: opdater.php?res=ok");
til header("Location: opdater.php?res=ok"); echo "Spilleren {$_POST['navn']} er blevet opdateret!";
?
nej det skal jeg ikke, har lige prøvet og den melder fejl!
hvis du bruger header(), så sender den dig bare vidre til den side du angiver i header(). Man kan altså ikke skrive noget ud, når man bruger header(), det må du leve med.
Alternativt, kan du lade være med at bruge header() og bare printe noget ud til skærmen (feks. "Brugeren er nu opdateret"), med et link tilbage til 'opdater.php' (feks. <a href="opdater.php">Tilbage til opdaterings siden</a>)
Ja - du tilføjet bare &spiller=$VARIABEL_PÅ SPILLER i din header og kan så udskrive dette på den side du viderestiller til ved at skrive $_GET['spiller']
oki :-) Men trolle; hvordan skal det sættes sammen? &spiller=$VARIABEL_PÅ SPILLER i din header og kan så udskrive dette på den side du viderestiller til ved at skrive $_GET['spiller']
med
header("Location: sti.php?status=done"); og på sti.php skrive: if($_GET['status'] == 'done') echo'MySQL er opdateret!';
lige en ting (har jeg vist skrevet rimelig mange gange , he - men nu mener jeg det) jeg har
if($_GET['status'] == 'done') echo"Databasen er opdateret for spilleren: <h2><b>{$_GET['spiller']}</b></h2> kan jeg herefter skrive: DATA DER BLEV OPDATERET: og så kommer de data der blev opdateret til db? /kappel
Synes godt om
Ny brugerNybegynder
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.