Überprüfung eines strings

04/13/2013 18:45 Cookie1337™#1
Hätte eine frage bezüglich der Überprüfung eines Strings, und zwar geht es darum das ein 32 Stelliger Zufallswert generiert wird aus zahlen und Buchstaben das ganze dient so zu sagen als wieder Erkennung.

PHP Code:
function generate_ID($laenge=32) {
$zeichen '123456789abcdefghijklmnopqgrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

 
$zufalls_string '';
    
$anzahl_zeichen strlen($zeichen);
    for(
$i=0;$i<$laenge;$i++)
    {
        
$zufalls_string .= $zeichen[mt_rand(0$anzahl_zeichen 1)];
    }
    return 
$zufalls_string;

Der Ausgabewert wird an einer anderen stelle in einer Datenbank abgespeichert, wie könnte ich das jetzt umsetzten das vor dem speichern des Strings überprüft wird ob der String schon vorhanden ist mit denen die schon in der Datenbank vorhanden sind, und ggf. bei vorhanden sein ein neuer 32 stelliger String generiert wird ?
04/13/2013 19:05 MrPuschel#2
Für deinen Zweck wahrscheinlich sinvoller:
[Only registered and activated users can see links. Click Here To Register...]

Per SELECT mit WHERE prüfen ob ein Datensatz mit diesem String/Hash vorhanden ist. Ggf. UPDATE:
[Only registered and activated users can see links. Click Here To Register...]
04/13/2013 19:37 JPGaming#3
Also, wenn dir die 32 Zeichen egal sind, könntest du auch folgendes machen:

PHP Code:
$range array_merge (range ('a''z'), range ('A''Z'), range (09));
$string md5(rand(0count($range )); 
Daraufhin der Select
PHP Code:
$SQL "SELECT `needle` FROM `table` WHERE `key` = $string";
$return mysql_query($SQL); 
Du solltest den key in der Table indizieren, spart Zeit.
$return hat dann, je nachdem ob dieser existiert oder nicht, das Ergebnis worauf du prüfen kannst.

Ein Update kannst du wie folgt durchführen:
PHP Code:
$SQL "UPDATE`table` SET `key` = $string WHERE `needle` = 'DEINE NEEDLE'";
$return mysql_query($SQL); 
Auch hier bekommst du, sofern du sicherstellen willst, das du erfolgreich geupdated hast, einen Wert aus der Query.

Wenn du den Key einfach nur neu einfügen willst, oder ändern, ohne zu prüfen, ob dieser existiert, empfehle ich dir einen "REPLACE INTO". Spart Zeit.
04/13/2013 21:26 flickz.#4
PHP Code:
<?php

$db 
= new PDO("mysql:host=localhost;dbname=DATENBANK""root""passwort_halt");

function 
gen_key_32() {
    
$chars array_merge(range("A""Z"), range("a""z"), range(09));
    
$random null;
    for(
$i 0$i 32$i++) {
        
$random .= $chars[rand(0count($chars) - 1)];
    }
    return 
$random;
}

function 
key_exists_32($key$connection) {
    
$query $connection->prepare("SELECT * FROM TABELLE_HIER WHERE KEY_SPALTE = '{$key}'");
    
$db_h $query->execute();
    
$result $db_h->fetch(PDO::FETCH_ASSOC);
    
$length count($result);
    if(
$length >= 1) {
        return 
true;
    } else {
        return 
false;
    }
    return 
false;
}

$generated_key gen_key_32();
while(
key_exists_32($generated_key$db)) {
    
$generated_key gen_key_32();
}

//hier kannste den key ausgeben, abspeichern, whatever

?>
Habs nicht getestet, jedenfalls sollte dadurch ein String generiert werden der 32 Bytes lang ist und über while() wird immer wieder ein neuer Code generiert wenn er bereits in der Datenbank exestiert, andernfalls gehts ganz normal weiter und du kannst irgendwas mit "$generated_key" machen.
04/14/2013 10:49 JPGaming#5
Quote:
Originally Posted by flickz. View Post
PHP Code:
<?php

$db 
= new PDO("mysql:host=localhost;dbname=DATENBANK""root""passwort_halt");

function 
gen_key_32() {
    
$chars array_merge(range("A""Z"), range("a""z"), range(09));
    
$random null;
    for(
$i 0$i 32$i++) {
        
$random .= $chars[rand(0count($chars) - 1)];
    }
    return 
$random;
}

function 
key_exists_32($key$connection) {
    
$query $connection->prepare("SELECT * FROM TABELLE_HIER WHERE KEY_SPALTE = '{$key}'");
    
$db_h $query->execute();
    
$result $db_h->fetch(PDO::FETCH_ASSOC);
    
$length count($result);
    if(
$length >= 1) {
        return 
true;
    } else {
        return 
false;
    }
    return 
false;
}

$generated_key gen_key_32();
while(
key_exists_32($generated_key$db)) {
    
$generated_key gen_key_32();
}

//hier kannste den key ausgeben, abspeichern, whatever

?>
Habs nicht getestet, jedenfalls sollte dadurch ein String generiert werden der 32 Bytes lang ist und über while() wird immer wieder ein neuer Code generiert wenn er bereits in der Datenbank exestiert, andernfalls gehts ganz normal weiter und du kannst irgendwas mit "$generated_key" machen.
Bist du kritikfähig?

Wieso genau zählst du noch gleich die returns einer fetch? Wozu gibt es bools? emtpy functions?

md5 generiert automatisch einen 32'er Key. Wieso dann eine Foreach auf einen array merge 32 mal durchlaufen?
Wenn der Key in der Select bereits existiert, kann man die Funktion aus Rekursiv aufbauen. Dafür sind die Dinger da.

Dann sparst du dir auch diesen while Loop.