Странный ответ с Xcode и HTTP-запросом

0

Я пытаюсь сделать приложение iOS, которое связывается с моим сервером через веб-приложения PHP. У меня есть метод в Xcode, который вернет текст на веб-сайте. Он работает со всеми другими сайтами, кроме этого. Он работает, когда вы открываете его в браузере, но не тогда, когда запрос отправляется через приложение. (Я знаю, что есть код, который делает обновление страницы, которое может быть причиной проблемы, но это каждый раз и никогда в версии браузера). Затем он просто возвращает null. Заранее спасибо!

PHP файл:

<?php

require_once 'init.php';

$key =  mt_rand(100000, 999999);


$sql= "SELECT * FROM sharing_keys
WHERE unique_key LIKE $key";
$result = $con->query($sql);

if ($result->num_rows > 0) {
    // Change number
    $page = $_SERVER['PHP_SELF'];
    $sec = "1";
    header("Refresh: $sec; url=$page");
} else {
    $add = "INSERT INTO sharing_keys (unique_key)
    VALUES ($key)";

    if ($con->query($add) === TRUE) {
        echo $key;
    } else {
        echo "Error: " . $add . "<br>" . $con->error;
    }
}

if (!mysqli_query($con,$sql)) {
    die('Error: ' . mysqli_error($con));
}

?>

Метод Xcode:

-(NSString *)getStringFromURL:(NSString *)url {

    NSError *error;
    NSString *stringFromFileAtURL = [[NSString alloc]
                                     initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",url]]
                                     encoding:NSUTF8StringEncoding
                                     error:&error];
    if (stringFromFileAtURL == nil) {
        // an error occurred
        NSLog(@"Error reading file at %@\n%@", url, [error localizedFailureReason]);
    }

    return stringFromFileAtURL;

}
  • 0
    Это блокирующий синхронный звонок. Вы должны вызывать асинхронные вызовы почти во всех случаях.
Теги:

1 ответ

0
Лучший ответ

Попробуйте этот подход:

while(true) {
    $key =  mt_rand(100000, 999999);
    $sql= "SELECT * FROM sharing_keys
           WHERE unique_key LIKE $key";
    $result = $con->query($sql);
    if ($result->num_rows > 0){
        $add = "INSERT INTO sharing_keys (unique_key)
        VALUES ($key)";
        if ($con->query($add) === TRUE) {
            echo $key;
        } else {
            echo "Error: " . $add . "<br>" . $con->error;
        }
        break;
    }else {
        //sleep for 2 seconds
        sleep(2);
    } 
}

Я не думаю, что это хорошая идея обновить в середине запроса.

Эта логика попытается найти ключ и выйти после его обнаружения. если он не будет спать в течение 2 секунд, повторите попытку, пока не найдете.


Если бы ваша единственная цель состояла в том, чтобы выбрать строку случайным образом, тогда вы должны сделать это в запросе, потому что только Бог знает, сколько времени это займет. вот пример в mysql-сервере:

SELECT * FROM sharing_keys
ORDER BY RAND()
LIMIT 1
  • 0
    Эй, спасибо за ответ! Хотя есть небольшая проблема. Я гораздо более опытен в Objective C, чем в PHP (как вы, вероятно, можете сказать из исходного кода). Я попытался запустить предоставленный вами скрипт, и он никогда не загрузит страницу (просто тайм-аут) и вынудит меня перезагрузить компьютер, чтобы получить доступ к чему-либо MySQL. Первоначальная цель состояла в том, чтобы просто сгенерировать случайный 6-значный код и, если он еще не существует в таблице, создать для него строку и повторить код. Извините за путаницу!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню