我尝试运行以下功能
function newPlayer($wallet) {
generate_: {
$hash=generateHash(32);
}
if (mysql_num_rows(mysql_query("SELECT `id` FROM `players` WHERE `hash`='$hash' LIMIT 1"))!=0) goto generate_;
$alias='Player_';
$alias_i=mysql_fetch_array(mysql_query("SELECT `autoalias_increment` AS `data` FROM `system` LIMIT 1"));
$alias_i=$alias_i['data'];
mysql_query("UPDATE `system` SET `autoalias_increment`=`autoalias_increment`+1 LIMIT 1");
mysql_query("INSERT INTO `players` (`hash`,`alias`,`time_last_active`,`server_seed`) VALUES ('$hash','".$alias.$alias_i."',NOW(),'".generateServerSeed()."')");
header('Location: ./?unique='.$hash.'# Do Not Share This URL!');
exit();
}
我不确定为什么我的php会把这个意外的错误抛给我:在generate_:{的行 这个功能有什么问题吗?
我试图实现goto generate _;
如何在mysql_num_rows返回0 generateHash(32)
时更正我的代码答案 0 :(得分:1)
goto
真的不是你应该在这里使用的(或者,基本上,永远)。
最简单的实现只是将该行放在流程中的正确位置,因为您只在一个地方使用它:
if (mysql_num_rows(mysql_query("SELECT `id` FROM `players` WHERE `hash`='$hash' LIMIT 1"))!=0) {
$hash = generateHash(32);
}
如果你认为你将在很多地方使用它,以后可能会变得更复杂,那么就把它变成它自己的功能:
function generateHashForNewPlayer() {
return generateHash(32);
}
function newPlayer($wallet) {
if (mysql_num_rows(mysql_query("SELECT `id` FROM `players` WHERE `hash`='$hash' LIMIT 1"))!=0) {
$hash = generateHashForNewPlayer();
}
// etc
你也许可以用闭包做一些事情,但我无法想象为什么你需要在这里。它看起来像这样:
function newPlayer($wallet) {
$dynamic_function = function() {
return generateHash(32);
}
if (mysql_num_rows(mysql_query("SELECT `id` FROM `players` WHERE `hash`='$hash' LIMIT 1"))!=0) {
$hash = $dynamic_function();
}
// etc
编辑:再看一下你的代码,我意识到goto
这里实际上正在创建一个循环(或者如果它没有被破坏)。因此,您需要做的是将if
替换为while
:
while (mysql_num_rows(mysql_query("SELECT `id` FROM `players` WHERE `hash`='$hash' LIMIT 1"))!=0) {
$hash = generateHash(32);
}
答案 1 :(得分:0)
好吧,php没有使用:填写变量。你应该使用它;
$generate_ = { $has=generateHas(32); }
会解决您的错误,不确定您的脚本中是什么generate_。 PHP仅使用::来覆盖OOP等中的函数。