2

私はまだPHPに比較的慣れていません。メンバーがトリガーされたイベント(プライベートメッセージ通知など)の自動電子メールをオプトアウトするためのプライバシー設定ページを作成しようとしています。データベースの設定に基づいてチェックボックスを自動的に設定したい。現在のところ、フォームはデータベースを正しく更新しますが、[送信]ボタンを2回押すか、ページを再読み込みしない限り、チェックボックスのステータスに正しい設定が表示されません。設定は、チェックされていない場合は「0」、チェックされている場合は「1」になります。これを処理するためにAjaxまたはjQueryを使用したいのですが、それらはまったくわかりません。

privacysettings.php

<?php
  $id = "";
  $pm_mail_able = "";
  $pm_email = "";

  if (isset($_GET['id'])) {
    $id = preg_replace('#[^0-9]#i', '', $_GET['id']); // filter everything but numbers
  } else if (isset($_SESSION['idx'])) {
    $id = $logOptions_id;
  } else {
    header("location: index.php");
    exit();
  }

  //query to get checkbox status
  $sql = mysql_query("SELECT * FROM members WHERE id='$id'");

  while($row = mysql_fetch_array($sql)){
    $pm_mail_able = $row['pm_mail_able'];
  }

  switch ($pm_mail_able) {
    case 0:
      $pm_setting = NULL;
      break;
    case 1:
      $pm_setting = "checked=\"checked\"";
      break;
  }

  if(isset($_GET['pm_email']) && !empty($_GET['pm_email'])) {
    $updateqry = mysql_query("UPDATE members SET pm_mail_able='1' WHERE id='$id'");
  } else {
    $updateqry = mysql_query("UPDATE members SET pm_mail_able='0' WHERE id='$id'");
  }

?>

<html>
    Email Notifications<br />

    <form name="testform" method="get" action="PvResult.php">
        When a friend sends me a private message
        <input type="checkbox" name="pm_email" value="on"<?php echo $pm_setting;?> />
        <br /><br />
        <input type="submit" value="Submit" />
    </form>
</html>

PvResult.php

<?php

  $url = 'http://www.mywebsite.com';

  //If the form isn't submitted, redirect to the form
  if(!isset($_GET['Submit']))
    header('Location: '.$url.'/privacysettings.php');

  //Redirect to the correct location based on form input
  $pm_email = $_GET['pm_email'];
  $url .= '/privacysettings.php?pm_email='.$pm_email;

  header('Location: '.$url);
?>
4

2 に答える 2

2

さて、これがあなたの質問に答えるだけでなく、考慮したいいくつかのベストプラクティスを提供してくれることを願っています.

これら 2 つのスクリプトを比較的簡単に 1 つに結合できます。また、GET の代わりに POST を使用することを強くお勧めします。GET は非常に制限されており、使用しているようなデータを送信するためのものではありません。バックエンド ストアのデータを変更しようとしている場合、GET を使用すると問題が発生します。今日ではないかもしれないし、明日ではないかもしれませんが、私を信じてください。

mysql_関数の代わりにPDO への移行を検討する必要があります。PDO は、パラメーター化されたクエリの処理においてはるかに優れています。これは、セキュリティを向上させるために実際にここで使用する必要があり、いつか別のデータベース システムに移動したい場合に移植性が高くなります。

あなたのアプリが $id を取得する方法については、まだ少しぼんやりしています。ほとんどのアプリは $_SESSION 変数から取得し、ユーザーがログインを正常に検証したことを確認します。そうでない場合は、そうしてくださいこの記事には、認証と「remember me」タイプの機能に関する有益なベスト プラクティスが多数含まれています。

ここで少し書き直します。実際にテストしたことはありませんが、差し迫ったニーズに合わせてどこに行くべきかについてのかなり良いアイデアを提供するはずです. エラーが発生した場合 (免責事項を覚えておいてください: 私は実際にテストしていません!)、私に知らせてください。デバッグを試みます。

<?php
$message = '';
$pm_setting = '';
$id = 0;

// Put your $id retrieval logic here.  It should look something like:
if (isset($_SESSION['id'])) {
    $id = $_SESSION['id'];
    if (!preg_match('/^\\d{1,10}$/', $id) > 0) {
        // Someone is trying to hack your site.
        header("location: scum.php");
        exit();
    }
    $id = intval($id);
}
// Quick security note: You might want to read up on a topic called
// session hijacking if you want to ensure your site is secure and
// this $id isn't spoofed.

if (isset($_POST['Submit'])) {
    // The form is being submitted.  We don't need to read the current
    // pm_mail_able setting from the database because we're going to
    // overwrite it anyway.
    if ($id > 0) {
        $pm_mail_able = 0;
        if (isset($_POST['pm_email']) && $_POST['pm_email'] === 'on') {
            $pm_mail_able = 1;
            $pm_setting = 'checked ';
        }
        $query = 'UPDATE members SET pm_mail_able='.$pm_mail_able.
            ' WHERE id = '.$id;
        mysql_query($query);
        // Another quick security note: You REALLY need to consider
        // updating to PDO so that you can bind these parameters
        // instead. The mysql_ functions are probably going to be
        // deprecated soon anyway.

        if (mysql_affected_rows($query) > 0)
            $message = '<p style="color: #00a000;">Settings saved!</p>';
        else
            $message = '<p style="color: #a00000;">User id not valid.</p>';
    }
    else
        $message = '<p style="color: #a00000;">User id not valid.</p>';
}

else {
    // This is the first load of the form, we need to just display it
    // with the existing setting.
    if ($id > 0) {
        $query = mysql_query('SELECT * FROM members WHERE id = '.$id);
        if (($row = mysql_fetch_array($query, MYSQL_ASSOC)) !== FALSE)
            if ($row['pm_mail_able'] === 1) $pm_setting = 'checked ';
    }
}

?>
<html>
    <body>
        <?= $message ?>
        <!-- Without action parameter, form submitted to this script. -->
        <form name="testform" method="post">
            E-mail notifications<br />
            <input type="checkbox" name="pm_email" value="on" <?= $pm_setting ?>/>
            When a friend sends me a private message
            <br /><br />
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>
于 2012-07-01T04:25:35.190 に答える
1

これらの設定を実行してみて、動作するかどうかを確認してください。

1) 「on」と「checked=checked」の間にスペースを追加する必要があります

<input type="checkbox" name="pm_email" value="on" <?php echo $pm_setting;?> />

2) 値ではなく名前で送信ボタンを参照する必要があります

<input type="submit" name="Submit" value="Send" />

3) 設定が「0」の場合$pm_setting、代わりに空文字列として設定NULL

case 0:
    $pm_setting = '';

4) 何らかの問題が$_GET['pm_email']あり、else常に実行されている可能性があります

5) [送信] ボタンを 2 回押して問題が解決しない場合は、フォームがコードを機能させる GET 変数を渡していることを意味するため、これがどの変数であるかを調べてみてください。

于 2012-07-01T03:47:10.333 に答える