Avatar billede Slettet bruger
12. august 2010 - 17:34 Der er 18 kommentarer og
1 løsning

Indsæt til flere forskellige databaser.

Jeg har en masse input-felter
Men de skal i hver sin database.
Jeg kan nemt smide dem i hver sin database, men i forskellige er jeg lidt lost i.
vi tager bare udgangspunkt i 2 inputfelter:


[title]
[type]


Dem henter jeg ind i create.php filen:

$Title = $_REQUEST["title"];
$Type = $_REQUEST["type"];


Men nu er det sådan at type skal opdeles.
Indholdet ser sådan ud: type1, type2, type3

nu vil jeg gerne have sendt title til databasen main

$query = mysql_query("insert into main (title) values ('$Title')");


MEN så kommer mit problem.
Hver type skal så indsættes i en anden database.
Men den skal indsættes sammen med det id som title lige fik tildelt.

$query = mysql_query("insert into type (refid,type) values ('$id','$Type')");


$id skal så være id feltet i main hvor title lige er indsat.
$type skal så være den være type feltet delt op.

Har leget lidt med det.
Men er ikke helt god til det der foreach.
Avatar billede Slettet bruger
12. august 2010 - 18:09 #1
Type kan opdeles med funktionen explode

$array_med_titler = explode($Title);

ID'et fra sidste indsatte række skaffes med funktionen mysql_insert_id

$id = mysql_insert_id($databaseforbindelse);

Husk desuden at sikre dig mod SQL Injections. Ellers kan skumle personer kigge med eller ændre på dine data.
Det kan gøres med prepared/parameterized statements (at foretrække) eller med funktionen mysql_real_escape_string

$sikkert_data = mysql_real_escape_string($_REQUEST['usikkert_data']);
Avatar billede showsource Seniormester
12. august 2010 - 18:13 #2
Hvorfor ikke lave tre formfelter ?

Anyway,

Når du afvikler første query ( INSERT ) hvor du har et autoincrement felt, kan du lige efter få fat i sidst indsatte id med:

// query som indsætter ny række

// og derefter
$lastid = mysql_query("SELECT LAST_INSERT_ID()") or die (mysql_error());

$vars = explode(",",$_POST["feltnavn"]);
if(count($vars) == 3) {

$number = mysql_result($lastid,0);

mysql_query("INSERT INTO tabelet VALUES(".$number.",'".$vars[0]."'") or die (mysql_error());

mysql_query("INSERT INTO tabelto VALUES(".$number.",'".$vars[1]."'") or die (mysql_error());

mysql_query("INSERT INTO tabeltre VALUES(".$number.",'".$vars[2]."'") or die (mysql_error());

}else{
echo"Fejl!";
}
Avatar billede Slettet bruger
12. august 2010 - 18:18 #3
Den med id'et forstår jeg ikke.
Hvordan skal jeg skrive dataforbindelsen?
Avatar billede Slettet bruger
12. august 2010 - 18:22 #4
showsource --> Kan godt se det kunne misforståes
Der kan være flere forskellige typer. Jeg ved ikke hvor mange typer der kommer det kan være alt fra 1 til 10
Avatar billede showsource Seniormester
12. august 2010 - 18:28 #5
Du kan med noget javascript lade brugeren vælge hvor mange felter som skal vises, for at kunne poste hver type.

M.h.t. til id:

Hvis du har en tabel med et felt som er autoincrement, d.v.s. ved hver ny INSERT tildeler mysql det næste nummer i rækken, kan du lige efter INSERT få fat i det sidst tildelte id med LAST_INSERT_ID() eller som kimsey0 skriver, mysql_insert_id()
Dog er query at foretrække, da der kan komme forkert resultat hvis feltet er BIGINT
Avatar billede Slettet bruger
12. august 2010 - 18:42 #6
Den der ID ting forstår jeg stadig ikke helt.

min side ser sådan ud:

[/div]
$Title = mysql_real_escape_string($_REQUEST["title"]);
$Type = mysql_real_escape_string($_REQUEST["type"]);

$Type_arr = explode($Type);

