2013-12-19 38 views
2

我有一个按列排序的mysql查询。它工作正常,如果我只是运行PHP。在我使用json_encode并将其发送给客户端之后,订单被更改为主键。它为什么这样做,是否有解决方案?Json_encode更改我的查询的顺序

查询看起来像:

try{ 
    $dbh = new PDO('mysql:host=localhost;dbname=Batik', 'root', 'root'); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
    $_SESSION['table'] = $_SESSION['category'] = $table = $_GET['button']; 
    $count = $dbh->query("SELECT * FROM $table ORDER BY `order` ASC"); 
    $count->setFetchMode(PDO::FETCH_ASSOC); 
    $myarray = array(); 
    while ($row = $count->fetch()) { 
     $id = array_shift($row); 
     $myarray[$id] = $row; 
    } 
    print json_encode($myarray); 
} catch (PDOException $exception) { 
    echo "There was an error uploading your information, please contact James for assistance. "; 
    error_log($exception->getMessage()); 
}; 

所以,输出我想在纯PHP得到的是这样的:(ID = primary_key)

Order:  ID:  Location: 
    1    4   foto1.jpg 
    2    5   foto3.jpg 
    3    3   foto2.jpg 
    4    2   foto4.jpg 
    5    1   foto5.jpg 

我json_encode数组,并输出到后客户端,我得到这个:(ID = primary_key)

Order:  ID:  Location: 
    5    1   foto5.jpg 
    4    2   foto4.jpg 
    3    3   foto2.jpg 
    1    4   foto1.jpg 
    2    5   foto3.jpg 

我希望这是有道理的。

+3

究竟发生了什么变化,您可以在哪里澄清并展示一个示例?数据在哪一点更改? –

+0

我之前也有过这个问题,在我的情况下,我最终不得不在Javascript中重新排序它,通过传递一个'order'数组替代我的原始数据 –

回答

2

简短的回答是:不使用

$id = array_shift($row); 
$myarray[$id] = $row; 

建立自己的阵列。建立一个真正的从零开始的数字索引数组,而不是语法如下:

$myarray[] = $row; 

和阵列将与它们环绕在订单中的项目建成,虽然略有不同的记录结构(没有意义的键) 。作为一种替代方案,为了保留您当前的结构,您可以使用*排序函数系列(而不是SQL)来排序,而不是使用SQL(特别是usort),就像这样(假设您的“order”字段是数字,请参阅http://www.php.net/manual/en/function.usort.php以获得字符串型字段的示例):

while ($row = $count->fetch()) { 
    $myarray[] = $row; 
} 
usort($myarray,function ($a, $b){return ($a > $b) ? 1 : -1;}); 
+0

谢谢。那很简单。 – Jimbob

4

如果您使用带数字的文字对象,客户端会自动命令该数组。 所以,如果你遗漏了你的ID,你应该得到正确的内容。

更换

while ($row = $count->fetch()) { 
    $id = array_shift($row); 
    $myarray[$id] = $row; 
} 

//doing so you create this 
json array=[ 
0=undefined, 
1={order:5,id:1;location1}, 
2={order:4,id:2;location2}, 
3={order:3,id:3;location3}, 
4={order:2,id:4;location4}, 
] 
//error 

while ($row = $count->fetch()) { 
    $myarray[] = $row; 
} 

basicaly你改变你的文本对象为简单的array.wich可能会导致几个错误,如果你开始删除部分图片。

,那么你可能只需要ID和位置

所以

SELECT id,location FROM ... ORDER BY order ASC 

,你有

[[1,location1],[2,location2]] 

[{id:1,location:"location1"},{id:2,location:"location2"}] 
    //0 wich is order 1  //1 wich is order 2 

在S你的mysql查询创建的顺序是json数组索引。