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); 

返品の代わりに、ユーザーが複数のアイテムを購入できるようにしたい(返品の代わりに追加しても機能します)。

4

2 に答える 2

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 を参照渡ししていないことに気付きました。これにより、さらなる問題が発生します。上記 (2 番目の例) に変更を加えましたが、このコードはベスト プラクティスとは言えません。

于 2013-02-02T17:47:31.757 に答える
0

@leftclickben が上記で述べたことすべてに同意しますが、もう 1 つ観察事項を追加したいと思います。への呼び出しに続くコードで$error_messageとの値を使用しているようですが、関数で値を変更するには、シンボルを使用して参照で渡す必要があります。$success_messageproduct()&

関数プロトタイプを次のように変更します

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

値の変更は、関数が戻った後に利用可能になります。

于 2013-02-02T17:52:15.400 に答える