hoejgaard Juniormester
09. februar 2015 - 02:03 Der er 4 kommentarer og
1 løsning

Indsætte array i database og trække det ud igen

Jeg har fundet nedenstående kode her på siden.
Den kan udvide en form så man kan få flere inputfelter hvis man ønsker det, ved at klikke på "udvid form"
Jeg skal lave det samme og have disse data ind i en database.
Hvordan laver jeg min: mysql_query("INSERT INTO tabel (.....osv  ?
Og hvordan får jeg værdierne ud af databasn igen ??


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Tilføj række i form/tabel</title>
<meta name="Generator" content="Stone's WebWriter 4">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
function addRow(elm){
  var tb = document.getElementById("MinTBody");
  var tr = tb.getElementsByTagName("tr")[0];
  var nyTr = tr.cloneNode(true);
  var inps = nyTr.getElementsByTagName("input");
  for(i=0;inps.length>i;i++){
    if(inps[i].type == "text")
      inps.value = "";
  }
  var submitRow = getParent(elm, "tr");
  tb.insertBefore(nyTr,submitRow);
}
function getParent(elm,TagName){
  var parElm = elm.parentNode;
  while(parElm.tagName.toLowerCase() != TagName.toLowerCase())
    parElm = parElm.parentNode;
  return parElm;
}
</script>
</head>
<body>
<form action="" method="post" name="myForm">

<table width="200" border="1">
<tbody id="MinTBody">
  <tr>
    <td><input name="firstname" type="text"></td>
    <td><input name="lastname" type="text"></td>
    <td><input name="pay" type="checkbox" value="payed"></td>
  </tr>
  <tr>
    <td><input name="addfield" type="button" value="Udvid form" onclick="addRow(this);return false;"></td>
    <td><input name="submit" type="submit" value="OK"></td>
    <td></td>
  </tr>
</tbody>
</table>
</form>

</body>
</html>
olsensweb.dk Ekspert
09. februar 2015 - 14:21 #1
som du sikkert læste i http://www.eksperten.dk/spm/666830 #7 skal dine input felter være array's
har ikke lige læst http://www.eksperten.dk/spm/785174 igennem ennu, hvor coden også bruges.

men der er et alvorligt problem: med checkboxene, de sendes ikke med over hvis de ikke er checked af, med de tilhørende firstname/lastname gør, og så går det kuk i array'et,

løsning er at nummere dit array
     
  <input name="firstname[0]" type="text">
  <input name="lastname[0]" type="text">
  <input name="pay[0]" type="checkbox" value="payed">
 
  <input name="firstname[1]" type="text">
  <input name="lastname[1]" type="text">
  <input name="pay[1]" type="checkbox" value="payed">

den code du visser tager et kopi af den første linje, med alle dens egenskaber, og der kan du ikke nummerer dit array


jeg har lavet en lidt grov omskrivning af siden, med med sammen functionalitet, hvor jeg nummere arrayet, som jeg foreslår, og nej jeg anvender IKKE tabeller, det er ikke til design
     
<!DOCTYPE html>
<html>
    <head>
        <title>Tilføj række i form</title>

        <meta charset="utf-8">
        <script type="text/javascript">
            var row_no = 0;
            function addRow() {
                // med inspiration fra http://www.eksperten.dk/spm/975032
                var br = document.createElement("br");
               
                var firstname_element = document.createElement("input");
                firstname_element.setAttribute("type", "text");
                firstname_element.setAttribute("value", "");
                firstname_element.setAttribute("name", "firstname["+row_no+"]");

                var lastname_element = document.createElement("input");
                lastname_element.setAttribute("type", "text");
                lastname_element.setAttribute("value", "");
                lastname_element.setAttribute("name", "lastname["+row_no+"]");

                var pay_element = document.createElement("input");
                pay_element.setAttribute("type", "checkbox");
                pay_element.setAttribute("value", "payed");
                pay_element.setAttribute("name", "pay["+row_no+"]");

                var foo = document.getElementById("fooBar");
                //Append the element in page (in span).
                foo.appendChild(firstname_element);
                foo.appendChild(lastname_element);
                foo.appendChild(pay_element);
                foo.appendChild(br);
                row_no++;
            }
        </script>
    </head>
    <body>
        <form method="post" action="insert_db.php">
            <span id="fooBar"></span>
            <input type="button" value="Add" onclick="addRow()">
            <input type="submit" value="send">
        </form>
        <script type="text/javascript">
            addRow(row_no);
        </script>
    </body>
</html>


insert_db.php
     
<?php
$firstnames = $_POST['firstname'];
$lastnames = $_POST['lastname'];
$has_payed = $_POST['pay'];
for ($i = 0, $lng = count($firstnames); $i < $lng; $i++) {
    if (isset($has_payed[$i])) {
        $sql = "INSERT INTO tbl_users (firstname, lastname, payed) VALUES ('$firstnames[$i]', '$lastnames[$i]', 'ja') ";
    } else {
        $sql = "INSERT INTO tbl_users (firstname, lastname, payed) VALUES ('$firstnames[$i]', '$lastnames[$i]', 'nej') ";
    }
    echo $sql."<br>\n";
}
?>



>have disse data ind i en database.   
>hvordan får jeg værdierne ud af databasn igen ??
hvordan ser din database structur ud ??
vil du indsætte dem i tabellen uanset om de har betalt eller ej ?? (data kommer over)
hente dem ud igen er jo bare en SELECT

>mysql_query("
hvorfor anvender du stadig det gamle API ?? det udgår i kommende vertioner af PHP
anvend mysqli eler PDO

du kan få mindre overhead ved at anvende PS(Prepare statement) i din INSERT, (PS er først kommet til i mysqli og PDO)

læs evt denne guide om PS under mysqli http://www.eksperten.dk/guide/1480 meget af tankegangen kan overføres til PDO
kig på http://php.net/manual/en/pdo.prepared-statements.php Example #2 Repeated inserts using prepared statements

NB: der er ikke nogle betingelse af anvende PS under mysqli eller PDO, men du kan opnå størrer sikkerhed
hoejgaard Juniormester
10. februar 2015 - 04:17 #2
Hej og mange tak for hjælpen !

jeg bruger ikke lige alt det som jeg havde sat op i starten, men har nu følgende:

$datov = $_POST['datov'];
$va = $_POST['va'];

for ($i = 0, $lng = count($datov); $i < $lng; $i++) {
   
        $sql = "INSERT INTO del (id,brugernavn,datov,va) VALUES ('$id','$userid','$datov[$i]', '$va[$i]') ";
    }
    echo $sql."<br>\n";


Problemet er nu at count($datov) bliver 0
Så der er noget galt med  $datov  ??
Kan du se hvad det kan være ? har brugt det du skrev bare med mine variable i stedet..
olsensweb.dk Ekspert
10. februar 2015 - 06:06 #3
>Problemet er nu at count($datov) bliver 0
>Så der er noget galt med  $datov  ??
lyder som om du ikke sender datov over

prøv at teste 
$datov = $_POST['datov'];
print_r($datov);

du får temelig sikkert et tomt array, eller en undefined $_POST['datov']

hurtig omskrivning
   
<!DOCTYPE html>
<html>
    <head>
        <title>Tilføj række i form</title>
        <meta charset="utf-8">
        <script type="text/javascript">
            var row_no = 0;
          // http://stackoverflow.com/questions/12409299/how-to-get-current-formatted-date-dd-mm-yyyy-in-javascript-and-append-it-to-an-i           
          var today = new Date();
            var dd = today.getDate();
            var mm = today.getMonth() + 1; //January is 0!
            var yyyy = today.getFullYear();
            if (dd < 10) {
                dd = '0' + dd
            }
            if (mm < 10) {
                mm = '0' + mm
            }
            var today_ = dd + ' - ' + mm + ' - ' + yyyy;

            function addRow() {
                // med inspiration fra http://www.eksperten.dk/spm/975032
                var br = document.createElement("br");
                var datov_element = document.createElement("input");
                datov_element.setAttribute("type", "date"); // date virker ikke i FF og IE,
                datov_element.setAttribute("value", today_);
                datov_element.setAttribute("name", "datov[" + row_no + "]");

                var va_element = document.createElement("input");
                va_element.setAttribute("type", "text");
                va_element.setAttribute("value", "");
                va_element.setAttribute("name", "va[" + row_no + "]");

                var foo = document.getElementById("fooBar");
                //Append the element in page (in span).

                foo.appendChild(datov_element);
                foo.appendChild(va_element);

                foo.appendChild(br);
                row_no++;
            }
        </script>
    </head>
    <body>
        <form method="post" action="insert_db.php">
            <span id="fooBar"></span>
            <input type="button" value="Add" onclick="addRow()">
            <input type="submit" value="send">
        </form>
        <script type="text/javascript">
            addRow(row_no);
        </script>
    </body>
</html>


insert_db.php
     
<?php
$id=5;
$userid = "ronols";

$datov = $_POST['datov'];
$va = $_POST['va'];

for ($i = 0, $lng = count($datov); $i < $lng; $i++) {
    $sql = "INSERT INTO del (id,brugernavn,datov,va) VALUES ('$id','$userid','$datov[$i]', '$va[$i]') ";
    echo $sql."<br>\n";
}
?>
hoejgaard Juniormester
10. februar 2015 - 06:07 #4
nå nu lykkedes det vidst at få det til at fungere.
Mange tak for hjælpen !
Læg et svar Ronols
olsensweb.dk Ekspert
10. februar 2015 - 06:40 #5
får du her
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

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





Premium
Fremtiden har aldrig set mere usikker ud for Intel: Her er det, der kan redde – og dødsdømme chip-kæmpen
Computerviews: Intels nyslåede topchef Pat Gelsinger står overfor en stribe rigtig svære beslutninger. Hvis han ikke træder varsomt, vil chip-giganten sandsynligvis sygne hen.
Computerworld
Akut mangel på chip tvinger verdens største bil-producenter til at drosle ned for produktionen af biler
Flere af verdens største bil-producenter er tvunget til at drosle ned for produktionen på grund af mangel på chip, som de ikke kan få leveret.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
Job & Karriere
Microsoft i kæmpe dansk satsning - åbner tre store datacentre i Danmark
Microsoft lancerer kæmpe satsning fra hovedkvarteret i Lyngby. Selskabet åbner tre store bæredygtige datacentre på Sjælland.
White paper
Her skal du passe på: Rapport fra cyberkrigens frontlinje
I 2020 blev cyberangreb hyppigere og stadig mere alvorlige, og i CrowdStrike Services Cyber Front Lines Report 2020 har du læse, hvor udfordringerne er størst. Rapporten dokumenterer blandt andet, at 63 pct. af alle angreb var økonomisk motiverede – og at hovedparten af angriberne benytter ransomware. Samtidigt bliver de afkrævede beløb større og større, og de kriminelle truer nu ikke kun med at slette data. Stadig oftere sker det, at de cyberkriminelle aktivt analyserer data og undersøger, om der kan sættes trumf på truslen ved true med at lække eller sælge følsomme informationer.