Archief - PHP/SQL: id ophalen direct na toevoegen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Mulle

Legacy Member
Hey,

Het is misschien een rare vraag.
Ik ben mijn site aan het herschrijven en probeer het aantal query's te beperken.
Het gebeurt veel dat ik gegevens in de database moet opslaan en daarna direct het id nummer van die rij nodig heb. Hoe haal je dat het best op?

Ikzelf zet alles er eerst in en daarna controleer ik alles met de waarden om zo de juiste id te krijgen. Daarvoor heb ik 2 query's nodig. Is het mogelijk om dat in 1 query te doen?


Hoeveel query's laat je best max. uitvoeren?
Bij mij zijn er soms 50 tot 70 query's dat er moeten uitgevoerd worden wat volgens mij wat aan de hoge kant is.

Alavst bedankt

Col.Kurtz

Legacy Member
50-70 per pagina ? :naughty:
Over wat voor een site hebben we het dan ? :)

Mulle

Legacy Member
Col.Kurtz zei:
50-70 per pagina ? :naughty:
Over wat voor een site hebben we het dan ? :)

Ik had een soort van reactie systeem gemaakt. In de tabel van reacties zitten er verschillende verwijzingen naar andere tabellen (users, categorie, ...). En hoe meer reacties er zijn hoe meer hij deze moet loopen. Als er 15 reacties zijn en moet elke keer 4 tabellen loopen zit je al rap boven de 60 queries.

Daarom dat ik site aan het herschrijven ben.

SideShow

Legacy Member
leg het eens beter uit en toon eens enkele van je queries :)

orez

Legacy Member
Mulle zei:
Ik had een soort van reactie systeem gemaakt. In de tabel van reacties zitten er verschillende verwijzingen naar andere tabellen (users, categorie, ...). En hoe meer reacties er zijn hoe meer hij deze moet loopen. Als er 15 reacties zijn en moet elke keer 4 tabellen loopen zit je al rap boven de 60 queries.

Daarom dat ik site aan het herschrijven ben.

zoek maar idd wa info over JOINS op, kan gebeuren me 1 simpele query :p

Mulle

Legacy Member
SideShow zei:
leg het eens beter uit en toon eens enkele van je queries :)
Als je een voorbeeld wilt:

PHP:
Dit is een stukje 
<?php
    $result = mysql_query_count("SELECT * FROM reacties WHERE type = '".$Type."' AND type_id = '".$Type_Id."' ORDER BY datum ASC") or die (mysql_error());
    if(mysql_num_rows($result) == '0'){
        $Bericht = "Er zijn nog geen reactie's geplaatst!.";

        $Tpl = new Template(LAYOUT_DIR.LAYOUT.'inhoud_simple_center.tpl');
        $Tpl->assignVar('INHOUD',$Bericht);
        $Tpl->fromSerialized(LAYOUT_DIR.LAYOUT.LAYOUT_SER.'inhoud_simple_center.ser');
        $OutputGeenReacties = $Tpl->getOutput();
    }
    while($row = mysql_fetch_array($result)){
        $ubb = new ubb($row['bericht']);

        $MebersInfo = member_info(FORUM_PREFIX,$row['poster']);

        $Tpl = new Template(LAYOUT_DIR.LAYOUT.'reacties.tpl');
        $Tpl->assignVar('MEMBERPOSTS',$MebersInfo['posts']);
        $Tpl->assignVar('MEMBERTITEL',$MebersInfo['titel']);
        $Tpl->assignVar('REACTIEDATUM',date("d/m/Y o\m\ H:i:s", $row['datum']));
        $Tpl->assignVar('MEMBER',member(FORUM_PREFIX,$row['poster']));
        $Tpl->assignVar('REACTIE',$ubb->get_parser());

        $Tpl->newBlock('Link');
        $Tpl->assignVar('LINK',"bericht".$row['id']);

        if($MebersInfo['avatar']){
            $Tpl->newBlock('ReactiePic');
            $Tpl->assignVar('MEMBERIMAGE',$MebersInfo['avatar']);
            $Tpl->assignVar('MEMBERIMAGEBREEDTE',$MebersInfo['avatar_breedte']);
            $Tpl->assignVar('MEMBERIMAGEHOOGTE',$MebersInfo['avatar_hoogte']);
        }

        if($row['edit'] == "1"){
            $Tpl->newBlock('Edit');
            $Tpl->assignVar('EDIT_POSTER',member(FORUM_PREFIX,$row['edit_poster'],true));
            $Tpl->assignVar('EDIT_DATUM',date("d/m/Y o\m\ H:i:s", $row['edit_datum']));
        }

        for($i=0;$i<$MebersInfo['pips'];$i++){
            switch($MebersInfo['pipsimg']){
                case 0:
                    $Tpl->newBlock('ReactiePipGeb');
                    break;
                case 1:
                    $Tpl->newBlock('ReactiePipMed');
                    break;
                case 2:
                    $Tpl->newBlock('ReactiePipBeh');
                    break;
            }
        }

        if($ButtonQuote){
            $Tpl->newBlock('ReactieQuote');
            $Tpl->assignVar('REACTIE_QUOTE',"?pagina=".$GetPagina."&".$GetPaginaid."=".$Type_Id."&optie=quote&reactie_id=".$row['id']."#bericht");
        }

        if(((int)$S_Login_Niv & (int)$D_Pagina_Niveau)==(int)$D_Pagina_Niveau){
            $Tpl->newBlock('ReactieEdit');
            $Tpl->assignVar('REACTIE_EDIT',"?pagina=".$GetPagina."&".$GetPaginaid."=".$Type_Id."&optie=edit&reactie_id=".$row['id']."#bericht");
            $Tpl->newBlock('ReactieDelete');
            $Tpl->assignVar('REACTIE_VERWIJDEREN_TITEL',"deze reactie");
            $Tpl->assignVar('REACTIE_VERWIJDEREN_OK',"?pagina=".$GetPagina."&".$GetPaginaid."=".$Type_Id."&optie=verwijderen&reactie_id=".$row['id']);
            $Tpl->assignVar('REACTIE_VERWIJDEREN_ANUL',"?pagina=".$GetPagina."&".$GetPaginaid."=".$Type_Id);
        }
        elseif($row['poster'] == $S_Login_Id){
            $Tpl->newBlock('ReactieEdit');
            $Tpl->assignVar('REACTIE_EDIT',"?pagina=".$GetPagina."&".$GetPaginaid."=".$Type_Id."&optie=edit&reactie_id=".$row['id']."#bericht");
            $Tpl->newBlock('ReactieDelete');
            $Tpl->assignVar('REACTIE_VERWIJDEREN_TITEL',"deze reactie");
            $Tpl->assignVar('REACTIE_VERWIJDEREN_OK',"?pagina=".$GetPagina."&".$GetPaginaid."=".$Type_Id."&optie=verwijderen&reactie_id=".$row['id']);
            $Tpl->assignVar('REACTIE_VERWIJDEREN_ANUL',"?pagina=".$GetPagina."&".$GetPaginaid."=".$Type_Id);
        }
        $Tpl->fromSerialized(LAYOUT_DIR.LAYOUT.LAYOUT_SER.'reacties.ser');
        $OutputPosts .= $Tpl->getOutput();
    }
