Avatar billede blackunicorn Nybegynder
12. januar 2013 - 10:07 Der er 13 kommentarer og
1 løsning

læg tal sammen og skriv til databasen

Jeg er ved at lave noget statistik over noget salg.

Planen er at holde styr på hvor mange ml der bliver solgt af hver vare.

For nemt at holde styr på det, har jeg oprettet en database der indeholder id varebeskrivelse og solgt.

Jeg har lavet et script der trækker viser en liste over de forskellige varer, og hvor mange ml. der er solgt af hver.

Det jeg ønsker er at lægge 10 eller 30 til tallet i databasen, istedet for at den overskriver det eksistrene tal.

<?php
$sql = mysql_query("SELECT * FROM `liquids` order by `varebeskrivelse` ASC");
$id = (int)$_GET["id"];

while($row = mysql_fetch_array($sql)) {

?>
           
<div class="vare">
<?php $row['varebeskrivelse'] ?></div><div class="solgt"><?php $row['solgt'] ?>
</div>

<form action="save.php?id=<?=$id?>" method="post">
    <div class="choise">
    <label><input name="amount" type="radio" value="10ml" <?php if($amount=='10'){?>checked="checked"<? }?> /> 10ml</label>
    <label><input name="amount" type="radio" value="30ml" <?php if($amount=='30'){?>checked="checked"<? }?> /> 30ml</label>
    <input type="submit" name="submit1"  VALUE="OK">
    </div>
</form>

<?php
}

if ($_REQUEST['amount']) {
  mysql_query("UPDATE liquids SET solgt='$amount' WHERE id='" . $id . "'") or die(mysql_error());
  }
?>
12. januar 2013 - 11:03 #1
SET solgt = solgt + $amount ...
12. januar 2013 - 11:07 #2
For øvrigt skal du nok skrive

<?php echo $row['varebeskrivelse'] ?></div><div class="solgt"><?php echo $row['solgt'] ?>

for at få udskriften at se.
Avatar billede blackunicorn Nybegynder
12. januar 2013 - 13:49 #3
Hm.. jeg får denne fejl når jeg forsøger at skrive til db

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id='0'' at line 1


Her er hele scriptet..


