2

私はPHPとSQLを学び始めたばかりなので、気楽にやってください。特定の場所で間違っていることはわかっています。ユーザーがログインしてパスワードを変更できるようにしようとしています。動作するはずのスクリプトを試してみましたが、php 関数ページにリンクするだけでパスワードをまったく変更しないため、何か間違っていると思います。これが私のスクリプトです:

HTML フォーム:

<form method="POST" action="includes/changepassword.php">
<p><input type="password" name="oldpasswd" id="oldpasswd" maxlength="30" placeholder="Old Password"></p>
<p><input type="password" name="newpsswd1" id="newpsswd1" maxlength="30" placeholder="New Password"></p>
<p><input type="password" name="newpsswd2" id="newpsswd2"maxlength="30" placeholder="Confirm Password"></p>
<input type="submit" name="submit" id="submit" value="change password">

changepassword.php ファイル:

 <?php
require_once("session.php"); 
require_once("functions.php");
require('_config/connection.php');
function changepassword ($oldpasswd, $newpasswd1, $newpasswd2) {
    /*
     * RETURNS
     * 0 - if password changed
     * 1 - if new passwords are not equal
     * 2 - if user authentification problems
     */


        $oldpasswd = ($_POST['oldpasswd']);
        $newpasswd1 = ($_POST['newpasswd1']);
        $newpasswd1 = ($_POST['newpasswd2']);




    if ($newpasswd1 != $newpasswd2) {
        return 1;
    }

    //check user logged in changes OWN passwd
    $sql = "SELECT password FROM ptb_users WHERE id = ".$_SESSION['user_id'];
    $result = mysql_query($sql)or die('User not found: ' . mysql_error());

    if (md5($oldpasswd)==$result) { 

        //Encrypt $emailpassword in MD5 format for the database
        $md5_np=md5($newpasswd1);

        // Make a safe query
        $query = sprintf("UPDATE `ptb_users` SET `password` = '%s' 
                    WHERE `id` = ".$_SESSION['user_id'],
                    mysql_real_escape_string($md5_np));

        mysql_query($query)or die('Could not update password: ' . mysql_error());
        return 0;
    } else {
        return 2;
    }


}   
?>

私は何を間違えましたか?

4

5 に答える 5

4

php関数ページにリンクするだけで、パスワードはまったく変更されません

まさにそれを行うように HTML フォームに指示しました: <form method="POST" action="includes/changepassword.php">. しかし一方で、関数を呼び出すことはありません。

于 2012-11-03T19:47:09.820 に答える
2

パスワードの変更を処理するには、関数を呼び出す必要があります。これをファイルの末尾の直前に追加します?>

echo changepassword($_POST['oldpasswd'], $_POST['newpasswd1'], $_POST['newpasswd2']);

関数内の $_POST 割り当てをパラメーターとして渡すときに、それらを削除することもできます。

于 2012-11-03T19:43:46.043 に答える
1

前述pokeのように、パスワードを更新するには関数を呼び出す必要があります。
次のコードで別の問題が見つかったと思います。

//check user logged in changes OWN passwd
$sql = "SELECT password FROM ptb_users WHERE id = ".$_SESSION['user_id'];
$result = mysql_query($sql)or die('User not found: ' . mysql_error());

if (md5($oldpasswd)==$result) { 

mysql_query()関数の結果を直接使用しています。この関数は、値ではなくリソースとして実際に返されます。

コードを次のように更新する必要があります。

//check user logged in changes OWN passwd
$sql = "SELECT password FROM ptb_users WHERE id = ".$_SESSION['user_id'];
$result = mysql_query($sql)or die('User not found: ' . mysql_error());
$row=mysql_fetch_assoc($result);
if (md5($oldpasswd)==$row['password']) { 

この関数-mysql_fetch_assoc()を参照してください。

于 2012-11-04T05:06:08.770 に答える
0

フォームフィールドの名前がchangepassword.phpにリストされているものと一致しません。「newpasswd1」と「newpasswd2」のはずの「a」が欠落していname=newpsswd1ますnewpasswd1

また、「newpasswd1」が2回リストされています

 $oldpasswd = ($_POST['oldpasswd']);
 $newpasswd**1** = ($_POST['newpasswd1']);
 $newpasswd**1** = ($_POST['newpasswd2']);

...おそらくこれを意味していると思います...

 $oldpasswd = ($_POST['oldpasswd']);
 $newpasswd**1** = ($_POST['newpasswd1']);
 $newpasswd**2** = ($_POST['newpasswd2']);

また、ボーンズ牧師とアビシェク・バティアによって提案された変更を取り入れましたが、今はうまく機能しています。(また、私はHTMLにフォームタグを閉じます)

全体がどのように見えるかを次に示します(私のサイト用に変更)。

HTMLフォーム

<form method="POST" action="changepassword.php">
<p><input type="password" name="oldpasswd" id="oldpasswd" maxlength="30" placeholder="Old Password"></p>
<p><input type="password" name="newpasswd1" id="newpasswd1" maxlength="30" placeholder="New Password"></p>
<p><input type="password" name="newpasswd2" id="newpasswd2"maxlength="30" placeholder="Confirm Password"></p>
<input type="submit" name="submit" id="submit" value="change password">
</form>

changepassword.php

function changepassword ($oldpasswd, $newpasswd1, $newpasswd2)
{
        $oldpasswd = ($_POST['oldpasswd']);
        $newpasswd1 = ($_POST['newpasswd1']);
        $newpasswd2 = ($_POST['newpasswd2']);

    if ($newpasswd1 != $newpasswd2)
    {
        return 1;
    }

    $sql = "SELECT Password FROM users WHERE UserID = ".$_SESSION['UserId'];
    $result = mysql_query($sql)or die('User not found: ' . mysql_error());
    $row=mysql_fetch_assoc($result);

    if (md5($oldpasswd)==$row['Password'])
    {
        $md5_np=md5($newpasswd1);
        $query = sprintf("UPDATE `users` SET `Password` = '%s' WHERE `UserID` ".$_SESSION['UserId'],mysql_real_escape_string($md5_np));

        mysql_query($query)or die('Could not update password: ' . mysql_error());
        return 0;
    }
    else
    {
        return 2;
    }
}   

echo changepassword($_POST['oldpasswd'], $_POST['newpasswd1'], $_POST['newpasswd2']);
于 2012-12-03T02:30:23.460 に答える
0

フォーム処理に関するチュートリアルを探してください。このフォーム チュートリアルにつまずいた場合、少し検索した後、理解しやすいように見えます。ほとんどのフォームが自分自身を呼び出していることがわかります。

formchangepassword.html

<form action="formchangepassword.html" method="post">

フォームの先頭には通常、フォームがpost(ボタンを押した後に) で呼び出されたか、または で呼び出されたかを決定するコードがありますget。このコードでは、CHANGEPASSWORD.PHP ファイルに記述した関数を呼び出すことができます。このファイルは単なるライブラリであり、関数が含まれています。この関数を呼び出すことはできますが、それ自体は実行されず、呼び出す必要があります。

<?php
  require_once("CHANGEPASSWORD.PHP");

  if(count($_POST) > 0)
  {
    // button was clicked, do what is necessary
    changepassword(...);
    ...
  }
?>
<form action="formchangepassword.html" method="post">
...
</form>
于 2012-11-03T20:52:50.330 に答える