Разбор JSON: из PHP5 (который атакует базу данных: mySQL) ios5 iphone - PullRequest
0 голосов
/ 26 декабря 2011

Я надеюсь, что кто-то может помочь мне поставить, потому что я пробовал весь день :( (новые вещи)

У меня есть база данных mySQL, которая содержит одну таблицу "products" (две строки: "id")и «сток»). И я хочу, чтобы мое приложение ios5 отправляло «id» и получало «сток» этого продукта.

В моем коде PHP:

echo json_encode(array(
     'id'=>$id,
     'stock'=>$stock, ));

Какой яВера отправляет JSON в мое приложение, мое приложение получает этот JSON в функции с именем:

- (void)requestFinished:(ASIHTTPRequest *)request
{    
    NSString *responseStringWEB = [request responseString];
    NSLog(@"STRING:: %@ \n", responseStringWEB); //3
    NSDictionary *responseDict = [responseStringWEB JSONValue];
    NSLog(@"DICT: %@ \n", responseDict); //3
    NSString *id_producto = [responseDict objectForKey:@"id"];
    NSString *stock = [responseDict objectForKey:@"stock"];
    NSLog(@"ID: %@\n", id_producto); //3
    NSLog(@"stock: %@", stock); //3
}

и проверяет консоль, которую я получаю:

**`STRING`::**
Connection establishedDatabase selected..
***{"id":"3","stock":"46"}***
Connection closedDesconectado
2011-12-26 18:58:57.170 CaeDeCajon[1998:16403] Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x984aeb0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
2011-12-26 18:58:57.171 CaeDeCajon[1998:16403] **`DICT`**: (null)
2011-12-26 18:58:57.171 CaeDeCajon[1998:16403] **`ID`**: (null)
2011-12-26 18:58:57.171 CaeDeCajon[1998:16403] **`stock`**: (null)

Вопрос: я незнать, в каком формате идет JSON (массив, Как мне проанализировать NSstring responseStringWEB, чтобы получить эти два значения (ID и STOCK). Кажется, я получаю их из базы данных, но не могу их извлечь.

ПОМОГИТЕ :) спасибо,

РЕДАКТИРОВАНИЕ ::

Спасибо. Это действительно помогло.

Казалось, что это как-то связано с несколькими эхами, которые я использовал вкод PHP. Теперь у меня есть только одно эхо, отправка данных в формате JSON. Он отлично работает смоя база данных и мое приложение: я получаю всю таблицу ("id" и "stock") всех товаров.Спасибо.

Но я обнаружил еще одно препятствие (неудивительно): мне нужно изменить базу данных после того, как продукты были проданы, и, поскольку они обычно не продаются, 1 к 1 необходимо разместить массивы в PHP,, я намереваюсь отправить POST идентификатору и редуктору (редуктор представляет, сколько продуктов с этим «идентификатором» было продано) затронутых продуктов / элементов (array_id и array_reductor).1027 *

// с идентификатором продуктов;

NSArray *array_reductor=[[NSArray alloc]initWithObjects:@"10",@"5",@"40", nil];

// с количеством проданных товаров (поэтому мне необходимо уменьшить предыдущий номер запаса в базе данных на них, чтобы получить текущие номера запаса).

NSURL *url=[[NSURL alloc]initWithString:@"http://www.haveyourapp.com/promos/"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:array_id forKey:@"id"];
[request setPostValue:array_reductor forKey:@"reductor"];

[request setDelegate:self];
[request startAsynchronous];

МОЙ ФАЙЛ PHP:

if (isset ($ _ POST ['id']) && isset ($ _ POST ['reductor'])) // проверить, если данныеближайшие {

$id = array();          // I create arrays
$reductor = array();

$id=$_POST['id'];             // and store arrays in them ( At least is what I believe )
$reductor=$_POST['reductor'];

$connection = new createConnection(); //i created a new object
$connection->connectToDatabase(); // connected to the database
$connection->selectDatabase();

/////////////////////////////////////////////////////////////////////////////////////////////////////////////// Stock reduction in the items affected////////////////////////////////


