Avatar billede DonDaase Novice
17. oktober 2014 - 22:38 Der er 8 kommentarer og
2 løsninger

Kalde funktion på samme side

Hey eksperter.

Jeg er i gang med at lave et lille simpelt regnskabs program der, i første omgang skal hente noget data fra en MySQL DB ud fra nogle givne kriterier.

Jeg er totalt nybegynder så beklager hvis svaret er simpelt. Men here goes:

Jeg har lavet en funktion der henter data i DB og smider det ind i en tabel. Det jeg gerne vil er at lave en knap der kan køre den funktion og lave tabellen på samme side - altså under knappen.

Kan man det?

Kode herunder:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>****</title>
</head>

<body>

<?php
// Forbind til MySQL DB og hæld data i tabel
Function FuncTest() {


$con=mysqli_connect("localhost","****","****","****");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT * FROM konti");

echo "<table cellpadding=\"2\" border=\"1\">\n";
echo     "<tr>
      <td>Kontonr</td>
      <td>Navn</td>";

while($row = mysqli_fetch_array($result)) {
    $kontonr = $row["kontonr"];
    $kontotxt = $row["navn"];
   
    echo "<tr>
        <td>$kontonr</td>
        <td>$kontotxt</td>";
}
echo "</table>";

mysqli_close($con);
}
?> 

</body>

</html>
Avatar billede NielsErikP Mester
17. oktober 2014 - 23:31 #1
Hej....


Prøv evt. at tage et kig på "input" tagget... under attributten "formaction".

Håber du kan bruge det.
Avatar billede DonDaase Novice
18. oktober 2014 - 00:01 #2
Tak for svar.

Når jeg nu skriver at det skal vises på samme side er det så meningen at jeg skal kalde den side jeg kommer fra og sende nogle variabler med?

Kan du på nogen måde give et eksempel på noget der minder om det jeg har beskrevet hvor du bruger formation?
Avatar billede olsensweb.dk Ekspert
18. oktober 2014 - 12:15 #3
jeg tror du skal kigge efter functionen isset, og dermed teste om en given variabel bliver sendt over
og selvføgelig også <input type="submit" > til at sende formen som tidligere referaret til.


test db
     
--
-- Database: `test`

-- Struktur-dump for tabellen `konti`
--

CREATE TABLE IF NOT EXISTS `konti` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `kontonr` int(11) NOT NULL,
  `navn` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=3 ;

--
-- Data dump for tabellen `konti`
--

INSERT INTO `konti` (`id`, `kontonr`, `navn`) VALUES
(1, 123, 'øl er gud'),
(2, 456, 'palle gulvballe');



hurtigt forslag, bruger dog html5 template,

<?php
// Forbind til MySQL DB og hæld data i tabel
function FuncTest() {
    $con = mysqli_connect("localhost", "root", "", "test");
    mysqli_set_charset($con, "utf8"); // hvis der er konfligter med tegnsæt fra db så er output UTF-8 tegnsæt
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }
    $result = mysqli_query($con, "SELECT * FROM konti");
    echo "<table cellpadding=\"2\" border=\"1\">\n";
    echo "<tr>
      <td>Kontonr</td>
      <td>Navn</td>";
echo "</tr>";
    while ($row = mysqli_fetch_array($result)) {
        $kontonr = $row["kontonr"];
        $kontotxt = $row["navn"];

        echo "<tr>
        <td>$kontonr</td>
        <td>$kontotxt</td>";
        echo "</tr>";
    }
    echo "</table>";
    mysqli_close($con);
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>demo</title>       
    </head>
    <body>
        <form action="test.php" method="post">
            <input type="submit" name="knap" value="vis liste">
        </form>
<?php
if (isset($_POST['knap'])) {
    FuncTest();
}
?>
    </body>
</html>


forbedrings forslag:
1) lig din connection ud i en function for sig selv, så er den nemat vedligeholde og genbruge
2) prøv at undgå at formatere inde i din function, da funcionen bliver meget specialiseret
3) der er ikke grund til at anvende mysqli_fetch_array, du kan nøjes med mysqli_fetch_assoc


forbedret udgave

<?php
// require_once($_SERVER['DOCUMENT_ROOT']."/include/php/db/mysqlconnection.php");
// ligger normalt i mysqlconnection.php
function MySqlIConnProceduralStyle($db = "") {
    $db = ($db == "") ? "test" : $db;
    $conn = mysqli_connect("localhost", "root", "", $db);
    if (!$conn) {
        DisplayError('Der opstod en fejl.', $conn->error);
    }
    mysqli_set_charset($conn, "utf8");
    return $conn;
}

// Forbind til MySQL DB og hæld data i array
// functionen har fået et beskrivende navn, og lavet meget genbrugbar
function konti_ReadAll() {
    $ar = array();
    $con = MySqlIConnProceduralStyle();
    $result = mysqli_query($con, "SELECT * FROM konti");

    while ($row = mysqli_fetch_assoc($result)) {
        $ar[] = $row;
    }

    mysqli_close($con);
    return $ar;
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>demo</title>
    </head>
    <body>
        <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
            <input type="submit" name="knap" value="vis liste">
        </form>
        <?php
        if (isset($_POST['knap'])) {
            $liste = konti_ReadAll(); // FuncTest(); omdøbt til konti_ReadAll()
            echo "<table cellpadding=\"2\" border=\"1\">\n";
            echo "<tr>
                <td>Kontonr</td>
                <td>Navn</td>";
            echo "</tr>";
            for ($i = 0, $lng = count($liste); $i < $lng; $i++) {
                echo "<tr>";
                    echo "<td>" . $liste[$i]['kontonr'] . "</td>";
                    echo "<td>" . $liste[$i]['navn'] . "</td>";
                echo "</tr>";
            }
            echo "</table>";
        }
        ?>
    </body>
</html>
Avatar billede NielsErikP Mester
18. oktober 2014 - 14:05 #4
Hej..

Den ordner Ronols bare.

Held og lykke.
Avatar billede DonDaase Novice
20. oktober 2014 - 20:09 #5
Hold k*** det er skarpt det der. Tak for hjælpen og forbedringsforslag. Begge dele er implementeret og testet og jeg er lykkelig samt en lille smule klogere.

Sender du et svar?

//Jan
Avatar billede olsensweb.dk Ekspert
21. oktober 2014 - 12:22 #6
point må være en deler med NielsErikP


du kan få nogle forbedrings forslag mere:
flyt din database connection uden for functionen, og overfør den som variabel.
årsagen er hvis du feks har flere functioner, der anvender databasen, ville du skulle ind i hver function og rette, til nyt database navn, hvor imod hvis din connection ligger uden for functionen, skal du kun gøre det et sted 

mysqlconnection.php

<?php
// (overvej at tager hostname, db_username, db_password med over som parameter, også)
function MySqlIConnProceduralStyle($db = "") {
    $db = ($db == "") ? "test" : $db;
    $conn = mysqli_connect("localhost", "root", "", $db);
    if (!$conn) {
        echo 'Der opstod en fejl.';
        exit();
    }
    mysqli_set_charset($conn, "utf8");
    return $conn;
}

function MySqlIConnOOP($db = "") {
    $db = ($db == "") ? "test" : $db;
    $conn = new mysqli('localhost', 'root', '', $db);
    /* check connection */
    if (!$conn) {
        echo 'Der opstod en fejl.';
        exit();
    }
    $conn->set_charset("utf8");
    return $conn;
}


forslag til flere functioner kunne være CRUD, her er mine 5 basis functionerne:
functions_db.php (utested)

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/include/php/db/mysqlconnection.php"); // MySqlIConnProceduralStyle(), MySqlIConnOOP()

function konti_Create($conn, $kontonr, $navn) {
    $sql = "INSERT INTO konti (kontonr, navn) VALUES ('$kontonr','$navn')";
    // $rs = mysqli_query($conn,$sql ); // procedural style
    $rs = $conn->query($sql); // OOP style
    // return mysqli_insert_id($conn);
    return $conn->insert_id;
}

function konti_Read($conn, $id) {
    $sql = "SELECT * FROM konti WHERE id = $id";
    $rs = $conn->query($sql);
    $ar = $rs->fetch_assoc();
    return $ar;
}

function konti_Update($conn, $id, $kontonr, $navn) {
    $sql = "UPDATE konti SET kontonr='$kontonr', navn='$navn' WHERE id = $id";
    $rs = $conn->query($sql);
}

function konti_Delete($conn, $id) {
    $sql = "DELETE FROM konti WHERE id = $id";
    $rs = $conn->query($sql);
}

function konti_ReadAll($conn) {
    $ar = array();
    $sql = "SELECT * FROM konti";
    //$rs = mysqli_query($conn, $sql);
    $rs = $conn->query($sql);
    //while ($row = mysqli_fetch_assoc($rs)) {
    while ($row = $rs->fetch_assoc()) {
        $ar[] = $row;
    }
    return $ar;
}

// $con = MySqlIConnProceduralStyle("olsensweb.dk"); // databasen hedder det sammen som mit domain, på domainet
$con = MySqlIConnProceduralStyle(); // databasen hedder test og anvendes under udviklilng
?>

i mysqli kan du skrive i procedural style og OOP style, jeg anbefaler du tillære dig OOP style, da det er det der bliver brugt fremover, i nogle af functionerne har jeg skrevet samme code i prodecural style og oop style og udkommenteret procedural style, så du kan se forskællen
OOP style er også maginalt hurtigere at afvikle da det eneste functionerne i procedural style gør, er at kalde de tilsvarende i OOP style

en anden årsag til du skal vænne dig til oop style er at hvis du på et tidspunkt skifter API fra MysqlI ti PDO (hvilke jeg vil anbefale), kan du kun anvende oop style

toppen af din php fil ser nu sådan ud:

<?php
require_once("functions_db.php");
?>
<!DOCTYPE html>
....
resten af html coden, anvendelsen af konti_ReadAll()  er nu ændret
fra
$liste = konti_ReadAll();
til
$liste = konti_ReadAll($con);





@NielsErikP smider du et svar også
Avatar billede NielsErikP Mester
21. oktober 2014 - 16:37 #7
Hej..

Tja.. det kan jeg da gøre ronols, hvis du syntes en fattig mand fortjener lidt uden ydelse.

Det er jo dig der frembragte en "Super Nova" her.
Avatar billede DonDaase Novice
25. oktober 2014 - 22:39 #8
Kan man lige nå at spørge om hvordan du sætter din kode ind i de bokse her i tråden? Det giver et noget bedre overblik.
Avatar billede DonDaase Novice
25. oktober 2014 - 23:00 #9
Sorry har fundet det..

(div) Tekst her (/div)

"(" og ")" skal udskiftes med hhv. "[" og "]"
Avatar billede NielsErikP Mester
26. oktober 2014 - 01:00 #10
Hej igen...

Tak for point. Selvom det måske ikke var mig der havde tjent dem.

Ang. div kasser på eksperten.. Prøv at tage et kig på dette

Håber du kan bruge det.
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