$query = mysql_query("insert into main (title) values ('$Title')");


$query = mysql_query("insert into type (type,refid) values ('$Type_arr','$id')");
[/div]


Kan ikke rigtigt se hvor i vil have den ID ind.
Prøvede at læse lidt men forstod det ikke rigtigt, og synes det i skriver er 2 forskellige ting.
Avatar billede Slettet bruger
12. august 2010 - 18:43 #7
Flot fail med [div]'en
Avatar billede Slettet bruger
12. august 2010 - 19:30 #8
Når du har fået fat i id'et:

$id = mysql_insert_id($databaseforbindelse);

kan du bruge det i koden:

$query = mysql_query("insert into type (type,refid) values ('$Type_arr','$id')");
Avatar billede showsource Seniormester
12. august 2010 - 19:31 #9
Det eneste forskellige vi skriver, er måden at få det netop indsatte id ud af mysql db'en.

Prøv at lege lidt med det her:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>X antal formfelter</title>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />


<style type="text/css">

body {
    background-color: white;
    color: black;
    font-size: 0.8em;
    font-family: verdana, arial, sans-serif;
    margin: 20px;
    }

.textinput {
    font-size: 0.9em;
    background-color: #FFFFFF;
    color: #000000;
    border-width: 1px;
    border-color: black;
        }

.submit {
    font-size: 0.9em;
    background-color: #E9E9E9;
    color: #000000;
    border-width: 1px;
    border-color: black;
        }

.submitknap {
    padding-left: 60px;
            }

</style>

<script type="text/javascript">

function form_fields($antal) {

    if(er_et_tal($antal) != false && $antal > 0) {

    var ialt = 0;

    var upref = document.getElementById("formfelter");

        while (upref.firstChild) {
        upref.removeChild(upref.firstChild);
        }


      while(ialt < $antal) {

      newDiv=document.createElement("div");
      newDiv.style.padding = "2px";
      upref.appendChild(newDiv);

        try {

        newElement=document.createElement("<input type='text' name='nytfelt[]' class='textinput'>");

        } catch (e) {

        newElement=document.createElement("input");
        newElement.setAttribute("name", "nytfelt[]");
        newElement.setAttribute("type", "text");
        newElement.setAttribute("class", "textinput");

        }

      upref.appendChild(newElement);


      ialt++;
      }


  }

}

function er_et_tal() {
    var reg = /^[\d]+$/;
    var navn = document.getElementById("antalfelter");
    if(navn.value !='' && !navn.value.match(reg)){
      alert("Kun tal kan indtastes i feltet!");
      var val = new String(navn.value);
      navn.value = val.substring(0,(val.length-1));
      return false;
    }
}

</script>

</head>
<body>

<form name="form_post" action="" method="post">
 
Antal viste felter: <input type="text" name="antal" onkeyup="er_et_tal();" size="2" id="antalfelter" class="textinput">
<input type="button" value="Vis felter" class="submit" onclick="form_fields(this.form.antal.value);" onkeydown="form_fields(this.form.antal.value);">

<div id="formfelter" style="padding: 16px;">

<script type="text/javascript">
form_fields(3);
</script>

</div>

<br />

<div class="submitknap">

    <input type="submit" value="Submit form" class="submit">

</div>

</form>

<?php
if($_SERVER["REQUEST_METHOD"] == "POST") {

echo "<pre>";
print_r($_POST);
echo "</pre>";

}
?>
</body></html>
Avatar billede Slettet bruger
12. august 2010 - 19:35 #10
jeps.. Men det er der mit problem er.
Jeg ved ikke rigtigt hvad det er du mener med dataforbindelsen.
Resten har jeg gennemskuet.

Jeg er ikke helt så stærk i det endnu.
Avatar billede Slettet bruger
12. august 2010 - 19:47 #11
Takker showsource...
Men det er lige lidt mere en hvad jeg har lært og forstår.
Og grunden til at jeg ikke bruger det er at så skal de sidde og sætte 20-25 felter ind i nogen tilfælde istedet for bare at kopier det de har og sæt det ind i et felt.

Det er et udskrift fra en anden side som de bare copy paster.
Avatar billede showsource Seniormester
12. august 2010 - 19:57 #12
ok.

Du har en tabel i din db.
I den tabel er et felt som automatisk forøger værdi hver gang der bliver lavet et nyt row. ( INSERT INTO tabel ..... )

Når du har lavet den INSERT kan du lige efter få det tal som blev skrevet i det felt hvor værdi automatisk øges, ved enten at bruge mysql_insert_id() ( php funktion ) eller lave en query hvor mysql henter det ( mysql funktion )

$nytrow = mysql_query("INSERT INTO tabel VALUES (NULL, 'et eller andet'") or die (mysql_error());

// php løsning
$idref = mysql_insert_id();

// mysql løsning
$idref = mysql_result(mysql_query("SELECT LAST_INSERT_ID()"),0);

Begge er lige gode, så længe feltet IKKE er af typen BIGINT
Avatar billede Slettet bruger
12. august 2010 - 20:27 #13
ahhhh jamen det var fordi i din php løsning skriver han jo

$id = mysql_insert_id($databaseforbindelse);

Det var det der forvirrede mig.

Men nu virker det.

Smid et svar :)
Avatar billede ggxdg Nybegynder
13. august 2010 - 13:13 #14
$Title = mysql_real_escape_string($_REQUEST["title"]);
$Type = mysql_real_escape_string($_REQUEST["type"]);

$Type_arr = explode(", ",$Type);

$query = mysql_query("insert into main (title) values ('$Title')");

$refid = mysql_insert_id();

$Type_ins_arr = array();
foreach($Type_arr as $Type_val)
{
  $Type_ins_arr[] = "('".$Type_val."','".$refid."')";
}
$Typ_que = "insert into type (type,refid) values ".implode(",",$Type_ins_arr);
$query = mysql_query($Typ_que);


smider lige et lille foreslag, inspireret af showsources tidligere insert fra da du skulle have delt din tabel op :P
Avatar billede showsource Seniormester
14. august 2010 - 01:54 #15
Jeg lægger et svsr.
Og til #14:
Det giver ikke rigtig mening at bruge mysql_real_escape_string() på et array.
FØrst når hver værdi hentes ud, gi'r det mening.
Avatar billede ggxdg Nybegynder
15. august 2010 - 14:10 #16
Jeg tror godt jeg ved hvad du mener.
$_REQUEST['type'] er vel en string, men det er nok lidt dumt at escape kommaerne, før man bruger explode på den. I sin array-form er det heller ikke så smart, men i foreach'en kan man vel bruge den på de explodede enkeltværdier, eller har jeg den helt forkerte idé af $_REQUEST[]?
Avatar billede showsource Seniormester
15. august 2010 - 22:44 #17
$_REQUEST[] bør man holde sig langt fra, hvis du spørger mig, brug altid det du forventer, GET eller POST

$array = array(1,2,3,4);

mysql_real_escape_string($array);

er nytteløs.
Avatar billede ggxdg Nybegynder
16. august 2010 - 08:10 #18
Jeg kan ikke lige se hvor det er jeg bruger den på et array...

$array = array(1,2,3,4);

mysql_real_escape_string($array[1]);

ville vel være fint?

Med det sagt, er det nok stadig ikke nogen god idé at bruge escape, på en string der skal explodes, før den er exploded :P
Avatar billede ggxdg Nybegynder
16. august 2010 - 08:14 #19
$Title = $_REQUEST["title"];
$Type = $_REQUEST["type"];

$Type_arr = explode(", ",$Type);

$query = mysql_query("insert into main (title) values ('".mysql_real_escape_string($Title)."')");

$refid = mysql_insert_id();

$Type_ins_arr = array();
foreach($Type_arr as $Type_val)
{
  $Type_ins_arr[] = "('".mysql_real_escape_string($Type_val)."','".$refid."')";
}
$Typ_que = "insert into type (type,refid) values ".implode(",",$Type_ins_arr);
$query = mysql_query($Typ_que);


er nok lidt mere rigtigt :)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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