Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
221 views
in Technique[技术] by (71.8m points)

thinkphp中,如果报错,怎么读懂提示的TRACE?

clipboard.png
以下是UserController

<?php
namespace HomeController;
use ThinkController;
use HomeModelCaptcha;

class UserController extends Controller {
    public function register() {
      if (IS_POST) {  // 判断当前HTTP请求是否为POST请求
         // 1. 创建数据表操作对象
         $userTable = D('users');
         // 2. 获取表单数据
         $userName = I('post.username');
         $userPswd = I('post.password');
         $userImage = I('post.image');
         $captcha = I('post.captcha');
         // echo $userName, ', ', $userPswd, ', ', $userImage, ', ', $captcha;
         // exit;
         if (Captcha::checkCaptcha($captcha, Captcha::REGISTER_CAPTCHA)) {  // 验证码正确
           // 3. 注册
           $r = $userTable->doUserRegister($userName, $userPswd, $userImage);
           if ($r) {
              $this->success('用户注册成功!', '/user/login');
           }
        } else {  // 验证码不正确,要求用户重新填写
            $this->error('验证码不正确,请重新填写!');
        }
      } else {  // 当前HTTP请求不是POST,说明是GET请求
        // 显示视图文件
        $this->assign('view_title', '用户注册');
        $this->display();
      }
    }

    public function login() {

    }

    public function logout() {

    }

    public function changepswd() {
        // 1. 创建数据表操作对象
       $userTable = D('users');
       // 2. 获取表单数据
       $userName = 'test1';
       $oldPswd = '111';
       $newPswd = '222';
       // 3. 注册
       $r = $userTable->doChangePswd($userName, $oldPswd, $newPswd);
       dump($r);
    }

    /**
     * 创建验证码图片
     * @param  string $atype 创建的是哪一个操作的验证码,默认为'register'
     * @return [type]        [description]
     */
    public function captcha($atype = 'register') {
      switch ($atype) {
        case 'register':
          Captcha::createCaptcha(Captcha::REGISTER_CAPTCHA);
          break;
          case 'login': 
          Captcha::createCaptcha(Captcha::LOGIN_CAPTCHA);
          break;
          default:
          Captcha::createCaptcha(Captcha::REGISTER_CAPTCHA);
          break;
      }
    }

}

以下是UserModel

<?php

namespace HomeModel;
use ThinkModel;

class UsersModel extends Model {
    // 当前数据表
    protected $trueTableName = "users";

    // 字段限定信息
    protected $_validate = array(
        // array('username', 'require'),
        array('password', 'require'),
        array('username', '','帐号名称已经存在!',0,'unique',1),
    );
    
    ////////////////////////////////////////////////////
    
    /**
     * 实现用户注册
     * @param  string $userName  用户名
     * @param  string $userPswd  用户密码
     * @param  string $userImage 用户头像的地址
     * @return mix            若用户注册成功,返回该记录的主键id;否则(失败)返回false
     */
    public function doUserRegister($userName, $userPswd, $userImage) {
        // // 1. 数据校验
        // if (empty($userName) || empty($userPswd)) {
        //     return false;
        // }
        if (empty($userImage)) {
            $userImage = '1.jpg';
        }
        // // 2. 判断用户是否存在(若用户已经存在,不能再注册该用户名)
        // if ($this->isUserExists($userName)) {
        //     return false;
        // }
        // 3. 实现注册操作
        $data['username'] = $userName;
        $data['password'] = $userPswd;
        $data['image'] = $userImage;
        // return $this->add($data);
        if ($this->create($data)) {   // 使用字段数据验证的话,必须显式地调用create()方法
            return $this->add();
        } 
        echo $this->getError();
        return false;
    }

    /**
     * 修改密码操作
     * @param  string $userName 用户名
     * @param  string $oldPswd  原始密码
     * @param  string $newPswd  新密码
     * @return boolean           若修改成功,返回true;否则返回false
     */
    public function doChangePswd($userName, $oldPswd, $newPswd) {
        // 1. 数据字段校验
        // 
        // 2. 判断原始密码和初始密码是否一致
        if ($oldPswd === $newPswd) {
            return false;
        }
        // 3. 验证原始密码
        if (!$this->isValidUser($userName, $oldPswd)) { // 当前不是有效用户,不能修改密码
            return false;
        }
        // 4. 修改密码
        $data['username'] = $userName;
        $data['password'] = $newPswd;
        return $this->where(array('username' => $userName))->save($data);
    }

    /**
     * 判断指定用户名的用户是否存在
     * @param  string  $userName 待判断的用户名
     * @return boolean           若用户名存在,返回true;否则返回false
     */
    public function isUserExists($userName) {
        // 1. 判断用户名是否有效
        if (empty($userName)) {
            return false;
        }
        // 2. 查询指定条件的记录个数
        $count = $this->where(array(
            'username'  =>  $userName
        ))->count();

        // 返回
        return 1 === $count;
    }

    /**
     * 判断指定用户名和密码的用户是否为有效用户
     * @param  string  $userName 用户名
     * @param  string  $userPswd 用户密码
     * @return boolean           若用户名和密码有效,则返回true;否则返回false
     */
    public function isValidUser($userName, $userPswd) {
        $count = $this->where(array(
            'username'  =>  $userName,
            'password'  =>  $userPswd,
        ))->count();
        return false !== $count;
    }
}

clipboard.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

现在URL是什么样的? 你先在控制器里建立个GET test()方法,里面就return "test";

把这个调通了再调数据处理的,怀疑现在是路由上有问题。


刚发现,你压根没use那个用户model类啊。

clipboard.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...