2013-02-02 70 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