Avatar billede rubaek Mester
31. marts 2020 - 12:05 Der er 10 kommentarer og
1 løsning

Update hvad gør jeg galt?

Jeg vil gerne updatere min tabel, men det driller helt vild. Hvordan skal dette gøres ??

Jeg har forsøgt med dette script, men får dette fejl

Error updating record: Unknown column '$a' in 'field list'

Script:
<?php
include('../includes/connection.php');

// You should call this first
    session_start();
// Initialize the session value
    $_SESSION['ELEV_ID'] = $_POST["ELEV_ID"];
    $_SESSION['F_NAME'] = $_POST["F_NAME"];
    $_SESSION['L_NAME'] = $_POST["L_NAME"];
$a=$_POST["F_NAME"];
$b=$_POST["L_NAME"];


$sql = 'UPDATE elevnavn SET F_NAME=$a, L_NAME=$b WHERE ELEV_ID=1';


if (mysqli_query($db, $sql)) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . mysqli_error($db);
}

mysqli_close($db);
?>
Avatar billede Jens U. Juniormester
31. marts 2020 - 12:23 #1
Din $sql-streng bliver ikke interpoleret når den starter og slutter med enkelte anførselstegn - her skal du bruge dobbelte anførselstegn, så du sender $a direkte til databasen. Prøv at omskrive til:

$sql = "UPDATE elevnavn SET F_NAME='$a', L_NAME='$b' WHERE ELEV_ID=1";

Skal koden i produktion, mangler der noget sikring mod SQL-injection..
Avatar billede arne_v Ekspert
31. marts 2020 - 14:26 #2
Det var nok endnu bedre at bruge prepared statement.
Avatar billede rubaek Mester
31. marts 2020 - 14:26 #3
Nu skriver den i databasen, fedt. Du kunne vel ikke hjælpe med et script så alle data bliver overskrevet og ikke kun sidste line.

Mit script som det ser ud nu (med en del forsøgs ting, der selvfølgelig skal væk)
<?php
include('../includes/connection.php');

// You should call this first
    session_start();
// Initialize the session value
    $_SESSION['ELEV_ID'] = $_POST["ELEV_ID"];
    $_SESSION['F_NAME'] = $_POST["F_NAME"];
    $_SESSION['L_NAME'] = $_POST["L_NAME"];
$a=$_SESSION['F_NAME'];
$b=$_SESSION['L_NAME'];
$id=$_SESSION['ELEV_ID'];
echo $a;
echo $b;
echo $id;

$sql = "UPDATE elevnavn SET F_NAME='$a', L_NAME='$b' WHERE ELEV_ID='$id'";


if (mysqli_query($db, $sql)) {
    echo "Record updated successfully";
} else {
    echo "Error updating record: " . mysqli_error($db);
}

mysqli_close($db);
?>
Avatar billede olsensweb.dk Ekspert
31. marts 2020 - 14:47 #4
#2
>Det var nok endnu bedre at bruge prepared statement.
meget bedre, men hvorfor ikke komme med et link
https://www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf
http://www.vajhoej.dk/arne/articles/prepparam.html


#3
>og ikke kun sidste line.
det må du lige forklare, der bliver opdateret den/de linjer der har ELEV_ID der står i $id

hvad bruger du  $_SESSION til ??
du kunne jo være det var admin der opdaterede db
Avatar billede rubaek Mester
31. marts 2020 - 16:12 #5
Jeg er helt på dybt vand her.
Tanken er at det er en lærer der indskriver nogle prøveresultater, som så sendes til databasen og her retter de data der er nye.
Giver det mening?

-  og ikke kun sidste line.
Når jeg kører det script jeg har her, er det som om den kører alle rækker i gennem og kun retter den sidste linie i min tabel, det er som om, den ikke gør følgende:
Elev 1  - ret det der er forandret
Elev 2 - ret det der er forandret osv.

Det virker til at der mangler en løkke ?
Avatar billede rubaek Mester
31. marts 2020 - 16:31 #6
Har prøvet dette ud fra beskrivelsen, men den fejler:

Fatal error: Uncaught Error: Call to a member function prepare() on null in /var/www/gmonskole.dk/public_html/tk/pages/update_prover1.php:5 Stack trace: #0 {main} thrown in /var/www/gmonskole.dk/public_html/tk/pages/update_prover1.php on line 5
<?php
include('../includes/connection.php');

/* Opret et prepared statement */
if ($stmt = $mysqli->prepare('UPDATE `elevnavn` SET `F_NAVN`=$f_navn WHERE `id`=$id')) {
/* Bind parametre */
$stmt->bind_param('si', $f_navn, $id);
/* St vrdier p parametrene */
$f_navn = $_POST['F_NAME'];
$id = $_POST['ELEV_ID'];
/* Eksekver foresprgslen */
$stmt->execute();
/* Luk statement */
$stmt->close();
} else {
/* Der er opstet en fejl */
echo 'Der opstod en fejl i erklringen: ' . $mysqli->error;
}

mysqli_close($db);
?>
Avatar billede rubaek Mester
31. marts 2020 - 17:00 #7
Nu har jeg rette lidt og nu kører den igennem, men uden at rette noget.

<?php
include('../includes/connection.php');

/* Opret et prepared statement */
if ($stmt = $db->prepare('UPDATE `elevnavn` SET `F_NAVN`=? WHERE `id`=?')) {
/* Bind parametre */
$stmt->bind_param('si', $f_navn, $id);
/* St vrdier p parametrene */
$f_navn = $_POST['F_NAME'];
$id = $_POST['ELEV_ID'];
/* Eksekver foresprgslen */
$stmt->execute();
/* Luk statement */
$stmt->close();
} else {
/* Der er opstet en fejl */
echo 'Der opstod en fejl i erklringen: ' . $mysqli->error;
}

mysqli_close($db);
?>
Avatar billede olsensweb.dk Ekspert
31. marts 2020 - 18:28 #8
hedder din connection ikke $db ??
echo 'Der opstod en fejl i erklringen: ' . $mysqli->error;
skal vel være
echo 'Der opstod en fejl i erklringen: ' . $db->error;


har du ændret dine felt navne iforhold til tidligere vist i #3
Avatar billede rubaek Mester
31. marts 2020 - 19:54 #9
Den havde jeg overset. Nu fejler scriptet ikke længere, med den opdatere kun den sidste række i min tabel selv om jeg retter aller steder?
Avatar billede rubaek Mester
31. marts 2020 - 20:32 #10
Som forstår det kører den en løkke af sig selv, med det ser ikke ud til at det sker?
Avatar billede rubaek Mester
31. marts 2020 - 21:07 #11
Jeg lukker denne tråd, og oprette et spørgsmål om løkken i et andet spørgsmål.
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

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