<?php
require_once("include/secrets.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da-DK" lang="da-DK">
<head>
<meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'/>
<title>Statistik Væsker</title>
<link rel="stylesheet" href="standard.css" type="text/css">
</head>

<body>
<table id="fixed"><tr>
<?php
$sql = mysql_query("SELECT * FROM `liquids` order by `varebeskrivelse` ASC");
$id = (int)$_GET["id"];

while($row = mysql_fetch_array($sql)) {


           
echo '<td class="vare">' .$row['varebeskrivelse']. '</td><td class="solgt">' .$row['solgt']. '</td>';
?>
<form action="test.php?id=<?=$id?>" method="post">
    <td class="choise">
    <label><input name="amount" type="radio" value="10ml" <?php if($amount=='10'){?>checked="checked"<? }?> /> 10ml</label>
    <label><input name="amount" type="radio" value="30ml" <?php if($amount=='30'){?>checked="checked"<? }?> /> 30ml</label>
    <input type="submit" name="submit"  VALUE="OK">
    </td>
</form></tr>

<?php
}

if ($_REQUEST['amount']) {
  mysql_query("UPDATE liquids SET solgt = solgt + $amount WHERE id='" . $id . "'") or die(mysql_error());
  }
?>
</table>
</body></html>
12. januar 2013 - 15:27 #4
Du kan prøve at se hvad der står i $amount. Du kan midlertidigt tilføje dette til den sidste del af koden:

if ($_REQUEST['amount']) {
  echo "AMOUNT = ";var_dump($amount);die;
  mysql_query("UPDATE liquids SET solgt = solgt + $amount WHERE id='" . $id . "'") or die(mysql_error());
  }

Hvis du får udskrevet noget andet end "AMOUNT = 10" eller "AMOUNT = 30", så er det nok koden i <form> der gør knuder.  Den har jeg ikke kikket på, fordi dit spørgsmål gik på det at skive til databasen.

Men hvis $amount (og $id) indeholder talværdier, så kan jeg kun tænke på et syntaks problem.  De forskellige versioner af php og mysql reagerer sommetider forskelligt på tegnsætningen.  Hvis query strengen står mellem dobbelte anførselstegn, " " i stedet for ' ', så skulle variabler autmatisk blive oversat uden yderligere tegnsætning, således at du burde kunne sige:

mysql_query("UPDATE liquids SET solgt = solgt + $amount WHERE id = $id")

men du kan prøve med

mysql_query("UPDATE liquids SET solgt = solgt + " . $amount . " WHERE id = " . $id)
Avatar billede olebole Juniormester
12. januar 2013 - 18:29 #5
<ole>

Du har en del uhensigtsmæssigheder/fejl i din kode. Ikke alle er skyld i dine problemer, men du bør nok rette dem alligevel.

Først og fremmest bør det ikke længere være nødvendigt at escape talværdier, når de indsættes. Det er det kun i det forlængst forældede MySQL-API. Brug i stedet PHP's MySQLI- eller PDO-API. Det beskytter også din database, som står pivåben for SQL-injections. Det gamle MySQL-API burde ingen bruge i dag.

Derudover tvivler jeg på, at denne syntaks holder:

action="save.php?id=<?=$id?>"

Det kræver i hvertfald en antik PHP-opsætning. I stedet kunne man skrive:

action="save.php?id=<?php echo $id ?>"

- men det er også en skidt fremgangsmåde. Du bør altid have styr på, hvor dine variabler kommer fra, hvorfor man stort set aldrig bruger $_REQUEST, men $_POST eller $_GET.

Derfor bør du i stedet skrive din FORM sådan:

<form action="save.php" method="post">
    <div class="choise">
    <input name="id" value="<?php echo $id ?>" type="hidden">
    <label><input name="amount" type="radio" value="10ml" <?php if($amount=='10'){?>checked="checked"<? }?> /> 10ml</label>
    <label><input name="amount" type="radio" value="30ml" <?php if($amount=='30'){?>checked="checked"<? }?> /> 30ml</label>
    <input type="submit" name="submit1"  VALUE="OK">
    </div>
</form>

- og så kun tilgå alle dine variabler i $_POST array'et.

Til sidst bør du nok bruge en anden DTD. Du bruger ikke XHTML 1.0 Strict, så du bør nok bruge en anden - f.eks:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

- eller:

<!DOCTYPE html>

Du har ingen grund til at forsøge at bruge XHTML. Du har ingen fordele ud af det, og W3C ophørte med at videreudvikle standarden i sommeren 2009 og kastede sig i stedet over HTML5.

/mvh
</bole>
Avatar billede blackunicorn Nybegynder
12. januar 2013 - 19:19 #6
Efter at have fulgt jeres råd, og rettet koden til, får jeg følgende besked, når jeg forsøger at bruge funktionen..

AMOUNT = NULL

Jeg har siddet og kigget det igennem flere gange, men kan ikke umiddelbart se hvor problemet er.

Koden ser nu sådan her ud..

<?php
require_once("include/secrets.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da-DK" lang="da-DK">
<head>
<meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'/>
<title>Statistik Væsker</title>
<link rel="stylesheet" href="standard.css" type="text/css">
</head>

<body>
<table id="fixed"><tr>
<?php
$sql = mysql_query("SELECT * FROM `liquids` order by `varebeskrivelse` ASC");
$id = (int)$_GET["id"];

while($row = mysql_fetch_array($sql)) {


           
echo '<td class="vare">' .$row['varebeskrivelse']. '</td><td class="solgt">' .$row['solgt']. '</td>';
?>
<form action="save.php?id=<?php echo $id ?>" method="post">
    <td class="choise">
    <input name="id" value="<?php echo $id ?>" type="hidden">
    <label><input name="amount" type="radio" value="10ml" <?php if($amount=='10'){?>checked="checked"<? }?> /> 10ml</label>
    <label><input name="amount" type="radio" value="30ml" <?php if($amount=='30'){?>checked="checked"<? }?> /> 30ml</label>
    <input type="submit" name="submit1"  VALUE="OK">
    </td>
</form></tr>

<?php
}

if ($_REQUEST['amount']) {
  echo "AMOUNT = ";var_dump($amount);die;
  mysql_query("UPDATE liquids SET solgt = solgt + $amount WHERE id='" . $id . "'") or die(mysql_error());
  }
?>
</table>
</body></html>
12. januar 2013 - 19:58 #7
Vi kommer nok til at dele det i to dele.  Olebole foreslår ændringer til din oprindelige kode, forslag du synes at være igang med at følge, og det har jeg ingen kommentarer til.  Men gående tilbage til dit oprindelige problem, at update database tabellen, så ser jeg nu hvorfor du i din oprindelige kode ikke får nogen værdi i $amount med det resultat, at UPDATE queryen fejler.  Jeg skal her vise en rettelse til din oprindelige kode som du så naturligvis skal tage med over i din omformulerede kode.

I din oprindelige kode siger du:

if ($_REQUEST['amount']) {
  mysql_query("UPDATE liquids SET solgt='$amount' WHERE id='" . $id . "'") or die(mysql_error());
  }

Du definerer ikke $amount.  Derfor er værdien NULL.  Du kan definere $amount således:

if ($_REQUEST['amount'])
{
    $amount = $_REQUEST['amount'];
      mysql_query("UPDATE liquids SET solgt='$amount' WHERE id='" . $id . "'") or die(mysql_error());
  }
Avatar billede blackunicorn Nybegynder
12. januar 2013 - 20:19 #8
Ja den burde jeg have set.

Nu får jeg ikke længere den besked, men den kan af en eller anden grund ikke trække $id ud.

Den bliver ved at angive id=0, uanset hvilken jeg vælger.

Som i nok har regnet ud er jeg ikke stærk i php, så jeg spekulerer på om der er noget galt her

$id = (int)$_GET["id"];
12. januar 2013 - 20:42 #9
Jeg kan ikke umiddelbart se noget galt med $id = (int)$_GET["id"];  Jeg vil foreslå i første omgang at echoe den, altså

$id = (int)$_GET["id"];
echo "ID = ";var_dump($id);die;

Hvis du får ID = NULL, så ligger problemet sandsynligvis i den foregående kode, den kode der sender GET'en.  Hvad er det for kode?  Hvor får du id'en fra?  Hvordan fortæller du programmet hilken id det skal bruge?
Avatar billede olebole Juniormester
12. januar 2013 - 20:59 #10
Prøv $_POST['id']  *o)
Avatar billede olebole Juniormester
12. januar 2013 - 21:04 #11
Alle de steder, du skriver $_REQUEST, bør du skrive $_POST.

$_REQUEST dækker både variabler sendt som GET og POST. Alle de variabler, du bruger, kommer fra en form med method="post". Derfor bør du udelukkende lede efter variablerne i $_POST array'et
Avatar billede blackunicorn Nybegynder
13. januar 2013 - 01:20 #12
En stor tak til jer for jeres hjælp, og til dig Christian_Belgien for din tålmodighed :)

Men efter at have holdt en pause, skrottede jeg den måde, og valgte en helt anden løsning.

Jeg har lavet en drop down menu. til hvert menupunkt er der en undermenu med 2 punkter (10ml og 30ml).

De linker til hver sin php fil, der ser sådan her ud.

<?php require_once("include/secrets.php");

$sql = mysql_query("SELECT * FROM `liquids` WHERE id = '$_GET[id]'");
$id = (int)$_GET["id"];

$amount = 10;

mysql_query("UPDATE liquids SET solgt = solgt + $amount WHERE id='" . $id . "'") or die(mysql_error());
?>

Eneste forskel på de 2 filer er $amount.

Så nu virker det endelig.
Avatar billede olebole Juniormester
13. januar 2013 - 15:02 #13
Så bør du nok overveje at få konverteret din kode til PDO eller MySQLI. Dels bliver mange ting hurtigere, dels bliver din kode sikker og dels risikerer du ikke, at al din DB-kode går død, næste gang din udbyder opdaterer PHP  *o)
Avatar billede blackunicorn Nybegynder
17. januar 2013 - 21:06 #14
Fandt en for mig fin løsning, så jeg lukker.
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