$num=mysql_numrows($id);
$i=0;
$stock_anterior=array();
while ($i < $num) {

$query=" SELECT  stock FROM productos WHERE id = $id[$i]";
$stock_anterior[$i] = mysql_query($query);
++$i;
}


$l=0;

$num2=mysql_numrows($id);

while ($l < $num2) {

$stock_reductor[$l] = $stock_anterior[$l] - $reductor[$l];

$query = "UPDATE productos SET stock = '$stock_reductor[$l]' WHERE id = $id[$l] ";
mysql_query($query);


++$l;

}



$connection->closeConnection();

Но мой код не работает, я не знаю, есть ли проблема в моем приложении или в файле PHP (вероятно), но как я могу получить эти два массива и работать с ними????

Заранее спасибо

Я провожу много времени в стеке Overflow: ОЧЕНЬ ПОЛЕЗНО ПОЛУЧИТЬ !!!!!

Ответы [ 3 ]

1 голос
/ 26 декабря 2011

ваша кодировка json верна, попробуйте добавить эту строку в ваш php-скрипт, потому что IOS может быть очень строгим с ответом.

добавьте это в ваш php-скрипт:

header('Content-type: application/json');

, кроме этогопроверьте, что вы соответствуете регистру ваших параметров.Я вижу, что ваш php-скрипт отправляет id, но похоже, что ваш ios-скрипт ищет ID

1 голос
/ 26 декабря 2011

json_encode работает только с данными в кодировке UTF-8, поэтому при нахождении недопустимого символа он возвращает NULL для всех.

Проверьте, что ваши данные закодированы в UTF-8.

Также проверьте, что ваш файл использует UTF-8.

Альтернатива json_encode:

// función interna: comprueba si un array es puro o no
// es puro si sus índices son: 0, 1, 2, ..., N
function aputio($a) {
    $i=0;
    foreach ($a as $n=>$v) {
        if (strcmp($n,$i)) return(true);
        $i++;
    }
    return(false);
}

// cambiar quotes, \n y \r para devolver cadenas válidas JSON
function qcl2json($qcl) {
    return str_replace('"','\"',str_replace("\n",'\n',str_replace("\r",'\r',$qcl)));
}

// devolver variable en formato json
function ajson($av,$level=0,$utf8=false) {
    if (($av===null) && !$level) return("null");
    if (!is_array($av)) return (gettype($av)=="integer"?$av:'"'.($utf8?utf8_encode($av):$av).'"');
    $isobj=aputio($av);
    $i=0;
    if (!$level) $e=($isobj?"{":"["); else $e="";
    foreach ($av as $n=>$v) {
        if ($i) $e.=",";
        if ($isobj) $e.=(is_numeric($n) && !is_string($n)?$n:"\"".qcl2json($utf8?utf8_encode($n):$n)."\"").":";
        if (!is_array($v)) {
            if (is_bool($v)) $e.=($v?"true":"false");
            else if ($v==NULL) $e.='""';
            else if (is_int($v)||is_double($v)) $e.=$v;
            else $e.='"'.qcl2json($utf8?utf8_encode($v):$v).'"';
        } else {
            $e.=(count($v)
                ?(aputio($v)
                    ?"{".ajson($v,$level+1)."}"
                    :"[".ajson($v,$level+1)."]")
                :"{}");
        }
        $i++;
    }
    if (!$level) $e.=($isobj?"}":"]");
    return($e);
}

Избегайте использования этой функции, если вы можете использовать UTF-8.

0 голосов
/ 27 декабря 2011

Проверьте вывод сценария PHP с помощью такого инструмента, как HTTPScoop .Я подозреваю, что что-то не так, основываясь на выводе консоли, который содержит строки Connection establishedDatabase selected.. и Connection closedDesconectado ...

**`STRING`::**
Connection establishedDatabase selected..
***{"id":"3","stock":"46"}***
Connection closedDesconectado

Похоже, что вы получили некоторые записи из этого сценария, которыйвыводится до запуска JSON, что не принимается анализатором JSON на стороне iOS.

...