2013-02-02 69 views
0

我制作了这种点系统,用户可以在这里使用点数。用户点数确实被扣除。我没有包含很多变数,但他们都没问题。问题发生在return($success)return($error_message)函数及其返回值的问题

下面是代码:

function died($error) { 
    header("Location: error_points_on.php?error=" . $error); 
    die(); 
} 

function success($success) { 
    header("Location: success_points_on.php?success=" . $success); 
    die(); 
} 
function quote_smart($value, $handle) { 

if (get_magic_quotes_gpc()) { 
$value = stripslashes($value); 
} 

if (!is_numeric($value)) { 
$value = "'" . mysql_real_escape_string($value, $handle) . "'"; 
} 
return $value; 
} 

function product($price,$points, $name, $uname, $error_message, $success_message) { 


    $user_name = "cencord"; 
    $pass_word = "cencord"; 
    $database = "cencord"; 
    $server = "cencord"; 

    $db_handle = mysql_connect($server, $user_name, $pass_word); 
    $db_found = mysql_select_db($database, $db_handle); 

if ($db_found) { // connect to DB 

      $uname = quote_smart($uname, $db_handle); 
      $SQL = mysql_query("SELECT points FROM members WHERE username=$uname"); 
      $points = mysql_fetch_row($SQL); 

      $points = $points[0]; // make it a variable rather then an array 


    if ($points >= $price) { 

     $points = $points-$price; // fjern points 

     $points = quote_smart($points, $db_handle); 

     mysql_query("UPDATE members SET points=$points WHERE username = $uname"); 

     $success_message .= "The " . $name . " has been mailed to your E-mail, please allow 5 minutes for it to arrive.<br />"; 
     return($success_message); 
    } 


     else if ($points < $price) { 

     $error_message .= "You have " . $points . " you need " . $price . " points to purchase a " . $name; 
     return($error_message); 
     } 

else if (!$db_found) { 
$error_message .= "Could not connect to the database, please contact support"; 
return($error_message); 
    } 
} 
} 



    if($Checked1 == true) { 
     product(400, $points, "Some string", $uname,  $error_message, $success_message); //price and name 
} 
    if($Checked2 == true) { 

     product(400, $points, "Some string", $uname,  $error_message, $success_message); 
} 



if(strlen($error_message) > 0) { 
    died($error_message); 
    } 
if(strlen($success_message) > 0) { 
    success($success_message); 
    } 

echo "error didnt pass at all"; 

我可以添加

header("Location: success_points_on.php?success=" . $success); 

,而不是一回的,但我希望用户能够购买多件商品,(加入它,而不是回报确实有效)。

+0

“问题发生了......”你能解释你打算发生什么,以及实际发生了什么? “当我输入x时,我希望看到y,但我看到z”? – Floris

+0

我说,下面的代码,对不起 “我可以添加 标题(”位置:?success_points_on.php成功=” $成功); ,而不是一回的,但我希望用户能够购买多个项目,(增加它,而不是一个回报没有工作) 提问者Ivan R“ –

+0

我很抱歉,但不清楚你打算发生什么,以及实际发生了什么。重复同样的事情通常不会使它更清晰。 “当我在我的代码中写入”xxx“的行时,并且用户正在尝试执行”yyy“,然后发生”zzz“,我希望发生”qqq“,指出”添加它而不是返回工作“对于愿意免费提供帮助但不愿意解读您的信息的人是不够的,我正在努力帮助您获得帮助。 – Floris

回答

0

你的逻辑嵌套是错误的。剔除内脏和只留下if语句,你有你的product()功能:

function product($price,$points, $name, $uname, $error_message, $success_message) { 
    if ($db_found) { // connect to DB 
     if ($points >= $price) { 
      $success_message = "blah"; 
      return($success_message); 
     } 
     else if ($points < $price) { // This if() part is redundant, btw 
      $error_message = "blah"; 
      return($error_message); 
     } 
     else if (!$db_found) { 
      $error_message .= "blah"; // This should be = instead of .= 
      return($error_message); 
     } 
    } 
} 

你要代替的是:

function product($price,$points, $name, $uname, &$error_message, &$success_message) { 
    if ($db_found) { 
     if ($points >= $price) { 
      $success_message = "blah"; 
      return($success_message); // this is redundant actually 
     } else { 
      $error_message = "blah"; 
      return($error_message); // this is redundant actually 
     } 
    } else { 
     $error_message = "blah"; 
     return($error_message); // this is redundant actually 
    } 
} 

我会强烈建议使用一些工具,如IDE可以保持您的代码格式正确,这将使这些类型的问题更容易看到。

编辑

我也只注意到你没有被引用,这将导致更多的问题传递$ ERROR_MESSAGE和$ success_message。上面所做的更改(在第二个示例中),但此代码仍然不是我所称的最佳实践。

+0

寻找我可以如何通过他们通过参考现在ty –

+0

我已经通过在参数名称的前面添加&: – leftclickben

+0

oh ty,did not see –

0

我同意上面所说的一切@leftclickben,但是想再补充一点观察。我似乎在代码中使用$error_message$success_message的值,但在要调用product()之后的代码中,如果要使函数更改其值,则必须使用&符号通过引用来引用它们。

你的函数原型更改为

function product($price,$points, $name, $uname, &$error_message, &$success_message) { 

,并在函数返回后的价值变动将可用。

+0

我已经修复了我的:-) – leftclickben

+0

Ty很多,我不知道变量没有改变,我也不知道传递参考,ty帮助,现在它的工作:) –

+0

@leftclickben - 伟大的思想想象一样。我没有看到你的编辑,你没有看到我的帖子... – Floris