• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

ID

Mathmos

Neues Mitglied
Hallo,

ich arbeite mich momentan ein bischen in php und mysql ein.
Nun habe ich allerdings mal ein paar Fragen.

Ich benutze bisher auto increment um in der datenbank eine vortlaufende id zu erzeugen.
Allerdings wird bei vielen einträgen eine große Zahl zustande kommen.
Da habe ich mir gedacht, um die ID niedrig zu halten könnte man wie es bei vielen URL-kürzern gemacht wird die ID wie folgt aufbauen.

1. 1-9
2. a-z
3. A-Z
(der 62 Eintrag hätte dann die ID 11
der 71 Eintrag hätte dann die ID 1b)

So hätte man 61 Möglichkeiten bei nur einer Stelle.
Wie würde man das ganze am einfachsten schreiben?
Ich habe schon ein bisschen rum probiert, aber ein ansatzweise gescheites Ergebnis kam nicht bei rum ;)

Meine andere Frage wäre, wie die URL-kürzer das machen, das sie hinter der domain direkt die ID anhängen.
Verstehen würde ich es ja, wenn dann zb index.php?id=xyz stehen würde.

Wenn jemand gerade nicht versteh, was ich meine, zb einfach auf Deutscher URL Shortener - Url krzen in Deutschland, Kurzurls gucken.
 
Stand vor diesem Problem auch einmal und konnte keine vernünftige "auto_increment"-Lösung finden. Habe als Alternative nach Zufallsprinzip einen kurzen String generieren lassen und in der DB überprüft, ob dieser bereits existiert. Wenn nicht, wurde er eingetragen, ansonsten wurde ein neuer generiert, ...

Zur zweiten Frage: Das wird meist mit dem Apache-Modul mod_rewrite gemacht. aus seite.php?id=12 wird seite_12.html | modrewrite.de

Gruß
 
Du könntest außerdem anstatt die Id noch ein zusätzliches Feld erstellen, was für den zugriff zuständig ist.
Dafür liest du beim eintragen eines neues Eintrages vorher die letzte id aus. z.B.
Code:
Select `id` from `table` Ordner By `id` DESC Limit 1;

Es gibt bestimmt auch noch eine schönere Query, die ich grade nicht gefunden habe.
Jedenfalls hast du dann die letzte id. Diese erhöhst du um 1 und wendest danach deine Umwandlung in deine Kurz-Url an.
Dann lässt du das ganze in die Datenbank eintragen.
Dieses Feld mit Kurzurls ist dann natürlich auch unique aber halt nicht der Primärschlüssel
 
Soweit ich Mathomas verstehe geht es ihm nicht um die Ersetzung der IDs an sich, sondern darum, die IDs vom Dezimalsystem auf ein anderes umzurechnen. Das sollte ohne Probleme möglich sein, man muss sich halt nur einen Konverter schreiben. Wobei das was du da zeigst (den url verkürzer) ist wohl eher ein einfacher Kompressionsmechanismus.

[EDIT:] Wobei vielleicht auch nicht. Es dürfte genau der beschriebene Mechanismus sein.
 
Die einfachste Lösung dürfte diese Funktion sein: PHP: base_convert - Manual

PHP:
$id = 12345;
echo "$id  kurz => " . fromDec($id) . '<br>';

$id_out = fromDec($id);

echo "$id_out lang =>  " . toDec($id_out) . '<br>';


function fromDec($num) {
	return base_convert($num, 10, 36);
}
function toDec($num) {
	return base_convert($num, 36, 10);
}
 
Erstmal danke =)

struppi, du konntest mir ungemein weiter helfen.
Deine Lösung war auch gut, allerdings waren keine Großbuchstaben integriert.
Ich habe in den Comments bei base_convert eine Lösung gefunden, die auch Großbuchstaben einbindet.
Diese funktioniert auch soweit.
Allerdings verstehe ich die Funktionsweise nicht so ganz.
Evt kann mir ja jemand diese Erläutern.

PHP:
Here is a much simpler and faster version of  the "custombase_convert" function proposed by Mr.Fips (see below). My  functions convert decimals to and from custom bases:

<?php
// Decimal > Custom
function dec2any( $num, $base=62, $index=false ) {
    if (! $base ) {
        $base = strlen( $index );
    } else if (! $index ) {
        $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base );
    }
    $out = "";
    for ( $t = floor( log10( $num ) / log10( $base ) ); $t >= 0; $t-- ) {
        $a = floor( $num / pow( $base, $t ) );
        $out = $out . substr( $index, $a, 1 );
        $num = $num - ( $a * pow( $base, $t ) );
    }
    return $out;
}
?>
Parameters:
$num - your decimal integer
$base - base to which you wish to convert $num (leave it 0 if you are providing $index or omit if you're using default (62))
$index - if you wish to use the default list of digits (0-1a-zA-Z), omit this option, otherwise provide a string (ex.: "zyxwvu")

<?php
// Custom > Decimal
function any2dec( $num, $base=62, $index=false ) {
    if (! $base ) {
        $base = strlen( $index );
    } else if (! $index ) {
        $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 0, $base );
    }
    $out = 0;
    $len = strlen( $num ) - 1;
    for ( $t = 0; $t <= $len; $t++ ) {
        $out = $out + strpos( $index, substr( $num, $t, 1 ) ) * pow( $base, $len - $t );
    }
    return $out;
}
?>
Parameters:
$num - your custom-based number (string) (ex.: "11011101")
$base - base with which $num was encoded (leave it 0 if you are providing $index or omit if you're using default (62))
$index - if you wish to use the default list of digits (0-1a-zA-Z), omit this option, otherwise provide a string (ex.: "abcdef")

I have optimized the functions as much as I could, I hope they'll be helpful to someone.
 
Der Autor dieses Codes legt eine maximale Zahlenbasis von 62 fest. Durch den substr-Befehl kürzt er die Anzahl der möglichen Zeichen und somit seine Basis auf die gewünschte Basis. Danach folgt eine Konvertierung von dem üblichen Dezimalsystem auf das gewünschte Zahlensystem um, wieso er dieses so berechnet findest du hier durch rumspielen heraus... ;)
 
Das mit den Großbuchstaben würde ich mir noch mal überlegen.

Wie du an dem Code siehst, wird dort mit pow und Mulitplikationen, für jede Stelle, gerechnet. Da du dies bei jedem Aufruf, für jede ID in beide Richtungen machen musst kann dass evtl. zu spürbaren Geschwindigkeitseinbußen kommen. Vor allem wenn sich das wirklich lohnen soll, bewegen wir uns in einem astronomischen Zahlenbereich und ich bezweifle stark, dass du jemals wirklich davon profitieren würdest. (Zumal ja auch der Wertebereich einer ID in einer Datenbank begrenzt ist).
 

Neueste Beiträge

Zurück
Oben