JSON解析:来自PHP5(攻击数据库:mySQL)ios5 iphone
Posted
技术标签:
【中文标题】JSON解析:来自PHP5(攻击数据库:mySQL)ios5 iphone【英文标题】:JSON parsing: from PHP5 ( which attacks a database: mySQL ) ios5 iphone 【发布时间】:2011-12-26 18:07:56 【问题描述】:我希望有人能帮我把,因为我已经尝试了一整天:((新东西)
我有一个数据库 mysql,其中包含一个表“products”(两行:“id”和“stock”)。 我希望我的 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”)。谢谢。
但我发现了另一个障碍(难怪),即产品售出后我需要更改数据库,并且由于它们通常不逐个出售,因此必须将数组发布到 PHP 中,我的意图是发布受影响的产品/项目(array_id 和 array_reductor)的 id 和 reductor(reductor 表示该“id”的产品有多少已售出)。
IOS5 代码:
NSArray *array_id=[[NSArray alloc]initWithObjects:@"0",@"3",@"5", nil];
//带有id的产品;
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 文件中(可能),但是我怎样才能接收这两个数组并使用它们????
提前致谢
我在堆栈溢出上花了很多时间:非常有用!!!!
【问题讨论】:
【参考方案1】: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,请避免使用此函数。
【讨论】:
哇...对我来说就像地狱一样,|o|o| ,这绝对不是新东西。我把它留着以防我赶上。我解决了删除所有以前的回声但回声 json_encode 的问题,它可以工作,现在我正在尝试发布 ARRAYS,这是另一个麻烦 :) 任何建议都值得赞赏【参考方案2】:您的 json 编码是正确的尝试将此行添加到您的 php 脚本中,因为 IOS 可能对响应非常严格。
将此添加到您的 php 脚本中:
header('Content-type: application/json');
除了检查您是否匹配参数的大小写。我看到你的 php 脚本发送 id
但看起来你的 ios 脚本正在寻找 ID
【讨论】:
谢谢加布里埃尔,我还没有检查出来。你的代码是做什么的?清理其余的回声?我解决了删除所有回声但 json_encode 的那部分,它可以工作,现在我正在尝试发布 ARRAYS,这是另一个麻烦:) 任何建议都将不胜感激【参考方案3】:使用HTTPScoop 等工具检查PHP 脚本输出。我怀疑有问题,基于控制台输出,其中包含行 Connection establishedDatabase selected..
和 Connection closedDesconectado
...
**`STRING`::**
Connection establishedDatabase selected..
***"id":"3","stock":"46"***
Connection closedDesconectado
您似乎从该脚本中获得了一些在 JSON 开始之前打印的日志,但 iOS 端的 JSON 解析器不接受这些日志。
【讨论】:
谢谢Joerick,我认为你是对的,因为我从PHP 中删除了所有的回声工作正常。现在的问题是从应用程序接收 PHP 中的数组。有什么建议吗?以上是关于JSON解析:来自PHP5(攻击数据库:mySQL)ios5 iphone的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何让我检索到的(来自 mysql)JSON 解析数据添加到 ListView 每分钟刷新一次