Unieke ID maken in php

Status
Niet open voor verdere reacties.

Royzilla

Gebruiker
Lid geworden
10 apr 2014
Berichten
187
Hee ik vond hier op dit forum aardig goeie antwoorden op vragen van andere mensen en wil dus ook graag mijn fout/vraag hier melden.

Ik wil een uniek ID aanmaken. Het eerste gedeelte bestaat uit de afkorting van een land en het 2e gedeelte bestaat uit een teller die steeds moet oplopen. ik zal even een voorbeeldje noemen:
Iemand selecteert AUSTRALIA. Dan is de afkorting AUS en de eerste Request die dan aangemaakt wordt is dan AUS1. Als deze gesubmit is en opgeslagen wordt in een database moet het zo zijn dat als de volgende keer nog een Request gemaakt wordt het AUS2 wordt. ik heb een stukje code van wat ik zelf in elkaar geprutst heb maar ik ben geen geweldige programmeur vandaar ook dat ik om wat hulp vraag.
PHP:
function RequestId()
{
	$country =  $_GET['country_name'];
 	switch ($country)
	{
		case "AUSTRALIA":
		$_GET['RequestID'] = $_SESSION['teller']  ;
		$teller = $_GET['RequestID'] ;
		if($teller)
		{
			 $teller++;
			 echo "AUS".$teller;
		}
		break;
}

eerst had ik dit, maar het moet natuurlijk elke keer ergens uit gehaald worden maar dat werkt niet zoals hieronder, deze blijft altijd 1 geven.
PHP:
                          case "BELGIUM":
			  $teller = 1;
			  echo "BEL".$teller++;
			  $teller++;
			  break;
ik weet dus niet of dit nou allemaal zo geweldig is wat ik heb staan maar ik wil graag wat hulp hierbij, ALVAST BEDANKT!
 
Laatst bewerkt door een moderator:
Kun je niet iets als uniqid gebruiken? hier staat uitleg daarover: http://www.php.net/manual/en/function.uniqid.php
Anders zou je ergens op moeten slaan hoever je nu bent, en dan niet in een session, een session bewaard alleen gegevens van een sessie tussen de browser en de server.(net als een cookie, maar verloopt sneller en wordt op de server opgeslagen.)
 
Dankjewel voor je snelle reactie en bedankt over de uitleg van SESSION.

nee ik moet zegmaar de ID zelf maken, de afkorting van een land is onderdeel 1 en deel 2 moet een nummer zijn die opgeteld wordt, per land moet dit apart zijn. Maar ik zou niet weten hoe ik dit moet oplossen.
De afkortingen heb ik allemaal al in een land staan, getal 1 wordt er al achter gezet, maar hij moet de opgeslagen terughalen uit de database (bijv: NLD1) en de volgende keer dat er dan een request gemaakt wordt vanuit nederland moet dit komen NLD2 en dat steeds door.
 
Je kan een query op de database draaien waarin je kijkt hoeveel records bestaan waarin de afkorting zit.
Vervolgens doe je die count +1 en je hebt je nieuwe ID.
Dit kan alleen een probleem opleveren op het moment dat er veel mensen de website bezoeken.
 
@killermenace
Dat is inderdaad een goeie oplossing! Zou je me een beetje opweg kunnen helpen met een voorbeeldje?
Dat zou erg fijn zijn!

dankjewel voor je snelle reactie :)!
 
Hoe ziet je tabel er qua structuur uit? Dat maakt het makkelijker een voorbeeld geven ;)
 
PHP:
select count(afkorting)
from tabel
where lower(afkorting) like lower('phpvar_afkorting%')

count = teller van instanties
lower = alle chars lowercase maken. Maakt vergelijken van strings/varchars makkelijker. Je kan ook 'upper' gebruiken. Doe het omgekeerde, maakt er uppercase van.
% = wildcard die gelijk staat aan 0 of meer tekens.

Hier krijg je alleen een getal van terug hoeveel instanties er bestaan.
 
Dankjewel voor je reactie maar ik mag geen inhoudelijke informatie van de klant op het web plaatsen ;)
ik heb een kolom van Country en als een land geselecteerd is plaatst die prima de bijbehorende afkorting in een textbox. Alleen dan zet die er altijd 1 achter. Ookal is die al eerder aangemaakt, ik weet dat ik de opgeslagen request moet terughalen en er dan 1 bij moet optellen, maar hoe ik dat moet verwoorden in php code weet ik niet.
 
@killermenace dus in mijn geval zou het zo kunnen?

PHP:
SELECT count(RequestID)
FROM DowntimeRequest
WHERE upper(RequestID) like upper('phpvar_RequestID%')

en dan nog ergens die 1 erbij optellen?
 
