2013-11-25 3 views
1

Xcode에서 작업 중이며 정보를 입력하는 iOS 응용 프로그램이 있으며 PHP 파일을 통해 DB에 연결됩니다. 업로드 할 때 이름이나 이메일 주소는 문제가되지 않습니다. 그러나 어떤 이유로 텍스트의 양을 올리려면 UITextView을 통해 문제가됩니다. 그것은 구두점이 전혀 없을 때 성공합니다. 그러나 마침표 나 물음표가 있으면 서버에 업로드되지 않고 그냥 실패합니다. 그러나 전자 메일 필드에서 마침표 또는 심지어 @ 기호와 관련하여 문제가 없습니다. 나는 PHP 나 MySQL 백엔드에 유창하지 않다. 그래서 나는 매우 혼란 스럽다. 여기에 PHP 파일에 대한 코드입니다 : PHP 파일에 대한 떨어져 내 구문을 당겨 때 내가 말했듯이PHP 및 MySQL 관련 문제

if (isset ($_GET["firstName"]) && isset($_GET["lastName"]) && isset($_GET["emailAddress"]) && isset($_GET["deviceType"]) && isset($_GET["problemTextField"]) && isset($_GET["iosVersion"])){ 
    $firstName = $_GET["firstName"]; 
    $lastName = $_GET["lastName"]; 
    $emailAddress = $_GET["emailAddress"]; 
    $deviceType = $_GET["deviceType"]; 
    $problemTextField = $_GET["problemTextField"]; 
    $iosVersion = $_GET["iosVersion"]; 

} else { 
    $firstName = "User first name"; 
    $lastName = "User last name"; 
    $emailAddress = "User email address"; 
    $deviceType = "User device type"; 
    $problemTextField = "User problem text field"; 
    $iosVersion = "User ios version"; 
} 

$con = mysql_connect($DB_HostName,$DB_User,$DB_Pass) or die(mysql_error()); 
mysql_select_db($DB_Name,$con) or die(mysql_error()); 

$sql = "insert into $DB_Table (firstName, lastName, emailAddress, deviceType, problemTextField, iosVersion, Status, Second_Status) values('$firstName','$lastName', 
    '$emailAddress','$deviceType','$problemTextField','$iosVersion', 'Unanswered', 'Answered')"; 
    $res = mysql_query($sql,$con) or die(mysql_error()); 

mysql_close($con); 
if ($res) { 
    echo "success"; 
}else{ 
    echo "failed"; 
} 

, 내가 PHP를 유창하게 구사하지 않다, 그래서 좋은 주시기 바랍니다.

편집 : 하루 종일 디버깅을 한 후, 단어 사이에 공백을 제거하면 모든 것이 잘된다는 것을 깨달았습니다. 이것에 대한 이유가 있습니까? 나는 모든 것 사이에 플러스를 넣고 싶지 않다. 나는 그것이 정확하지 않다는 것을 안다.