?>

Er zit daar een functie "member_info()" in die gegevens van de geposte berichten bevat. In die functie zitten zekf al 2 queries.
Dus hij loopt dat boeltje en dus ook die functie. Daarom dat er zoveel query's zijn.

DarkBone

Legacy Member
'k Zou maar snel es wat informatie opzoeken over JOINS in de handleiding en via google.

Joins laten je toe gegevens uit meerdere tabellen te combineren via 1 query. Aangezien MySQL daarvoor geoptimaliseerd is, is het beter om dat te gaan gebruiken.

Boddah

Legacy Member
waarschijnlijk heb je hier niet veel aan, aangezien het precies mysql waarin je bezig bent. maar ik had hetzelfde 'probleem' (gebruik makend van SQL server en C#.net).

de truc is om SELECT @@IDENTITY te zetten in de stored procedure.
bv:
Code:
CREATE PROCEDURE ObjectInsert
(
	@id 	int,
	@name	nvarchar,
)
AS
	INSERT INTO users (id, name)
	VALUES (@id, @name)
	SELECT @@IDENTITY
GO

in de code doe je:
object o = sqlInsert.ExecuteScalar();
o zal de primary key waarde toegekend krijgen.

maT'

Legacy Member
toch even iets anders:
MebersInfo[], 't zou net iets properder zijn mocht het MembersInfo[] zijn, maar da's natuurlijk maar persoonlijk ;)

DarkBone

Legacy Member
maT' zei:
toch even iets anders:
MebersInfo[], 't zou net iets properder zijn mocht het MembersInfo[] zijn, maar da's natuurlijk maar persoonlijk ;)

hehe :D
had er zelf over gelezen :p

orez

Legacy Member
Boddah zei:
waarschijnlijk heb je hier niet veel aan, aangezien het precies mysql waarin je bezig bent. maar ik had hetzelfde 'probleem' (gebruik makend van SQL server en C#.net).

de truc is om SELECT @@IDENTITY te zetten in de stored procedure.
bv:
Code:
CREATE PROCEDURE ObjectInsert
(
	@id 	int,
	@name	nvarchar,
)
AS
	INSERT INTO users (id, name)
	VALUES (@id, @name)
	SELECT @@IDENTITY
GO

in de code doe je:
object o = sqlInsert.ExecuteScalar();
o zal de primary key waarde toegekend krijgen.


gij moe ier totaal ni me stored procedures werken... puur basic SQL gaat ook op mssql

dJeez

Legacy Member
De MySQL LAST_INSERT_ID() functie kan je uiteraard ook gebruiken.

Mulle

Legacy Member
maT' zei:
toch even iets anders:
MebersInfo[], 't zou net iets properder zijn mocht het MembersInfo[] zijn, maar da's natuurlijk maar persoonlijk ;)

Had ik zelf nog niet gezien. Ik heb gewoon die variabele elke keer gekopieerd. Dus niet op gelet. :doh:

Het correcte antwoord om via mysql de ID van de laatste insert op te vragen werd al gegeven hoor.

Ik weet nie of erover gekeken is, maar hier is em nog een keer:
http://be2.php.net/manual/en/functi...l-insert-id.php

mysql_insert_id();

Heb ik niet over gekeken, al gebruikt. Nog eens bedankt. :niceone:

Ik zal morgen eens wat info zoeken over die joins.


Bedankt iedereen.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan