2012-03-15 45 views
0

我一直在努力讓這個工作正常,我想我終於想出了正確的解決方案,因爲當我登錄我的iphone它似乎工作正常。我對PHP很陌生,所以我想知道我是否犯了錯誤,或者是否可以改進。iphone與php的web服務通信 - 用戶名/密碼

我正在編寫一個Web服務的例子http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app

如果我輸入的用戶名和密碼有效,所有這些嘗試都是返回403。

<?php 

    // Helper method to send a HTTP response code/message 
    function sendResponse($status = 200, $body = '', $content_type = 'text/html') 
    { 
     $status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status); 
     header($status_header); 
     header('Content-type: ' . $content_type); 
     echo $body; 
    } 

    class RedeemAPI { 


     private $db; 

       // Constructor - open DB connection 
       function __construct() { 
       $this->db = new mysqli('127.0.0.1', 'username', 'password', 'promos'); 
       $this->db->autocommit(FALSE); 
      } 

      // Destructor - close DB connection 
      function __destruct() { 
       $this->db->close(); 
      } 


    function redeem() { 

     // Check for required parameters 





    if (isset($_POST["AccountEntry"]) && isset($_POST["PasswordEntry"])) { 



     // Put parameters into local variables 
       $AccountEntry = $_POST["AccountEntry"]; 
       $PasswordEntry = $_POST["PasswordEntry"]; 



        $user_id = 0; 
        $stmt = $this->db->prepare("SELECT username, password FROM usernames WHERE username=? AND password=?"); 

        $stmt->bind_param("ss", $AccountEntry, $PasswordEntry); 
        $stmt->execute(); 
         $stmt->bind_result($user, $pass); 
        while ($stmt->fetch()) { 
       break; 
      } 
      $stmt->close(); 




       if ($AccountEntry === $user && $PasswordEntry == $pass) { 
        sendResponse(403, 'YESSIRRRRR'); 
        return true; 

       } 


     } 
     sendResponse(400, 'Not working'); 
       return false; 
     } 


    } 

     $api = new RedeemAPI; 
     $api->redeem(); 

    //Extra helper functions 



    // Helper method to get a string description for an HTTP status code 
    // From http://www.gen-x-design.com/archives/create-a-rest-api-with-php/ 


    function getStatusCodeMessage($status) 
    { 
     // these could be stored in a .ini file and loaded 
     // via parse_ini_file()... however, this will suffice 
     // for an example 
     $codes = Array(
      100 => 'Continue', 
      101 => 'Switching Protocols', 
      200 => 'OK', 
      201 => 'Created', 
      202 => 'Accepted', 
      203 => 'Non-Authoritative Information', 
      204 => 'No Content', 
      205 => 'Reset Content', 
      206 => 'Partial Content', 
      300 => 'Multiple Choices', 
      301 => 'Moved Permanently', 
      302 => 'Found', 
      303 => 'See Other', 
      304 => 'Not Modified', 
      305 => 'Use Proxy', 
      306 => '(Unused)', 
      307 => 'Temporary Redirect', 
      400 => 'Bad Request', 
      401 => 'Unauthorized', 
      402 => 'Payment Required', 
      403 => 'Forbidden', 
      404 => 'Not Found', 
      405 => 'Method Not Allowed', 
      406 => 'Not Acceptable', 
      407 => 'Proxy Authentication Required', 
      408 => 'Request Timeout', 
      409 => 'Conflict', 
      410 => 'Gone', 
      411 => 'Length Required', 
      412 => 'Precondition Failed', 
      413 => 'Request Entity Too Large', 
      414 => 'Request-URI Too Long', 
      415 => 'Unsupported Media Type', 
      416 => 'Requested Range Not Satisfiable', 
      417 => 'Expectation Failed', 
      500 => 'Internal Server Error', 
      501 => 'Not Implemented', 
      502 => 'Bad Gateway', 
      503 => 'Service Unavailable', 
      504 => 'Gateway Timeout', 
      505 => 'HTTP Version Not Supported' 
     ); 

     return (isset($codes[$status])) ? $codes[$status] : ''; 
    } 

    // This is the first thing that gets called when this page is loaded 
    // Creates a new instance of the RedeemAPI class and calls the redeem method 


    ?> 

編輯:對不起,我是不是更清晰我主要想確保這段代碼是有效的,如果我正確地檢查用戶名/密碼。

