LAST_INSERT_ID of mysql_insert_id lukt niet.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Inge V

Inge V

14/06/2012 09:13:43
Quote Anchor link
Hoi,
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>
 
PHP hulp

PHP hulp

15/11/2024 14:57:20
 
Erwin H

Erwin H

14/06/2012 09:21:44
Quote Anchor link
Als je bedoelt dat je echt een nieuw script laadt, dan betekent het een nieuwe connectie met je database, dus dan kan het inderdaad niet. Het ophalen van het laatst ingevoegde id is alleen mogelijk per connectie en zonder het uitvoeren van andere queries er tussen.

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.
 
Bart V B

Bart V B

14/06/2012 09:26:08
Quote Anchor link
Een paar tips, maak geen onnodige variabele aan.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>
Gewijzigd op 14/06/2012 09:26:32 door Bart V B
 
Erwin H

Erwin H

14/06/2012 09:40:10
Quote Anchor link
Toevoeging op Bart:
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$string
= "INSERT INTO keuze (keuzeID, klasID, docentID)
    VALUES ('',"
.(int)$_POST['klas'].",".(int)$_POST['docent'].")";
?>
 
Inge V

Inge V

14/06/2012 09:48:04
Quote Anchor link
@Erwin, kan je een voorbeeld geven hoe dat werkt met het doorgeven via een POST of hidden input?

@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.
 
Bart V B

Bart V B

14/06/2012 09:50:26
Quote Anchor link
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.. ;)
 
Reshad F

Reshad F

14/06/2012 09:55:28
Quote Anchor link
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 :)
 
Bart V B

Bart V B

14/06/2012 09:56:15
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
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
 
Erwin H

Erwin H

14/06/2012 10:00:03
Quote Anchor link
Na je query doe je (ongeveer) het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$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.. ;)


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.

NIET doen. Als iemand in twee verschillende schermen met twee verschillende dingen bezig is krijg je een groot probleem!
 
Bart V B

Bart V B

14/06/2012 10:14:49
Quote Anchor link
Dat php een ietsje te flexibele taal is ben ik het met je eens.
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..
 
Erwin H

Erwin H

14/06/2012 10:19:21
Quote Anchor link
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.
 
Bart V B

Bart V B

14/06/2012 10:32:10
Quote Anchor link
:) En als ik nou eens een script kiddie zou zijn en het formulier aanpas?
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.
 
Inge V

Inge V

14/06/2012 11:30:52
Quote Anchor link
Om het keuzeID te halen uit het vorig script heb ik nu een sessie gebruikt en het werkt^^ Dankjewel.

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.
 
Obelix Idefix

Obelix Idefix

14/06/2012 22:42:01
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.