NSString *strURL = [NSString stringWithFormat:@"http://www.website.com/phpFile.php?firstName=%@&lastName=%@&emailAddress=%@&deviceType=%@&problemTextField=%@&iosVersion=%@", firstName.text, lastName.text, emailAddress.text, deviceType.text, self.problemTextBox.text, iosVersion.text]; 

    // to execute php code 
    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]]; 

    // to receive the returend value 
    NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];` 
+0

mysql_query 바로 전에 $ sql을 에코하려고하십시오. – Jompper

+0

필드 란 무엇입니까? 어떤 유형의 필드가 데이터베이스에 있습니까? 테이블에 어떤 인코딩이 있습니까? – Leonardo

+0

대답이 아니지만 권장 사항 : mysql_ * 함수를 사용하지 마십시오. 더 이상 사용되지 않으며 곧 사라질 것입니다. Mysqli_ * 또는 PDO를 확인하십시오. 둘 다 php.net mysql_ deprecated 메시지에 언급되어 있습니다!:) – Jite

답변

0

관찰의 커플 :

  1. 당신은 말했다 :

    그러나 기간 또는 물음표가있는 경우,이 서버에 업로드되지 않습니다, 그냥 실패합니다.

    귀하의 질문은 PHP 코드에 문제가 있다고 가정하지만 요청을 작성할 때 매개 변수를 정확하게 이스케이프 처리하지 못하는 것 같습니다. 특히, 많은 사람들이 실수로 stringByAddingPercentEscapesUsingEncoding을 사용합니다 (일부 문자를 이스케이프하는 비율은 퍼센트지만 다른 숫자는 이스케이프하지 않습니다). 특히, URL에서 유효하지만 POST/GET 매개 변수 내에서 유효하지 않은 "합법"문자가 있기 때문에 백분율 이스케이프되어야하는 "합법"문자를 지정해야합니다 (예 : ?, &, +, 등).

    간단히 말해서 CFURLCreateStringByAddingPercentEscapes을 사용하면 RFC 3986에 따라 이스케이프해야하는 추가 문자를 지정할 수 있습니다. 예를 들어, 다음 NSString 카테고리를 사용했습니다.

    @implementation NSString (URLEncode) 
    
    - (NSString *)stringForHTTPRequest 
    { 
        return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                        (CFStringRef)self, 
                        NULL, 
                        (CFStringRef)@":/[email protected]!$&'()*+,;=", 
                        kCFStringEncodingUTF8)); 
    } 
    
    @end 
    

    또는 생성 요청하는 과정을 단순화하고 당신이 돌봐 AFNetworking 같은 프레임 워크를 사용합니다.

  2. 참고로이 PHP 코드는 간단한 문자열 응답을 반환합니다. 대신 Objective-C 코드가 응답을 처리하고 해석하고 오류를보고/로그하는 것이 더 쉬워지는 JSON 응답을 만드는 것이 좋습니다. mysqli의 절차 연주를 사용하는 경우 예를 들어, :

    <?php 
    
    // specify that this will return JSON 
    
    header('Content-type: application/json'); 
    
    // open database 
    
    $con = mysqli_connect("localhost","user","password","database"); 
    
    // Check connection 
    
    if (mysqli_connect_errno()) 
    { 
        echo json_encode(array("success" => false, "message" => mysqli_connect_error(), "sqlerrno" => mysqli_connect_errno())); 
        exit; 
    } 
    
    // get the parameters 
    
    $field1 = mysqli_real_escape_string($con, $_REQUEST["field1"]); 
    $field2 = mysqli_real_escape_string($con, $_REQUEST["field2"]); 
    
    // perform the insert 
    
    $sql = "INSERT INTO sometable (field1, field2) VALUES ('{$field1}', '{$field2}')"; 
    
    if (!mysqli_query($con, $sql)) 
    { 
        $response = array("success" => false, "message" => mysqli_error($con), "sqlerrno" => mysqli_errno($con), "sqlstate" => mysqli_sqlstate($con)); 
    } 
    else 
    { 
        $response = array("success" => true); 
    } 
    
    echo json_encode($response); 
    
    mysqli_close($con); 
    
    ?> 
    

    또는 객체 지향 스타일을 사용하는 경우 :

    <?php 
    
    header('Content-type: application/json'); 
    
    $mysqli = new mysqli("localhost", "user", "password", "database"); 
    
    // check connection 
    
    if ($mysqli->connect_errno) { 
        echo json_encode(array("success" => false, "message" => $mysqli->connect_error, "sqlerrno" => $mysqli->connect_errno)); 
        exit(); 
    } 
    
    // perform the insert 
    
    $sql = "INSERT INTO sometable (field1, field2) VALUES (?, ?)"; 
    
    if ($stmt = $mysqli->prepare($sql)) { 
        $stmt->bind_param("ss", $_REQUEST["field1"], $_REQUEST["field2"]); 
    
        if (!$stmt->execute()) 
         $response = array("success" => false, "message" => $mysqli->error, "sqlerrno" => $mysqli->errno, "sqlstate" => $mysqli->sqlstate); 
        else 
         $response = array("success" => true); 
    
        $stmt->close(); 
    } else { 
        $response = array("success" => false, "message" => $mysqli->error, "sqlerrno" => $mysqli->errno, "sqlstate" => $mysqli->sqlstate); 
    } 
    
    $mysqli->close(); 
    
    echo json_encode($response); 
    
    ?> 
    

    이 방법을, 오브젝티브 C 응용 프로그램이 응답을받을 수 있으며, 구문 분석 JSON을 찾고 작업이 성공했는지 여부를 확인하려면 success을보고 성공하지 못한 경우 오류 메시지는 message을 확인하십시오. 이것은 단지 앱과 서버 간의보다 강력한 대화를 허용합니다.

  3. 그런데 mysqli_real_escape_string을 사용하거나 SQL 주입 공격이나 SQL의 이스케이프되지 않은 문자열에서 발생하는 의도하지 않은 오류로부터 보호하기 위해 매개 변수를 준비된 문에 수동으로 바인딩하는 것이 좋습니다.

  4. 더 큰 값을 허용하는 GET 요청이 아닌 POST 요청을 생성하는 것이 좋습니다.

+0

현재 컴퓨터에서 멀리 떨어져 있으므로 정확한 코드를 Xcode에서 가져올 수 없습니다. 하지만 내가하고있는 일은 DB에 정보를 '제출'하는 버튼을 누를 때 URLstring을 통해 PHP 파일을 가져 와서 nsdata 문으로 실행 한 다음 성공 여부를 나타내는 데이터 문을 가져옵니다. 그게 올바른 방법이 아니겠습니까? 또는 내 메서드에 코드를 추가해야합니까? 집에 돌아 가면 코드로 편집 할 것입니다. –

+0

내 이전 성명서뿐만 아니라. 아마도 AFNetworking 프레임 워크에 들어가기를 원할 것입니다. 그러면 AFnetworking 프레임 워크가 더 쉽게 만들어지고 더 강력한 프로그램을 제공하게 될 것입니다. –

+0

@ user1813278 아마도 'POST'요청을 만들어야합니다. 단지'GET' 요청으로 할 수있는 것처럼 URL에 매개 변수를 추가하는 것이 아니라'POST' 매개 변수를 의뢰. 원하는 경우 스스로 할 수 있지만'setHTTPMethod'를'POST'로 사용하고,'setHTTPBody'를'POST' 변수와 함께 사용하고, 다른 헤더 값을 설정하는 등의 작업을합니다. AFNetworking은 (물론 JSON 응답의 값을 이스케이프 처리하고 파싱하는 것만 큼 적절할 것입니다.) 약간 더 쉽습니다. 행운을 빕니다! – Rob

0

사용 mysql_real_escape_string를 당신은 $ _GET 자동 전역을 사용하지 않아야 값

감사

0

얻을 모든 이전

$firstName = mysql_real_escape_string($_GET["firstName"]); 

같은 :

여기 내 엑스 코드 코드입니다. Get 메소드에는 $ _POST 수퍼 글로벌이 제한이없는 데이터 크기에 제한이 있습니다. 그래서 코드는 다음과 같이한다. \

if (isset ($_POST["firstName"]) && isset($_POST["lastName"]) && isset($_POST["emailAddress"]) && isset($_POST["deviceType"]) && isset($_POST["problemTextField"]) && isset($_POST["iosVersion"])){ 
$firstName = $_POST["firstName"]; 
$lastName = $_POST["lastName"]; 
$emailAddress = $_POST["emailAddress"]; 
$deviceType = $_POST["deviceType"]; 
$problemTextField = $_POST["problemTextField"]; 
$iosVersion = $_POST["iosVersion"]; 

난 당신이 제출 사용하고 있지만 그 형태의 방법도 게시 할 필요가 어떤 형태 모르겠어요. 또한 SQL 삽입이 발생하지 않도록 데이터베이스에 삽입하기 전에 항상 변수를 이스케이프 처리해야합니다.

+0

고맙습니다. 방금 고쳤습니다. –

1

먼저 mysql_ * 함수를 사용하지 마십시오. 더 이상 사용되지 않으며 곧 php에서 제거 될 것입니다. 대체를 위해 mysqli 나 PDO를 확인하십시오.

데이터베이스와 대화 할 때 중요한 점은 입력을 확인하면 나쁘지는 않습니다.
이스케이프 기능이나 preferably prepared statement로 이것을 할 수 있습니다.
mysqli와 pdo는 모두 준비된 문을 가지고 있습니다.
mysql 래퍼가 예상해야하는 데이터 유형을 알 수 있도록 준비된 명령문을 사용하면 이스케이프 처리에 도움이됩니다.

귀하의 코드는 SQL Injections (http://en.wikipedia.org/wiki/SQL_injection)라고 불리는 항목에 대해 매우 개방적이며 잘못된 것입니다.
이것은 아마도 특정 문자에서 쿼리가 중단되는 이유 일 것입니다.
미리 준비된 명령문으로이 문제를 예방할 수 있습니다!

mysqli 문서를 읽고 특별히 준비된 문을 mysqli하십시오
http://php.net/manual/en/book.mysqli.php
http://php.net/manual/en/mysqli.prepare.php

I 인해 PDO보다 MySQL의 API에 그것의 더 유사라는 사실에 Mysqli을 추천합니다.
그러나 새로운 것을 배울 마음이 없으면 PDO가 더 좋을 수도 있습니다!

ddelnado가 언급했듯이 GET이 최적이 아니기 때문에 POST가 더 적합 할 수 있습니다.

+1

나는이 코드를 내 코드 내에서 구현하는 방법을 살펴볼 것이다. 시간을내어 도와 주셔서 감사합니다! –