Avatar billede Calle5463 Forsker
06. oktober 2016 - 12:18 Der er 5 kommentarer og
1 løsning

Handling af data i udskrift

Indrømmet - jeg har ikke helt overblik over det der med prepared statements (og sikkert heller ikke ' og ")

Nedenstående kode virker - næsten (ingen fejlkoder). Den sletter ikke den record jeg trykker på, men den sidst udskrevne. Hvordan får jeg recordens ID-nummer med over via knappen?


<?php
// Snippet nr 15, øvelse i datahandling af een simpel tabel (vis, ret, slet, indsæt)
// Alt skal laves i denne snip, og der må kun bruges html- og php-koder
// php skal være prepared statement

Function forbind_til_database() {
    $servername = "host";
    $username = "hosthost";
    $password = "snøft";
    $dbname = "aargh";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) {die("Connection failed: " . $conn->connect_error);} else {echo "<br> Forbindelse er ok";}

    return $conn;
}
   

function vis_tillidshverv($conn) {
    $sql_select = "SELECT * FROM fvf2_cer_tillidshverv ORDER BY fvf2_cer_tillidshverv.sortering";

    $result = $conn->query($sql_select);   
   
    if ($result->num_rows > 0) {
        // Udskriv overskrifter
        // Denne lidt mærkelige konstruktion, er et quick-fix for lidt pænere format - tilrettes når alt andet virker
        echo "<table>" .
            "<tr>" .
                "<td>" . ID . "</td>" . "<td>" . Sort . "</td>" . "<td>" . Hverv . "</td>" . "<td>" . Beskrivelse . "</td>" . "<td>" . Hidden . "</td>" . "<td>" . Edit . "</td>" .    "<td>" . Slet . "</td>" .
            "</tr>" .
            "<tr>" .
                "<td>" . "" . "</td>" . "<td>" . "" . "</td>" . "<td>" . "" . "</td>" . "<td>" . "" . "</td>" . "<td>" . "" . "</td>" . "<td>" . "" . "</td>" . "<td>" . "" . "</td>" .
            "</tr>";

        // Udskriv data
        // echo "<FORM method='GET' action='$PHP_SELF'>";
        echo "<FORM method='POST' action='$PHP_SELF'>";

        while($row = $result->fetch_array()) {
           
        echo "<tr>" .   
                "<td width='5%'>" . "<input type=text name=ID value=" . $row[ID] . " style='width: 50px;'>" . "</td> " .

                "<td width='10%'>" . "<input type=text name=sortering value=$row[sortering] style='width: 50px;'>" . "</td>" .           
                "<td width='20%'>" . "<input type=text name=sortering value=$row[tillidshverv] style='width: 150px;'>" . "</td>" .
                "<td width='45%'>" . "<textarea name=beskrivelse style='width: 250px; height: 85px;'>$row[beskrivelse]</textarea>" . "</td>" .
                "<td width='10%'>" . "<input type='submit' name='knap' value='Edit'/>" . "</td>" .
                "<td width='10%'>" . "<input type='submit' name='knap' value='Slet'/>" . "</td>" .
            "</tr>";
        }
        echo "</table>";
        echo "</FORM>";
    } else {
    echo "0 results";
    }
}


// Foreløbig kodning af funktion for redigering af data
function rediger_record($ID){
    echo "<br> Funktionen REDIGER_RECORD er kaldt med ID = " . $ID;
}


function slet_record($sql, $ID) {
        $slet = "DELETE FROM fvf2_cer_tillidshverv WHERE fvf2_cer_tillidshverv.ID = '$ID' LIMIT 1";
        $run = @mysqli_query($sql, $slet);
   
        if (mysqli_affected_rows($sql) == 1) {
            // Hvis det kører
            echo "<br> Record er slettet";
           
            } else {
            // Hvis det ikke kører
              echo "<br> FEJL: Linien (tabel-recorden) kunne ikke slettes pga. system-fejl"; // Public message.
              echo "<br> Debug: " . mysqli_error($sql) . "<br />Query: " . $slet; // Debugging message.
        }
}


// ----------------------------------------------------------------------------------


if(isset($_POST[knap])) {
    if($_POST[knap] == 'Slet') {
        echo "<br> Forsøger at slette " . $_GET[ID];
        // slet_record
        $mysqli = forbind_til_database();

        echo "<br> Kalder funktionen slet-record med ID = " . $_POST[ID];
        slet_record($mysqli, $_POST[ID]);
    }

    if($_POST[knap] == 'Edit') {
        echo "<br> Forsøger at rette ID " . $_POST[ID];
        rediger_record($_POST[ID]);
    }
}

$mysqli = forbind_til_database();
vis_tillidshverv($mysqli);

$mysqli->close();
?>
Avatar billede olsensweb.dk Ekspert
06. oktober 2016 - 12:55 #1
>jeg har ikke helt overblik over det der med prepared statements
OleBole har tidligere lavet en quick guide her på E, E har desværrer valgt ikke at tage guides med over på det nye E ennu, kommer måske i en eller anden form

guiden kan nu findes på http://archive.org/web/
indtast www.eksperten.dk/guide/1480 i søge feltet
vælg sidst gemte dato her april 13, 2016


der er intet i din nuværende code der er Prepare Statement
Avatar billede olsensweb.dk Ekspert
06. oktober 2016 - 13:15 #2
du mangler en masse enkelt plinger i din isset !!


if (isset($_POST['knap'])) {
    if ($_POST['knap'] == 'Slet') {
        echo "<br> Forsøger at slette " . $_POST['ID']; // kommer over med POST og ikke GET
        // slet_record
        $mysqli = forbind_til_database();

        echo "<br> Kalder funktionen slet-record med ID = " . $_POST['ID'];
        slet_record($mysqli, $_POST['ID']);
    }

    if ($_POST['knap'] == 'Edit') {
        echo "<br> Forsøger at rette ID " . $_POST['ID'];
        rediger_record($_POST['ID']);
    }
}
Avatar billede Calle5463 Forsker
06. oktober 2016 - 13:36 #3
Det gjorde så ingen forskel (ved tryk på knap ud for ID = 5):
ID = 11 er den sidst viste på listen

Test af formular for vedligehold af data i _tillidshverv.
Forsøger at rette ID 11
Funktionen REDIGER_RECORD er kaldt med ID = 11
Forbindelse er ok

Test af formular for vedligehold af data i _tillidshverv.
Forsøger at slette 11
Forbindelse er ok
Kalder funktionen slet-record med ID = 11
Record er slettet
Forbindelse er ok
Avatar billede olsensweb.dk Ekspert
06. oktober 2016 - 14:15 #4
>Det gjorde så ingen forskel (ved tryk på knap ud for ID = 5):
>ID = 11 er den sidst viste på listen

>Test af formular for vedligehold af data i _tillidshverv.
>Forsøger at rette ID 11
>Funktionen REDIGER_RECORD er kaldt med ID = 11
>Forbindelse er ok

det er pga. du kun har en form, så vil sidste element overskrive det der trykkes på når der trykkes på knappen.

<FORM method='POST' action='/test/test.php'>
<td><input type=text name=ID value=1 style='width: 50px;'></td>
.....
<td><input type=text name=ID value=2 style='width: 50px;'></td>
....
</FORM>

her vil sidste ID altid overskrive tidligere.


den nemmeste løsning er at lave en form pr gruppe.

function vis_tillidshverv($conn) {
    $sql_select = "SELECT * FROM fvf2_cer_tillidshverv ORDER BY fvf2_cer_tillidshverv.sortering";

    $result = $conn->query($sql_select);

    if ($result->num_rows > 0) {
        // Udskriv overskrifter
        // Denne lidt mærkelige konstruktion, er et quick-fix for lidt pænere format - tilrettes når alt andet virker
        echo "<table>\n";
        echo "<tr>\n";
        echo "<td width='5%'>ID</td>\n";
        echo "<td width='10%'>Sort</td>\n";
        echo "<td width='20%'>Hverv</td>\n";
        echo "<td width='45%'>Beskrivelse</td>\n";
        // echo  "<td>Hidden</td>\n";
        echo "<td  width='10%'>Edit</td>\n";
        echo "<td  width='10%'>Slet</td>\n";
        echo "</tr>\n";


        // Udskriv data       
        while ($row = $result->fetch_array()) {
            echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'>\n";
            echo "<tr>\n";
            echo "<td><input type=text name=ID value=" . $row['ID'] . " style='width: 50px;'></td>\n";
            echo "<td><input type=text name=sortering value=" . $row['sortering'] . " style='width: 50px;'>" . "</td>\n";
            echo "<td><input type=text name=tillidshverv value=" . $row['tillidshverv'] . " style='width: 150px;'>" . "</td>\n";
            echo "<td><textarea name=beskrivelse style='width: 250px; height: 85px;'>" . $row['beskrivelse'] . "</textarea>" . "</td>\n";
            echo "<td><input type='submit' name='knap' value='Edit'/>" . "</td>\n";
            echo "<td><input type='submit' name='knap' value='Slet'/>" . "</td>\n";
            echo "</tr>\n";
            echo "</form>\n";
        }
        echo "</table>\n";
       
    } else {
        echo "0 results";
    }
}

en anden løsning er at lave dine names til array, men det er en mere besværlig løsning.
Avatar billede olsensweb.dk Ekspert
06. oktober 2016 - 17:27 #5
nu når du har fået din rigtige id med over, kunne du passende læse guiden jeg omtalte i #1, nu har du jo netop data udefra.

du bør overveje om det er nødvendigt med en tabel, det virker som om det er til design, og det er ikke meningen med tabeller.

det er iøvrigt heller ikke validt med forms inde i tabeller.
Avatar billede Calle5463 Forsker
06. oktober 2016 - 19:04 #6
Det har ikke noget med design at gøre, og ja, når jeg kommer så langt, så skal jeg have set på layoutet.

Men lige nu holder jeg fokus på at få hele teknikken til at fungere, derefter skal jeg have fundet ud af det med PS, og så kan jeg kigge lidt på layout.
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