LAST_INSERT_ID of mysql_insert_id lukt niet.
In script 1 INSERT ik gegevens. Je wordt dan doorgestuurd naar script 2. Hierin wil ik graag ervoor zorgen dat hij het vorig ID pakt uit script 1, maar de uitkomst wordt steeds 0. Wanneer ik mysql_insert_id in het script 1 zet, dan pakt ie em wel, maar daar heb ik die functie niet nodig. Hoe kan ik ervoor zorgen dat dit wel goed werkt?
Dit zijn delen uit mijn scripts:
1
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
if (empty($_POST))
{
//In onderstaand formulier staan dropdowns waar klas + docent gekozen kunnen worden. Wanneer op 'start' geklikt wordt, worden de ID's hiervan weggeschreven in de tabel 'keuze' en wordt er een keuzeID aangemaakt. Dan krijg je het volgende formulier te zien met een introductietekst. Bij klikken op 'verder' kom je op script 2.
?>
<form action="" method="post">
<input type="submit" value="start" name="start"/>
</form>
<?php
}
if (isset($_POST['start']))
{
$klasid = $_POST['klas'];
$docentid = $_POST['docent'];
$string = "INSERT INTO keuze (keuzeID, klasID, docentID)
VALUES ('','$klasid','$docentid')";
//echo $string;
//resultaat invoeren
$query = mysql_query($string);
?>
<form action="enquete.php" method="post">
<input type="submit" value="verder" name="verder"/>
</form>
<?php
}
?>
if (empty($_POST))
{
//In onderstaand formulier staan dropdowns waar klas + docent gekozen kunnen worden. Wanneer op 'start' geklikt wordt, worden de ID's hiervan weggeschreven in de tabel 'keuze' en wordt er een keuzeID aangemaakt. Dan krijg je het volgende formulier te zien met een introductietekst. Bij klikken op 'verder' kom je op script 2.
?>
<form action="" method="post">
<input type="submit" value="start" name="start"/>
</form>
<?php
}
if (isset($_POST['start']))
{
$klasid = $_POST['klas'];
$docentid = $_POST['docent'];
$string = "INSERT INTO keuze (keuzeID, klasID, docentID)
VALUES ('','$klasid','$docentid')";
//echo $string;
//resultaat invoeren
$query = mysql_query($string);
?>
<form action="enquete.php" method="post">
<input type="submit" value="verder" name="verder"/>
</form>
<?php
}
?>
2
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
//Hier krijg je het formulier met een enquete te zien. Bij het klikken op 'stoppen' worden de gegevens van de ingevulde enquete in de tabel 'resultaten' weggeschreven en wordt er een resultaatID aangemaakt. Het is de bedoeling dat het laatst ingevulde keuzeID wordt ingevuld bij de 'resultaten'.
?>
<form action="" method="POST">
<input type="submit" value="stoppen" name="submit"/>
<?php
if (isset($_POST['submit']))
{
//datum van vandaag
$datum = date("Y-m-d");
$keuzeID = mysql_insert_id();
//$keuzeID = mysql_query ("SELECT LAST_INSERT_ID()");
//echo "$keuzeID";
//resultaat invoeren
$query = mysql_query("INSERT INTO resultaten (resultaatID, keuzeID, datum, 1A, 1B, 1C, 1D, 2A, 2B,)
VALUES ('','$keuzeID','$datum','$antwoord1','$antwoord2','$antwoord3','$antwoord4','$antwoord5','$antwoord6')")
or die(mysql_error());
echo ("Bedankt voor het invullen van de Enquete. <br><br><br><br><br><br><br><br>");
}
?>
</form>
//Hier krijg je het formulier met een enquete te zien. Bij het klikken op 'stoppen' worden de gegevens van de ingevulde enquete in de tabel 'resultaten' weggeschreven en wordt er een resultaatID aangemaakt. Het is de bedoeling dat het laatst ingevulde keuzeID wordt ingevuld bij de 'resultaten'.
?>
<form action="" method="POST">
<input type="submit" value="stoppen" name="submit"/>
<?php
if (isset($_POST['submit']))
{
//datum van vandaag
$datum = date("Y-m-d");
$keuzeID = mysql_insert_id();
//$keuzeID = mysql_query ("SELECT LAST_INSERT_ID()");
//echo "$keuzeID";
//resultaat invoeren
$query = mysql_query("INSERT INTO resultaten (resultaatID, keuzeID, datum, 1A, 1B, 1C, 1D, 2A, 2B,)
VALUES ('','$keuzeID','$datum','$antwoord1','$antwoord2','$antwoord3','$antwoord4','$antwoord5','$antwoord6')")
or die(mysql_error());
echo ("Bedankt voor het invullen van de Enquete. <br><br><br><br><br><br><br><br>");
}
?>
</form>
Dus wat je kan doen, is het id ophalen in het eerste en via een GET of POST variabele (of hidden input als je het in een form zet) doorgeven aan het volgende script. De standaard manieren lijkt me.
Haal je variabelen uit de quotes, en doe aub aan wat beveiliging.
Insert_id() doe je direct na het inserten van je data in het eerste stukje.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
}
if (isset($_POST['start']))
{
$string = "INSERT INTO keuze (keuzeID, klasID, docentID)
VALUES ('','".mysql_real_escape_string($_POST['klas'])."','".mysql_real_escape_string($_POST['docent'])."')";
//echo $string;
//resultaat invoeren
$query = mysql_query($string);
//variabele maken van insert_id
$keuzeID = mysql_insert_id();
?>
}
if (isset($_POST['start']))
{
$string = "INSERT INTO keuze (keuzeID, klasID, docentID)
VALUES ('','".mysql_real_escape_string($_POST['klas'])."','".mysql_real_escape_string($_POST['docent'])."')";
//echo $string;
//resultaat invoeren
$query = mysql_query($string);
//variabele maken van insert_id
$keuzeID = mysql_insert_id();
?>
Gewijzigd op 14/06/2012 09:26:32 door Bart V B
Als de id's gewoon integers zijn dan is mysql_real_escape_string volkomen overbodig. Dan is het veel beter om ze niet tussen quotes te zetten in de query en te typecasten:
@Bart, als ik $keuzeID in script 1 zet zoals jij benoemd, dan kan mijn script 2 heel $keuzeID niet vinden, dus hij wil dat ID uit script 1 niet doorgeven aan het volgende script. Waarschijnlijk kan zoeits hoe Erwin het heeft, maar dan wil ik nog weten hoe.. Ik ga later de beveiliging van de query's er in zetten wanneer alles een beetje goed werkt.
Dus om het maar gewoon meteen voor eens en altijd aan te leren dat het veilig moet zijn is mysql_real_escape_string() misschien in dit geval voorlopig even genoeg.. ;)
Je moet standaard de beveiliging/foutafhandeling etc er in zetten niet als het pas werkt. dat is geen goed argument ervoor het is gewoon een belangrijk onderdeel van programmeren. je slaat hiermee 2/3 deel over van het programmeren en hoopt met 1/3 je script nu goed op te bouwen wat dus niet kan. je kan ook niet met 1/3e auto gaan rijden daar heb je een hele auto voor nodig :)
Quote:
@Bart, als ik $keuzeID in script 1 zet zoals jij benoemd, dan kan mijn script 2 heel $keuzeID niet vinden, dus hij wil dat ID uit script 1 niet doorgeven aan het volgende script. Waarschijnlijk kan zoeits hoe Erwin het heeft, maar dan wil ik nog weten hoe.. Ik ga later de beveiliging van de query's er in zetten wanneer alles een beetje goed werkt.
Dan zou ik eerder voor een session gaan.
Zo is het in elk script te gebruiken.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
session_start();
// query uitvoeren..
$_SESSION['keuzeID'] = mysql_insert_id();
?>
session_start();
// query uitvoeren..
$_SESSION['keuzeID'] = mysql_insert_id();
?>
Als je naar de volgende pagina gaat, dan kan je $_SESSION['keuzeID'] gewoon gebruiken. Vergeet alleen niet om session_start() bovenaan in het script te zetten ;)
Gewijzigd op 14/06/2012 09:56:56 door Bart V B
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$keuzeID = mysql_insert_id();
//binnen het form dat je hebt
echo '<input type="hidden" name="keuzeid" value="'.$keuzeID.'">';
?>
$keuzeID = mysql_insert_id();
//binnen het form dat je hebt
echo '<input type="hidden" name="keuzeid" value="'.$keuzeID.'">';
?>
Bart V B op 14/06/2012 09:50:26:
Kan erwin, alleen denk ik dat typecasten even ietsje te ver gaat om dit mee te nemen.
Dus om het maar gewoon meteen voor eens en altijd aan te leren dat het veilig moet zijn is mysql_real_escape_string() misschien in dit geval voorlopig even genoeg.. ;)
Dus om het maar gewoon meteen voor eens en altijd aan te leren dat het veilig moet zijn is mysql_real_escape_string() misschien in dit geval voorlopig even genoeg.. ;)
Mening uiteraard, maar daar ben ik het pertinent niet mee eens. Het probleem met php is al dat veel mensen beveiliging veel te licht opnemen. Alles kan, php zeurt er niet om, dus leren veel mensen het niet of verkeerd. Daar valt wat mij betreft het gebruik van mysql_real_escape_string op integers ook onder. Het helpt geen zier en het geeft alleen maar dat je er ooit iets over gehoord hebt, maar eigenlijk niet weet wat je aan het doen bent. typecasten is helemaal niets moeilijks en zou iedereen in de eerste programmeer les zo ongeveer moeten hebben leren. Zorgen dat een variabele van het juiste type is helpt bovendien nog meer te voorkomen dan alleen SQL injection (in dit geval).
Toevoeging op 14/06/2012 10:01:48:
Bart V B op 14/06/2012 09:56:15:
Dan zou ik eerder voor een session gaan.
Zo is het in elk script te gebruiken.
Dan zou ik eerder voor een session gaan.
Zo is het in elk script te gebruiken.
NIET doen. Als iemand in twee verschillende schermen met twee verschillende dingen bezig is krijg je een groot probleem!
Zelfs heel jammer dat je moet typecasten.
Ik zeg ook niet dat het moeilijk is, alleen dat de TS daar nog niet aan toe is.
Quote:
NIET doen. Als iemand in twee verschillende schermen met twee verschillende dingen bezig is krijg je een groot probleem!
Pardon?
De applicatie die de TS probeert te schrijven is een enquête..
Dan is een session de meest voor de hand liggende keuze om daar wat mee te doen.
Anders ben je wel heel onhandig bezig. ;)
Ik neem aan dat de applicatie nou nog net niet op terminals draait.
Overigens zou ik het dan niet eens met php willen maken..
Dan nog, het is geen sessie variabele, het is een variabele die over 1 vraag gaat, 1 pagina. Dat soort variabelen moet je niet in een sessie zetten. Wat in een sessie staat is beschikbaar voor alle pagina's en zou bedoeld moeten zijn voor alle pagina's. Dat is dit niet, dus een sessie is hier niet de juiste methode voor. Doorgeven via GET/POST/hidden input is precies waar het voor bedoeld is.
ok, we kunnen natuurlijk ook nog aan session hijacking doen natuurlijk.
Maar dat ter zijden. Het gaat me eigenlijk ook niet echt over de vragen en antwoorden. Maar meer om het gehele plaatje.
Ik zou in de session de informatie zetten zoals:
ip adres, id van de enquête, waar men is gebleven in de enquête e.d.
post's get's kan als je het allemaal in 1 script/pagina houd.
Maar in dit geval zou ik het over meerdere pagina's verdelen.
Zo zitten de meeste enquêtes in elkaar.
En voor de TS misschien wat handiger om te leren een betere opbouw te hebben.
Voor de rest moet er idd nog veel gebeuren aan mijn scripts, maar ik ben pas een paar maandjes begonnen met scripten, omdat het perse moest.. en echt leuk vind ik het niet XD en ik snap het hele scripten met PHP gewoon bijna niet.. en probeer er maar het beste van te maken en de meest makkelijke oplossingen te vinden, zodat de website enigzins nog werkt.
Inge V op 14/06/2012 11:30:52:
probeer er maar het beste van te maken en de meest makkelijke oplossingen te vinden, zodat de website enigzins nog werkt.
Ga alsjeblieft niet altijd voor de makkelijke oplossing, maar zorg altijd voor controle op input, een juiste foutafhandeling en waar nodig een goede beveiliging.
Een wachtwoord als 'plain text' opslaan in een database is een makkelijke oplossing, maar lijkt me niet dé oplossing.