phpvar_RequestID is nog wel een php variabele.
Zo als je die nu hebt gaat het niet werken.
 
Hmm oke, kan je me helpen door dat stukje code te kunnen combineren met dit wat in de switch staat?

PHP:
	function RequestId()
	{
		
		$country =  $_GET['country_name'];
 		switch ($country)
		{
			case "AUSTRALIA":
			  $teller = 1;
			  echo "AUS".$teller;
			  $teller++;
			  break;
			
			case "BELGIUM":
			  $teller = 1;
			  echo "BEL".$teller;
			  $teller++;
			  break;
			  
			case "BRAZIL":
			  $teller = 1;
			  echo "BRA".$teller;
			  $teller++;
			  break;
		}
	}

De $_GET['country_name'];
komt uit een dropdown list even ter informatie :).
 
Laatst bewerkt:
Is het geen optie om AUS te combineren met een date/time op de milliseconde nauwkeurig ?
De kans op dubbelen is dan nihil.
 
Best als je een unieke waarde wil kan je ook het id in de database geven waar let je best op

stel je hebt aus000000001 nu dat getal acheraan kan voor problemen zorgen dat de voorloopnullen verdwijnen in sommige gevallen
nu als je je database instelt met 100000001 dan heb je nooit voorloop nullen die kunnen fout gaan wordt veel gebruikt bij bedrijven om fouten te voorkomen zie productcodes ectra maar dan zal je ook om het niet idioot te laten uitzien starten met 035 als de eerste nul wegvalt dan kan je voorloopnullen fout detecteren voor het probleem echt groot is en kan je met een korte bewerking toch het juiste laten vinden .

of je berekend een intersectie van je waardes data en of met sha1 erover

of je gebruikt iets als (met nadien controle op het al dan niet al bestaan ervan) bij een lengte van 20 zal het iets duren wanneer er dubbels vallen nu om te vermijden dat je veel moet hermaken van sleutel ga je controleren of het aantal genoeg is door simulatie
PHP:
	private function generatekey($lengte){
			/**
			* @author By eprogrammeur
			*/
		  srand(((double) microtime() ) * 1000000 );$string = '';
// De parser doet irri met zoveel tekens zonder spaties achter elkaar, verdeeld  over meerdere regels
		  $tekens = 'abcdefghijklmnopqrstuvwxyz';
		  $tekens .= 'ABCDEFGHIJKLMNOPQRSTUWXYZ';
		  $tekens .= '01234567890123456789';
		  for( $i = 0; $i < $lengte; $i++ ){  
		  	$string .= $tekens{ rand( 0, ( strlen( $tekens ) - 1 ) ) };
		  }
		  return $string;
	}
Mod-edit: Je loopt hier nu al zo lang rond, dan verwacht ik dat je ondertussen weet dat we code liever tussen code-tags hebbensorry het zal nooit meer gebeuren ;) (denk hoop ik)
 
Laatst bewerkt:
Nee sorry die manier wil ik niet gebruiken, Ik wil de eerde benoemde optie gebruiken maar ik heb geen idee hoe ik dat met die switch die ik heb gekoppeld krijg.
 
Een $_GET-variabele binnen een functie gebruiken is eigenlijk "not done".
Die kun je beter via een parameter meegeven aan de functie ;)

(De database zo in een functie gebruiken ook niet, beter is het om het via een klasse te regelen en het mysqli-object naar de klasse te sturen als klasse-variabele)
PHP:
<?php
function RequestId($countryName)
{
    // Altijd hoofdletters
    $countryName = strtoupper($countryName);
    
    // Query het aantal records:
    $mysqli = new mysqli("host", "user", "password", "database");
    // Query aanpassen aan de database
    if($stmt = $mysqli->prepare("SELECT COUNT(id) AS countId FROM table WHERE countryCode=?")) {
        $stmt->bind_param("s", $countryName);
        $stmt->execute();
        $stmt->bind_result($numCountryCode);
        $stmt->fetch();
        $stmt->close();
        $numCountryCode++;
    }
    $uniqueCountryCode = false;
    
    switch ($countryName)
    {
        case "AUSTRALIA":
            $uniqueCountryCode = "AUS"+ $numCountryCode;
        break;
        
        case "BELGIUM":
            $uniqueCountryCode = "BEL"+ $numCountryCode;
        break;
        
        case "BRAZIL":
            $uniqueCountryCode = "BRA"+ $numCountryCode;
        break;
    }
    
    return $uniqueCountryCode;
}

// Aanroep:
$uniqueId = RequestId($_GET['country_name']);

