How to post JSON data to PHP database using objective-c?

后端 未结 1 1921
情深已故
情深已故 2020-12-12 06:47

I\'m having an issue sending data to my online database. Nothing seems to post when I check the database. I performed an NSLog on the received response, and it\'s blank.

相关标签:
1条回答
  • 2020-12-12 07:16

    A couple of observations:

    1. You should use msqli interface rather than the deprecated mysql interface.

    2. You should never take input and just use it in SQL statement. Either use mysqli_real_escape_string or bind values (as shown below). This is critical to ensure you aren't susceptible to SQL injection attacks. It also protects you against innocent errors that can arise if the inserted value just happens to contain a reserved character.

    3. Rather than trying to just json_encode the result of mysqli_query result, you should build a more meaningful associative array. For example, you might check the result of the mysqli call and return one JSON if it was successful, and another on failure. I might suggest having the failure rendition return the error message.

    4. You should test your PHP either in a web browser, or test it from a device using something like Charles. Make sure you're getting back the JSON you expected before you go too far with your client code. Bottom line, see if you can test the client code and the server code in isolation of each other (or keeping it as simple as possible at first).

    5. I'm not familiar with this $_SERVER['HTTP_JSON']; construct. If that works for you, great, but it doesn't work on my server. I've historically done fopen of php://input as illustrated below.

    For example, this is a different database/table, but it might illustrate the idea of what the PHP code might look like:

    // read JSON input
    
    $handle = fopen("php://input", "rb");
    $raw_post_data = '';
    while (!feof($handle)) {
        $raw_post_data .= fread($handle, 8192);
    }
    fclose($handle);
    
    $request_data = json_decode($raw_post_data, true);
    
    // prepare header for reply
    
    header("Content-Type: application/json");
    
    // open database
    
    $mysqli = new mysqli($host, $userid, $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 locations (message, device, longitude, latitude) VALUES (?, ?, ?, ?)";
    
    if ($stmt = $mysqli->prepare($sql)) {
        $stmt->bind_param("ssdd", $request_data["message"], $request_data["device"], $request_data["latitude"], $request_data["longitude"]);
    
        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);
    

    Obviously, change this for your tables, but it illustrates some of the above concepts. I would generally add more error checking (e.g. the Content-Type of the request, test to make sure variables were set before I tried to use them, etc.), but you probably get the idea.


    On the client side, there are also a few more minor observations:

    1. The most serious problem is the use of sendSynchronousRequest. Use sendAsynchronousRequest instead (or any of a myriad of other, asynchronous techniques). Never issue synchronous requests from the main thread.

    2. When parsing the response, resString will contain the raw JSON. I don't know what the jsonData variable you reference when building jsonString, but that doesn't look right.

      If you want to parse the response, it would be:

      NSError *parseError;
      NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
      

      By the way, the above assumes you return a JSON dictionary in your response, like I do in my example, rather than what your original JSON did.

    0 讨论(0)
提交回复
热议问题