私はグーグルで検索しましたが、これを行うための簡単な解決策が見つかりませんでした。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
. どうすればこれを修正できますか?