Als je altijd de eerste drie letters van een land gebruikt kun je het ook nog optimaliseren door dit te doen:
PHP:
<?php
function RequestId($countryName)
{
    // Altijd hoofdletters
    $countryName = strtoupper($countryName);
    
    // Query het aantal records:
    $mysqli = new mysqli("host", "user", "password", "database");
    // Query aanpassen aan de database
    if($stmt = $mysqli->prepare("SELECT COUNT(id) AS countId FROM table WHERE countryCode=?")) {
        $stmt->bind_param("s", $countryName);
        $stmt->execute();
        $stmt->bind_result($numCountryCode);
        $stmt->fetch();
        $stmt->close();
        $numCountryCode++;
    }
    
    return substr($countryName, 0, 3) + $numCountryCode;
}

// Aanroep:
$uniqueId = RequestId($_GET['country_name']);
 
Laatst bewerkt:
Heel erg bedankt voor deze reactie want hier kan ik zeker iets mee!

Alleen ik heb nog een vraagje, waar komt numCountryCode vandaan?

syntax error, unexpected '$numCountryCode' (T_VARIABLE) on line 36

PHP:
    if($stmt = $mysqli->prepare("SELECT COUNT(id) AS countId FROM RequestDowntime WHERE RequestID=?")) {
        $stmt->bind_param("s", $country);
        $stmt->execute();
        $stmt->bind_result($numCountryCode);
        $stmt->fetch();
        $stmt->close()
        $numCountryCode++;

het gaat om de onderste lijn: $numCountryCode++
 
Ik zie dat ik op de regel er voor een ; ben vergeten, ik pas mijn voorbeeld aan
 
Oh haha, die had ik ook niet gezien, dankjewel!

Alleen nu krijg ik een probleem en dat had ik eerder moeten vermelden beetje dom van me, ik werk met sqlsrv en als ik dat toepas werkt het niet.

met msqli krijg ik deze error:
Call to undefined function mysqli() on line 28
PHP:
 $mysqli = mysqli($serverName, $connectionInfo);

met sqlsrv:
Call to a member function prepare() on a non-object
dit heb ik dan neer gezet en bovenaan wordt verbinding gewoon correct gemaakt dus gebruik ik de '$link' i.p.v $mysqli
PHP:
if($stmt = $link->prepare("SELECT COUNT(id) AS countId FROM RequestDowntime WHERE RequestID=?")) {
        $stmt->bind_param("s", $country);
        $stmt->execute();
        $stmt->bind_result($numCountryCode);
        $stmt->fetch();
        $stmt->close();
        $numCountryCode++;
}

maar dan krijg ik het probleem dat die bind_param niet kan vinden
 
Dankjewel voor de tips! Ik heb op de site gekeken en snap het nu wel wat meer maar toch is het beter als je een probleempje heb dat een ander hem kan beantwoorden.Bovenaan de pagina staat de informatie die in $serverName en $connectionInfo zitten om hem te connecten. Die heb ik er even buiten gelaten. Hier zit het probleem niet in de connectie maar in de sqlsrv_prepare object.Het probleem zit hem hierin:
PHP:
$link = sqlsrv_connect( $serverName, $connectionInfo);
if( $link === false )
{
	echo "Unable to connect.";
	die( print_r( sqlsrv_errors(), true));
}
function RequestId($country){
    // Altijd hoofdletters
    $country = strtoupper($country);
    // Query het aantal records:
    // Query aanpassen aan de database
    if($stmt = $link->sqlsrv_prepare("SELECT COUNT(RequestID) AS countId FROM RequestDowntime WHERE RequestID=?")) {
        $stmt->bind_param("s", $country);
        $stmt->sqlsrv_execute();
        $stmt->bind_result($numCountryCode);
        $stmt->sqlsrv_fetch();
        $stmt->sqlsrv_close();
        $numCountryCode++;
    }
Hij zegt dit als ik hem uitvoer:Call to a member function sqlsrv_prepare() on a non-object ik heb echt geen idee meer hoe dit kan? Zou hier graag wat hulp bij willen en eventueel wat uitleg.ben ik al wat verder en is me error dit:sqlsrv_prepare() expects parameter 1 to be resource, null given
PHP:
$link = sqlsrv_connect( $serverName, $connectionInfo);
if( $link === false )	{
    echo "Unable to connect.";
    die( print_r( sqlsrv_errors(), true));
}
function RequestId($country){
    // Altijd hoofdletters
    $country = strtoupper($country);
    // Query het aantal records:
    $sql="SELECT COUNT(RequestID) AS countId FROM RequestDowntime WHERE RequestID=?";
    // Query aanpassen aan de database
    if($stmt = sqlsrv_prepare($link, $sql)) {
        $stmt->bind_param("s", $country);
        $stmt->sqlsrv_execute();
        $stmt->bind_result($numCountryCode);
        $stmt->sqlsrv_fetch();
        $stmt->sqlsrv_close();
        $numCountryCode++;
    }
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan