2012-03-15 8 views
0

私は正しく動作するように努力してきました。私は最終的に正しい解決策を思いついたと思います。私はPHPにはまったく新しいものなので、私は何か間違いがあるのか​​、それとも改善することができるのだろうかと思っていました。iPhoneのphpウェブサービスとの通信 - ユーザー名/パスワード

私はこの例では、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

まず、ユーザー名とパスワードが正しい場合に「Not Found」を送信する理由を教えてください。とにかく、それは私がしたものです。これはまったく異なるコードですが、あなたが尋ねたことをします。

//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] : ''; 
    } 

EDIT:$ codeと$ statusが修正されました。

EDIT 2:または、コードをそのようにする必要がある場合は、Gabrielの答えを使用できます。

+0

403は単なるランダムなので、xcode側ではステータスコードが返されたときに何かがあったので、ユーザー名とパスワードが有効であることがわかりました。すべての正直なところで私は自分のコードで何が起こっているのかの半分をほとんど理解できません。 – stilts

+0

if($ num_rows == 1 || $ num_rows == "1")??ドッペルトはベッサーですか? –

+0

@ ott--申し訳ありませんが、私は理解していません... スリット:それは今働いていますか? –

2

php関数メンバーを呼び出すには、演算子$this->を使用する必要があります。

ので

getStatusCodeMessage($status); 

$this->getStatusCodeMessage($status); 

になりますあなたのコードは、頻繁に修正/最適化されていますが、あなたが学び続ける必要があるPHPを始めているので、私は考えることができます。

関連する問題