Wiederholen einer Prozedur

Lektor21

Erfahrenes Mitglied
Hallo! :)

Also ich habe ein kleines Script, indem ich eine ID generiere und prüfe ob diese schon vorhanden ist! Und danach lege ich die ID in der Datenbank an!

Wie kann man, wenn die ID bereits vorhanden ist, die Generierung wiederholen?

PHP:
if ($my_ID == "")
{
$pool = "0123456789";

srand ((double)microtime()*1000000);

for($index = 0; $index < 5; $index++)
{
$my_ID .= substr($pool,(rand()%(strlen ($pool))), 1);
}

$queryid = "SELECT ID FROM friends WHERE ID = '$my_ID'";
$resultid = mysql_query($queryid) OR die(mysql_error());
$numid=mysql_num_rows($resultid);

if ($numid == "0")
{
setcookie ("my_ID", "$my_ID", time() + 16070400);

$sql = "INSERT INTO friends (ID) VALUES ('$my_ID')";
mysql_query($sql) or die(error_reporting());
}
else
{

########## ? #############

}
}
 
Hallo

dafür gibt es Schleifen mit Bedingungen das wäre in PHP while bzw. do ... while, abgesehn davon ist es vielleicht aber ratsam die ID per Auto_Inkrement(Sql) zu vergeben dann müsstest du dich um die ID-Vergabe nicht kümmern.

mfg :)
 
PHP:
do {
	$id = generateRandId();
	$alreadyExists = mysql_num_rows(mysql_query('SELECT 1 FROM `foo` WHERE `id` = "'.$id.'"'));
} while( $alreadyExists );
 
Also in SQL kann ich das nicht machen, weil ich die ID ja ganz allein in einer Datenbank ablege und die ID dann in ein Cookie speichere!

Achso, reicht es auch wenn ich einfach;

PHP:
setcookie ("my_ID", "$my_ID", time() + 16070400);
benutze oder sollte man eine URL noch anfügen? Also nicht dass der Benutzer mal auf einer Seite kommt wo die gleiche Variable vorkommt und er dann irritiert wird!
 
Die Do-while-Schleife ist notwendig, da mindestens einmal eine ID erzeugt werden muss. Bei jedem Durchlauf wird also eine neue zufällige ID erzeugt und geprüft, ob es bereits einen Datensatz mit dieser ID gibt. Der Rückgabewert dieser Prüfung ($alreadyExists) ist dann die Bedigung für die Wiederholung.

Eine zufällige ID kann übrigens dann von Vorteil sein, wenn diese nach außen hin als Identifikation dient. Denn es gab schon eine Menge Angriffe, bei der die numerische, fortlaufende Benutzer-ID einfach auf 1 gesetzt wurde und damit (wie in den meisten Fällen) der Administrator identifiziert wird. Eine zufällige ID verschleiert dies.
 
Ok danke schonmal!

Habs mal eingebaut und da kommt folgendes;

Fatal error: Call to undefined function generateRandId() in /web/Portal/index.php on line 25

Was ist der Fehler?

PHP:
if ($my_ID == "")
{

do 
{
$my_ID = generateRandId();
$alreadyExists = mysql_num_rows(mysql_query('SELECT 1 FROM `friends` WHERE `id` = "'.$my_ID.'"'));
} while( $alreadyExists );

setcookie ("my_ID", "$my_ID", time() + 16070400);

$sql = "INSERT INTO friends (ID) VALUES ('$my_ID')";
mysql_query($sql) or die(error_reporting());

}
 
Der Fehler ist:
Fatal error: Call to undefined function generateRandId() in /web/Portal/index.php on line 25
Genauer gesagt: Du gehst davon aus, dass es bereits eine Funktion namens generateRandId() gibt. Ich habe sie aber als Platzhalter genommen, andessen Stelle du die tatsächliche Funktion oder den tatsächlichen Algorithmus setzen musst.

Etwas solltest du auch schon mitdenken, Lektor.
 
Bzw. bin nich wo anders!?

Er macht irgendwie gar nichts! Danach werde ich erst mal schlafen gehen :p

PHP:
if ($my_ID == "")
{

function generateRandId()
{

$pool = "0123456789";

srand ((double)microtime()*1000000);

for($index = 0; $index < 5; $index++)
{
$my_ID .= substr($pool,(rand()%(strlen ($pool))), 1);
}

}

do 
{
$my_ID = generateRandId();
$alreadyExists = mysql_num_rows(mysql_query('SELECT 1 FROM `friends` WHERE `id` = "'.$my_ID.'"'));
} while( $alreadyExists );

setcookie ("my_ID", "$my_ID", time() + 16070400);

$sql = "INSERT INTO friends (ID) VALUES ('$my_ID')";
mysql_query($sql) or die(error_reporting());

}
 
Zurück