Avatar billede 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>
Avatar billede 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
Avatar billede 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..
Avatar billede 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";
}
?>
Avatar billede 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
Avatar billede olsensweb.dk Ekspert
10. februar 2015 - 06:40 #5
får du her
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