项目实战篇-餐馆管理系统—MFC,PHP,MySql:3.MFC端Person类及个人信息修改

来源:互联网 发布:业务流程数据化的例子 编辑:程序博客网 时间:2024/05/18 01:45

上一次我们成功实现了登陆功能,这次先从MFC端的基类 Person类开始写起、、、
1.首先是PHP端的修改个人信息:

<?php    require_once("db_info.php");    $username = $_SESSION['user'];    $oldPsd = $_POST['oldPsd'];    $newPsd = $_POST['newPsd'];    $email = $_POST['email'];    $phone = $_POST['phone'];    $sql_username = "SELECT * FROM users WHERE username = '$username'";    $mysqli_result =  mysqli_query($con, $sql_username);    $row = mysqli_fetch_array($mysqli_result);    if (mysqli_num_rows($mysqli_result) == 0) {        die("FAILED|The username is not existed!");    }    if($row['username'] === $username){        if($oldPsd === $row['password']){            if (!empty($newPsd)) {                $sql_password="UPDATE users SET `password` = '$newPsd' WHERE username = '$username'";                mysqli_query($con, $sql_password);                echo "SUCCEED|Change password succeed!\n";            } else {                echo "FAILED|The new password is not empty!\n";            }        }        else{            if (!empty($oldPsd)) {                echo "FAILED|The password is incorrect!\n";            }        }        if(!empty($phone)){            $sql_phone="UPDATE users SET `phone` = '$phone' WHERE username = '$username'";            mysqli_query($con, $sql_phone);            echo "SUCCEED|Change phone number is succeed!\n";        }        if(!empty($email)){            $sql_email="UPDATE users SET `email` = '$email' WHERE username = '$username'";            mysqli_query($con, $sql_email);            echo "SUCCEED|Change email is succeed!\n";        }    }else{        echo "FAILED|Could't find the user!\n";    }?>

$_SESSION[‘user’]的创建是在登陆PHP login.php 中的:
这里写图片描述

2.MFC端
通过 PHP 代码我们可以知道,我们需要通过 POST 的方式传递四个参数 oldPsd,newPsd, email, phone、、、
这里写图片描述
但是我们要先创建个基类 Person 类,然后再讲未来的功能通过继承Person类而实现、、、

Person.h

#pragma onceclass Person{public:    Person(CString strUser, CString session);    CString getUser(void);    CString changeInformation(CString oldPsd, CString newPsd, CString phone, CString email); // 改动个人信息protected:    CString getSession(void); // 获取 Cookieprivate:    CString session; // 存取网站 Cookie PHPSESSID    CString strUser; // 存取用户名};

Person.cpp

#include "stdafx.h"#include "Person.h"#import "C:\\windows\\system32\\winhttp.dll"#define STRING_CHANGE_INFO_HOST_ADDRESS L"http://192.168.200.128/myAdminSystem/changeInfo.php"Person::Person(CString strUser, CString session){    this->session = session;    this->strUser = strUser;}CString Person::getUser(void){    return this->strUser;}CString Person::changeInformation(CString oldPsd, CString newPsd, CString phone, CString email){    CString strPostData = L"oldPsd=" + oldPsd + L"&newPsd=" + newPsd + L"&phone=" + phone + L"&email=" + email;    WinHttp::IWinHttpRequestPtr ptrHttp = nullptr;    ptrHttp.CreateInstance(__uuidof(WinHttp::WinHttpRequest));    if (0 != ptrHttp->Open(L"POST", STRING_CHANGE_INFO_HOST_ADDRESS))    {        CString Buffer = L"FAILED|服务器连接失败!";        return Buffer;    }    ptrHttp->SetRequestHeader(L"User-Agent", L" Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 50.0.2661.102 Safari / 537.36");    ptrHttp->SetRequestHeader(L"Content-Type", L"application/x-www-form-urlencoded");    ptrHttp->SetRequestHeader(L"Cookie", this->session.GetBuffer());    this->session.ReleaseBuffer();    ptrHttp->Send(strPostData.GetBuffer());    strPostData.ReleaseBuffer();    return ptrHttp->GetResponseText();}CString Person::getSession(void){    return this->session;}

再添加一个继承 CDialogEx 的窗口类用于我们更改信息,生成之后让我们生成的窗口类继承 Person 类
由于 Person 类含有带有参数的构造函数,所以窗口类的构造函数需要注意!

class ChangeInfomation : public CDialogEx, public Person{    DECLARE_DYNAMIC(ChangeInfomation)public:    ChangeInfomation(CString strUser, CString strSession, CWnd* pParent = NULL);   // 标准构造函数    virtual ~ChangeInfomation();// 对话框数据    enum { IDD = IDD_CHANGEINFOMATION };protected:    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持    DECLARE_MESSAGE_MAP()public:    afx_msg void OnBnClickedBtnCancle();    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);    afx_msg void OnBnClickedBtnConfirm();    CString strOldPsd;    CString strNewPsd;    CString strRepetPsd;    CString strPhone;    CString strEmail;};

构造函数的定义:

ChangeInfomation::ChangeInfomation(CString strUser, CString strSession, CWnd* pParent) : Person(strUser, strSession), CDialogEx(ChangeInfomation::IDD, pParent), strOldPsd(_T("")), strNewPsd(_T("")), strRepetPsd(_T("")), strPhone(_T("")), strEmail(_T("")){}

确认按钮被按下时的处理事件:

void ChangeInfomation::OnBnClickedBtnConfirm(){    // TODO:  在此添加控件通知处理程序代码    UpdateData(TRUE);    if (strNewPsd != strRepetPsd)    {        MessageBox(L"两次密码输入不一致!", L"Info", MB_OK | MB_ICONSTOP);        return;    }    else if (strOldPsd.GetLength() > 0)    {        if (strNewPsd.GetLength() < 6)        {            MessageBox(L"新密码长度不能小于 6!", L"Info", MB_OK | MB_ICONSTOP);            return;        }        if (strNewPsd.GetLength() > 20)        {            MessageBox(L"新密码长度不能大于 20!", L"Info", MB_OK | MB_ICONSTOP);            return;        }    }    if (0 == strNewPsd.GetLength()  &&        0 == strOldPsd.GetLength()  &&        0 == strPhone.GetLength()   &&        0 == strEmail.GetLength()   )    {        MessageBox(L"起码修改一个吧!", L"Info", MB_OK | MB_ICONSTOP);        return;    }    CString strRet = this->changeInformation(strOldPsd, strNewPsd, strPhone, strEmail);    MessageBox(strRet, L"Info", MB_OK | MB_ICONINFORMATION);}

IDD_CHANGEINFOMATION 的样式:
这里写图片描述
按下确认按钮后:
这里写图片描述
再让我们看看数据库中的情况:
这里写图片描述
数据全部都成功实现修改、、、

从0开始到现在已经三天了,本人学生党,MFC和PHP基本上都是从零开始,其中也遇到了不少的坑⊙﹏⊙
1.比如PHP端由于row里面的数据输错导致取不到正常的username,还错认为是Session出了问题,好在最后成功解决。^_^
2.MFC 端的 afxinet 奇怪的 Fiddler Bug,也真是醉了
3.还有就是一些需要加密的地方都没有去弄,直接进行数据库访问也没考虑会造成什么漏洞问题、、、自己会在不断的学习中补上
不管怎么说,还是很有趣的O(∩_∩)O、、、
最后也希望大神们能分享我一些经验^_^

0 0