2

可能であれば、助けをお願いします。

リダイレクト後に$_GETが設定されたときにいくつかのメッセージを表示するために、2つの関数を作成しました。コードは次のとおりです。

function display(){
if(isset($_GET['cnf_upd']) && $_GET['cnf_upd'] == '1'){
  $value = "The update was successful!";
  $type = "confirm";
  construct_the_div($value, $type);
}
if(isset($_GET['err_upd']) && $_GET['err_upd'] == '1'){
  $value = "The Update failed.";
  $type = "error";
  construct_the_div($value, $type);
}
if(isset($_GET['cnf_del']) && $_GET['cnf_del'] == '1'){
  $value = "Deleted completely.";
  $type = "confirm";
  construct_the_div($value, $type);
}
if(isset($_GET['err_del']) && $_GET['err_del'] == '1'){
  $value = "Unable to delete.";
  $type = "error";
  construct_the_div($value, $type);
}
}
function construct_the_div($value, $type){
// creating a div to display the message results
$div = "<div class=\"{$type}Msg\">\n";
$div .= "<p>{$value}</p>\n";
$div .= "</div><!-- end of {$type}Msg -->\n";
echo $div;
}

私が作りたいのは、表示機能がどんどん長くなるので、可能であればifステートメントが1つ(または多くても2つ)になるように、表示機能を改善することです。したがって、GETの値は動的にif条件内にあり、プレフィックス'cnf_'がある場合は'confirmMsg'になり、プレフィックス'err_'がある場合は'errorMsg'になります。

このようなものを作ることは可能ですか?

4

4 に答える 4

1
function display() {
    $messages = array(
        'cnf_upd' => 'The update was successful!',
        'cnf_err' => 'The Update failed.!',
        // ...
        // add all error and confirm there
        // ...
    );
    foreach($_GET as $key => $value) {

        if(strpos($key, 'cnf_')===0) {
            $type = 'confirm';
            $value = isset($messages[$key])
                ? $messages[$key]
                : $key;
            construct_the_div($value, $type);
        }

        if(strpos($key, 'err_')===0) {
            $type = 'error';
            $value = isset($messages[$key])
                ? $messages[$key]
                : $key;
            construct_the_div($value, $type);
        }

    }
}
于 2013-02-04T14:34:49.963 に答える
0

アプローチが正しくありません。一度に 1 つのメッセージしか表示されないようです (「完全に削除された」と「削除できません」が同時に発生することはありません)。この方法でパラメーターを作成してみてください: ?msg=upd&msgType=cnf

function display(){
if (isset($_GET['msg']) && isset($_GET['msgType']))
{
  $messages = array('cnf_upd'=>'The update was successful!',
    'err_upd'=>'The update failed!',
    'cnf_del'=>'The deletion was successful!',
    'cnf_upd'=>'The deletion failed!',
  );
  if (isset($messages[$_GET['msgType'].'_'.$_GET['msg']))
    construct_the_div($messages[$_GET['msgType'].'_'.$_GET['msg']], htmlspecialchars($_GET['msgType']));
}

改善すべき点はまだたくさんありますが、最初はこれがよりクリーンで安全です。

于 2013-02-04T14:33:50.673 に答える
0

別の解決策を提案します。$_GET送信するメッセージに基づいてさまざまなパラメーターを設定する代わりに、 1 つのパラメーターを設定してその値を解析します。

// Start by setting integer constants:
define(CNF_UPD, 1);
define(ERR_UPD, 2);
define(CNF_DEL, 3);
define(ERR_DEL, 4);

次に、値 un を設定するときに、次$_GETの定数を使用します。

// Build the URL with a deletion error...
header("Location: http://example.com/script.php?msg=" . ERR_DEL);

最後に、 a を使用しswitchてそれらを解析します

if (isset($_GET['msg'])) {
  switch ($_GET['msg']) {
    case CNF_UPD:
      // Updated...
      break;
    case ERR_UPD:
      // failed...
      break;
    // etc...
    default:
      // invalid code.
  } 
}

confirm/error/confirm/error整数定数にのパターンを使用する場合、 を取得することでそれがどれであるかを判断できます$_GET['msg'] % 2。奇数は確認、偶数はエラーです。もちろん、これをレイアウトする方法は他にもたくさんあります。たまたま、あなたが使用した交互の順序でそれらを入力しただけです。たとえば、確認には正の整数を、エラーには負の整数を使用することもできます。

$type = $_GET['msg'] % 2 == 1 ? $confirm : $error;

これは、複数のメッセージを使用するように簡単に拡張できます。これらは整数値であるため、カンマ区切りのリストを安全に作成できexplode()、受信時にそれらを作成できます。

$messages = implode(array(ERR_DEL,CNF_UPD));
header("Location: http://example.com/script.php?msg=$messages");
于 2013-02-04T14:30:02.613 に答える
0

$_GET パラメーターに基づいて $value と $type を何らかの方法で生成できない限り (どのように行うかわかりません)、次のようにすることができます。

$messages = array();
$messages[] = array('id' => 'cnf_upd', 'value' => 'The update was successful!', 'type' => 'Confirm');
$messages[] = array('id' => 'err_upd', 'value' => 'The Update failed.', 'type' => 'error');
...
foreach ($messages as $message) {
    if(isset($_GET[$message['id']]) && $_GET[$message['id']] == '1'){
        construct_the_div($message['value'], $message['type']);
    }
}
于 2013-02-04T14:37:02.667 に答える