if (isset($_POST["AccountEntry"]) && isset($_POST["PasswordEntry"])) { 



     // Put parameters into local variables 
       $AccountEntry = $_POST["AccountEntry"]; 
       $PasswordEntry = $_POST["PasswordEntry"]; 



        $user_id = 0; 
        $stmt = $this->db->prepare("SELECT username, password FROM usernames WHERE username=? AND password=?"); 

        $stmt->bind_param("ss", $AccountEntry, $PasswordEntry); 
        $stmt->execute(); 
         $stmt->bind_result($user, $pass); 
        while ($stmt->fetch()) { 
       break; 
      } 
      $stmt->close(); 




       if ($AccountEntry === $user && $PasswordEntry == $pass) { 
        sendResponse(403, 'YESSIRRRRR'); 
        return true; 

回答

2

首先,如果用戶名和密碼正確,您爲什麼要發送「未找到」?無論如何,那就是我所做的。這是完全不同的代碼,但它可以滿足你的要求。

//Connect To Database. I put 127.0.0.1 because that is what was in your code. It is usually "localhost" though. 
$conn = mysql_connect("127.0.0.1", "DATABASE-USER-NAME", "DATABASE-USER-PASSWORD") or  die(mysql_error()); 
mysql_select_db('DATABASE-NAME', $conn) or die(mysql_error()); 

//Put everything in variables 
$username = $_POST['AccountEntry']; 
$password = $_POST['PasswordEntry']; 
//Get the information from the database. 
$result = mysql_query("SELECT * FROM usernames WHERE username = '$username' && password = '$password'"); 
$num_rows = mysql_num_rows($result); 
//If there are one (1) result in the database, returning 403. 
if ($num_rows==1 || $num_rows=="1") { 
    //Correct passcode. Return 403 (thats what you wanted right?). 
    returnStatusCode(403); 
} else { 
    //Incorrect passcode. Return 400 (thats what you wanted right?). 
    returnStatusCode(400); 
} 
//send the headers... 
function returnStatusCode($code) { 
$status_header = 'HTTP/1.1 ' . $code . ' ' . getStatusCodeMessage($status); 
     header($status_header); 
     header('Content-type: text/html'); 
//Don't need the echo($body) since your body was empty anyway. 
} 
//I didn't change this: 
function getStatusCodeMessage($status) 
    { 
     // these could be stored in a .ini file and loaded 
     // via parse_ini_file()... however, this will suffice 
     // for an example 
     $codes = Array(
      100 => 'Continue', 
      101 => 'Switching Protocols', 
      200 => 'OK', 
      201 => 'Created', 
      202 => 'Accepted', 
      203 => 'Non-Authoritative Information', 
      204 => 'No Content', 
      205 => 'Reset Content', 
      206 => 'Partial Content', 
      300 => 'Multiple Choices', 
      301 => 'Moved Permanently', 
      302 => 'Found', 
      303 => 'See Other', 
      304 => 'Not Modified', 
      305 => 'Use Proxy', 
      306 => '(Unused)', 
      307 => 'Temporary Redirect', 
      400 => 'Bad Request', 
      401 => 'Unauthorized', 
      402 => 'Payment Required', 
      403 => 'Forbidden', 
      404 => 'Not Found', 
      405 => 'Method Not Allowed', 
      406 => 'Not Acceptable', 
      407 => 'Proxy Authentication Required', 
      408 => 'Request Timeout', 
      409 => 'Conflict', 
      410 => 'Gone', 
      411 => 'Length Required', 
      412 => 'Precondition Failed', 
      413 => 'Request Entity Too Large', 
      414 => 'Request-URI Too Long', 
      415 => 'Unsupported Media Type', 
      416 => 'Requested Range Not Satisfiable', 
      417 => 'Expectation Failed', 
      500 => 'Internal Server Error', 
      501 => 'Not Implemented', 
      502 => 'Bad Gateway', 
      503 => 'Service Unavailable', 
      504 => 'Gateway Timeout', 
      505 => 'HTTP Version Not Supported' 
     ); 

     return (isset($codes[$status])) ? $codes[$status] : ''; 
    } 

編輯:修正了$ code和$ status。

編輯2:或者你可以只使用加布裏埃爾的答案,如果你需要這樣的代碼。

+0

403只是隨機的,所以在xcode端我有些東西要離開狀態碼返回403我知道用戶名和密碼是有效的。誠實地說,我幾乎不能理解我自己代碼中的一半。 – stilts 2012-03-15 21:08:00

+0

if($ num_rows == 1 || $ num_rows ==「1」)?? Doppelthältbesser? – 2012-03-15 21:10:32

+0

@ ott--很抱歉,我不明白... 狹縫:現在工作嗎? – 2012-03-15 21:17:50

2

in php您需要使用運營商$this->來調用函數成員。

所以

getStatusCodeMessage($status); 

將成爲

$this->getStatusCodeMessage($status); 

您的代碼可以大量修改/優化,但我想既然你開始使用PHP,你需要不斷的學習。