Проверка Codeigniter превращает строку запроса в массив - PullRequest
1 голос
/ 21 августа 2011

Недавно я столкнулся с очень странной ошибкой. Я пишу функцию сброса пароля, но я испытываю очень странную ошибку, с которой я никогда не сталкивался. Каким-то образом проверка формы превращает мой запрос в пустой массив.

Вот мой код:

public function password_reset()
{
    if ($this->auth_model->is_logged_in()) redirect ('welcome');

        $userid = $this->uri->segment(3);
        $code = $this->uri->segment(4);

        $this->db->select('forgot_password, id');
        $this->db->from('users');
        $this->db->limit(1);
        $this->db->where('id',$userid);
        $q = $this->db->get();

    if (!is_numeric($this->uri->segment(4, 0)) == TRUE && !is_numeric($this->uri->segment(3, 0)) == TRUE) die;

        if ($q->row('forgot_password') == $code) {

            $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]');
            $this->form_validation->set_rules('confirm_password', 'Confirm', 'required|min_length[4]');

            if ($this->form_validation->run() !== false) {

                if ($this->input->post('password') != $this->input->post('confirm_password')) exit("wrong");

                $update = array (
                    'password' => sha1($this->input->post('password'))
                );

                $id = $q->row('id');

                $this->db->where('id', $id);
                $this->db->update('users', $update);
                echo $this->db->last_query();
                die; // Don't mind the last 2 lines, they were made for debugging purposes.

                echo "Password is reset";

            } $this->load->view('auth/password_reset');

        }

}

Обратите внимание на эту строку: $ id = $ q-> row ('id');

Здесь начинается проблема.

Если я повторю эту строку, получу «Массив», я попытался сделать print_r для нее, но это, кажется, полностью пустой массив.

Однако, если я попробую повторить

$q->row('id');

до

if ($this->form_validation->run() !== false) {

тогда я получу то, что ожидается, в моем случае это будет целое число, но опять же, как только проверка формы будет пройдена, оно превратит мое целое число в пустой массив.

Итак, проверка формы каким-то образом превращает мою строку запроса в массив.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

Лучше использовать result_array() и проверить первые записи по параметру ...

$q = $this->db->select('forgot_password, id')
              ->from('users')
              ->limit(1)
              ->where('id',$userid)
              ->get();
$res = $q->result_array();
$forgot_password = (count($res[0]) == 1) $res[0]['forgot_password'] : FALSE;
...
// And change this line
// if ($q->row('forgot_password') == $code) {
// into
if ( ! $forgot_password)
{
   // Theres no record match with $userid
}
elseif($forgot_password == $code)
{
   // Everythings fine...
}
else
{
   // Theres a record match with $userid, but the $code not match
}
0 голосов
/ 21 августа 2011

Где вы используете это:

$q = $this->db->get();
//...
if ($q->row('forgot_password') == $code) {

Вы должны получить объект, используя row() только один раз, а затем ссылаться на свойства этого объекта, а не вызывать row() снова и снова.

Итак, чтобы помочь вам решить эту проблему (могут быть другие проблемы с вашим кодом, но мы не узнаем об этом, пока не решим эту проблему), попробуйте что-то вроде этого:

$row = $this->db->get()->row();

Получает результат (первый ряд).Готово, теперь у вас есть результат, сохраненный в объекте, и вам не нужно извлекать его снова.

Теперь, когда вы хотите сослаться на свойство этого объекта, значение столбца в этом случае,Вы бы использовали это:

if ($row->forgot_password == $code) {}
//
$id = $row->id;

И так далее.Еще раз прочитайте документы, чтобы узнать больше: http://codeigniter.com/user_guide/database/results.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...