0

私はグーグルで検索しましたが、これを行うための簡単な解決策が見つかりませんでした。SQL クエリを PHP に送信するのが悪い習慣であることはわかっていますが、データベースにはローカルでしかアクセスできないため、セキュリティの問題についてはまだ心配する必要はありません。

引数として SQL クエリを必要とする関数があります。この SQL クエリを使用して、PHP に送信して結果を取得します。唯一の問題は、文字列を PHP に送信する方法です。

これまでのところ、Objective-C のテスト コードは次のようになっています。

void aFunction(std::string query)
{
    NSString *dictQuery = [NSString stringWithCString:query.c_str() encoding:NSUTF8StringEncoding];
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"query", dictQuery, nil];

    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    if (error)
    {
        NSLog(@"%s: JSON encode error: %@", __FUNCTION__, error);
    }

    NSURL *url = [NSURL URLWithString:@"http://localhost/test.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setHTTPMethod:@"POST"];
    NSString *params = [NSString stringWithFormat:@"json=%@", [jsonString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSData *paramsData = [params dataUsingEncoding:NSUTF8StringEncoding];

    // receive return value
    ...
}

test.php:

<?php
    $http_raw_post_data = $_POST['json'];

    $post_data = json_decode(stripslashes($http_raw_post_data),true);

    if (is_array($post_data))
    $response = array("status" => "ok", "code" => 0, "original request" => $post_data);
    else
    $response = array("status" => "error", "code" => -1, "original_request" => $post_data);

    include 'database.php';

    $connection = mysql_connect(SERVER, USER, PASSWORD);
    mysql_select_db(DATABASE, $connection);

    if (!$connection)
    {
        die("Couldn't connect: " . mysql_error());
    }

    $sql = $post_data;
    $result = mysql_query($sql, $connection);

    if (!$result)
    {
        die("Error getting results: " . mysql_error());
    }

    while (($row = mysql_fetch_row($result)))
    {
        $array[] = $row;
    }

    mysql_close($connection);

    echo json_encode($array);
?>

結果を確認した後、送信される文字列は次を返します: json=%7B%22select%20*%20from%20items%22:%22query%22%7D. どうすればこれを修正できますか?

4

2 に答える 2

0

目的-C:

void aFunction(std::string getQuery)
{       
    NSString *query = [NSString stringWithCString:getQuery.c_str() encoding:NSUTF8StringEncoding];

    // create dict for json
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:query, @"query", nil];

    // initialize json
    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    if (error)
    {
        NSLog(@"%s: JSON encode error: %@", __FUNCTION__, error);
    }

    // start request
    NSURL *url = [NSURL URLWithString:@"http://localhost/test.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    NSString *params = [NSString stringWithFormat:@"json=%@", [jsonString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSData *paramsData = [params dataUsingEncoding:NSUTF8StringEncoding];

    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:paramsData];

    // execute request
    NSURLResponse *response = nil;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if (error)
    {
        NSLog(@"%s: NSURLConnection error: %@", __FUNCTION__, error);
    }

    // examine the response
    NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
    NSLog(@"responseString: %@",responseString);
}

PHP:

$data = $_POST['json'];

$query = json_decode($data)->{'query'};

include 'database.php';

$connection = mysql_connect(SERVER, USER, PASSWORD);
mysql_select_db(DATABASE, $connection);

if (!$connection)
{
    die("Couldn't connect: " . mysql_error());
}

$result = mysql_query($query, $connection);

if (!$result)
{
    die("Error getting results: " . mysql_error());
}

while (($row = mysql_fetch_row($result)))
{
    $array[] = $row;
}

mysql_close($connection);

echo json_encode($array);
于 2013-08-17T04:11:54.333 に答える