0

我用谷歌搜索并找不到任何简单的解决方案来做到这一点。我知道向 PHP 发送 SQL 查询是不好的做法,但由于只能在本地访问数据库,所以我现在不必担心安全问题。

我有一个需要 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
    ...
}

测试.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

2

也许 URL 解码它?

http://meyerweb.com/eric/tools/dencoder/

在 php 中,这是完成的

$decoded = urldecode($string);

于 2013-08-17T02:03:48.777 回答
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 回答