2015-05-24 3 views
1

Я использую AngularJS (Front end), Slim Framework (Back end), PHP и MySQL. Я пытаюсь проверить как электронную почту пользователя, так и пароль с сохраненными значениями базы данных, но я могу войти с неправильным адресом электронной почты и паролем. Я не вижу, где моя проблема. Пожалуйста, помогите мне! Вот мой кодКак проверять логин с помощью Slim PHP

login.html

<form novalidate name="SigninForm" id="add-new-form" method="post" action=""> <div class="form-group"> 
    <label for="first_name">Email:</label> 
    <input class="form-control" type="text" ng-model="user.email" required /> 
</div> 

<div class="form-group"> 
    <label for="address">Password:</label> 
    <input class="form-control" type="text" ng-model="user.password" /> 
</div> 
    <button class="btn btn-primary" ng-disabled="SigninForm .$invalid || isUnchanged(user)" id="login" ng-click="signin(user)">Login!</button></form> 

app.js

angular.module('CrudApp', []). 
    config(['$routeProvider', function($routeProvider) 
{ 
    $routeProvider. 
when('/', {templateUrl: 'assets/tpl/home.html', controller: HomeCtrl}). 
when('/login-user', {templateUrl: 'assets/tpl/login.html', controller: LoginCtrl}). 
otherwise({redirectTo: '/'}); 
}]); 
function HomeCtrl($scope, $http) 
{ 
    $http.get('api/users').success(function(data) 
    { 
    $scope.users = data; 
    }); 
} 
function LoginCtrl($scope, $http, $location) { 
    $scope.master = {}; 
    $scope.activePath = null; 
    $scope.signin = function(user, AddNewForm) { 
    $http.post('api/login_user', user).success(function(){ 
     $scope.reset(); 
     $scope.activePath = $location.path('/list-user'); 
     //alert('No access available.'); 
    }); 
    $scope.reset = function() { 
     $scope.user = angular.copy($scope.master); 
    }; 
    $scope.reset(); 
    }; 
} 

index.php

<?php 

require 'Slim/Slim.php'; 

$app = new Slim(); 

$app->post('/login_user', 'login'); 

$app->run(); 


function login()              
{ 
    $request = Slim::getInstance()->request(); 
    $user = json_decode($request->getBody()); 
    $email= $user->email; 
    $password= $user->password; 

if(!empty($email)&&!empty($password)) 
    { 
     $sql="SELECT name, email FROM user WHERE email='$email' and password='$password'"; 
     $db = getConnection(); 
    try { 
     $result=$db->query($sql); 

       if (!$result) { // add this check. 
         die('Invalid query: ' . mysql_error()); 
       } 
     $row["user"]= $result->fetchAll(PDO::FETCH_OBJ); 
     $db=null; 
     echo json_encode($row); 

    } catch(PDOException $e) 
    { 
     error_log($e->getMessage(), 3, '/var/tmp/php.log'); 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
    } 
} 

function getConnection() { 
    $dbhost="127.0.0.1"; 
    $dbuser="root"; 
    $dbpass=""; 
    $dbname="TQA"; 
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

?> 
+0

Привет! Помог ли вам ответ ниже? Если да, примите это. Это может помочь другим людям найти решение аналогичной проблемы. –

ответ

0

Проблема заключается в том, что вы возвращает успешный результат независимо пользовательский ввод. Apache, nginx и встроенный веб-сервер PHP возвращают HTTP-код 200 по умолчанию для запросов, с которыми они могли бы справиться без проблем. Поскольку ваш маршрут явно не работает, кажется, что для вашего сервера все в порядке с запросом/ответом.

Вы должны, например, вернуть ответ с кодом 400 (Плохой запрос), если пользователь отправляет форму по электронной почте или паролю пустым. Кроме того, вы можете вернуть код 401 (Unauthorized), если в базе данных не найдено ни одного пользователя, соответствующего данному письму и паролю.

Вы можете обратиться к http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html за дополнительной информацией о кодах состояния HTTP.

При использовании правильных кодов состояния, функция login может выглядеть примерно так:

function login() 
{ 
    $app = Slim::getInstance(); 
    $request = $app->request(); 
    $user = json_decode($request->getBody()); 
    $email = $user->email; 
    $password = $user->password; 
    if (empty($email) || empty($password)) { 
     $error = 'Email and password are required'; 

     // Bad request 
     return jsonResponse($error, 400); 
    } 
    $sql = "SELECT name, email FROM user " 
     . "WHERE email = '$email' AND password = '$password'"; 
    $db = getConnection(); 
    $row = array(); 
    try { 
     $result = $db->query($sql); 
     if (!$result) { 
      $error = 'Invalid query: ' . mysql_error(); 

      // Internal server error 
      return jsonResponse($error, 500); 
     } 
     $user = $result->fetchAll(PDO::FETCH_OBJ); 
     if (empty($user)) { 

      // Unauthorized 
      return jsonResponse($error, 401); 
     } 
     $row["user"] = $user; 
     $db = null; 
    } catch(PDOException $e) { 
     error_log($e->getMessage(), 3, '/var/tmp/php.log'); 
     $error = array('error' => array ('text' => $e->getMessage())); 

     // Internal server error 
     return jsonResponse($error, 500); 
    } 

    // OK, default is 200 
    return jsonResponse($row); 
} 

В коде выше я использую следующую функцию, чтобы избежать повторения кода. Это не часть Slim или PHP, поэтому, если вы хотите использовать ее, добавьте ее в свой проект.

function jsonResponse($data, $code = 200) 
{ 
    $app = Slim::getInstance(); 
    $app->response->setStatus($code); 
    $app->response->headers->set(
     'Content-type', 
     'application/json; charset=utf-8' 
    ); 
    return $app->response->setBody(json_encode($data)); 
} 
Смежные вопросы