2016-12-25 139 views
1

下面代码的用意是从mysql表中提取消息,并将每个消息放在每个输出周围带有{}的一个数组中。如您所见,每个输出都由各种参数组成,并且本身就是一个数组。 代码的作用是每次处理循环时,在后面的JSON数组中将其转换为,它将输出包装在[]中,因此它现在是一个新创建的数组。 我得到的是:如何将元素添加到php数组而不显示为新数组

[{"sender":"ll","message":"blah","timestamp":"2016-12-21 14:43:04","username":"","msgtype":"","threadid":"32629016712222016034323"},{"sender":"kk","message":"blahblah","timestamp":"2016-12-21 14:43:23","username":"","msgtype":"","threadid":"32629016712222016034323"},{"sender":"ll","message":"blahblahblah","timestamp":"2016-12-21 14:43:47","username":"","msgtype":"","threadid":"32629016712222016034323"}],[{"sender":"ll","message":"blahblahblahblah","timestamp":"2016-12-21 14:43:04","username":"","msgtype":"","threadid":"92337321312222016034304"},{"sender":"kk","message":"blahblahblahblahblah","timestamp":"2016-12-21 14:44:05","username":"","msgtype":"","threadid":"92337321312222016034304"}]] 

而我想要的是:

[{"sender":"ll","message":"blah","timestamp":"2016-12-21 14:43:04","username":"","msgtype":"","threadid":"32629016712222016034323"},{"sender":"kk","message":"blahblah","timestamp":"2016-12-21 14:43:23","username":"","msgtype":"","threadid":"32629016712222016034323"},{"sender":"ll","message":"blahblahblah","timestamp":"2016-12-21 14:43:47","username":"","msgtype":"","threadid":"32629016712222016034323"}],{"sender":"ll","message":"blahblahblahblah","timestamp":"2016-12-21 14:43:04","username":"","msgtype":"","threadid":"92337321312222016034304"},{"sender":"kk","message":"blahblahblahblahblah","timestamp":"2016-12-21 14:44:05","username":"","msgtype":"","threadid":"92337321312222016034304"}] 

如何继续在这里得到正确的结果呢?

$data = array(); 
foreach($threads as $threadid){ 
$sql = ("SELECT sender,message,timestamp,username,msgtype,threadid FROM Messages WHERE threadid = '$threadid' AND subject = '' AND timestamp > '$newtimestamp' ORDER BY timestamp"); 
$arrayOfObjects = $conn->query($sql)->fetchAll(PDO::FETCH_OBJ); 
$data[] = $$arrayOfObjects; 
} 

,仅供参考,$线程ID是一个包含另一个数组...线程ID,并且循环正确获取这些一个接一个,that's问题并不在那里。

在此先感谢!

+0

* ...并将它们中的每一个放在每个输出周围的一个数组中{},您是否试图获取json字符串? –

+0

你能指定你的意思吗?“在每个输出周围用{}排列一个阵列”_?你在哪里/如何看待这些括号?作为Json也许?由于{}表示一个对象,而不是一个数组,所以你想要的东西有点混乱。 – Jeff

+0

您需要在foreach之外定义空数组var,并将数组内容推送到foreach中。 – Eugen

回答

1

你正在做O(N)数据库查询再分配$array本身,考虑使用IN表达这样做只是O(1)您的where子句。不需要foreach循环,你将得到一个数组中的所有数据。

SELECT ... FROM Messages WHERE threadid IN (1, 2, 3, ...) AND ... 

您可能必须为此使用预准备语句。

+0

所以“WHERE threadid IN('$ threadid')”?然后我只是得到[]作为输出。 –

+0

'IN'需要逗号分隔的ALL ID列表。 – akuhn

+0

因此,这种方法不能工作,因为threadids需要从mysql数据库中提取。或者有没有办法在PHP内而不是数组中生成这样一个逗号分隔的列表,并按照我所做的方式使用它? –

0

我认为您正在寻找PDO::FETCH_OBJ。 你有FETCH_ASSOC,它将返回一个关联数组数组。
FETCH_OBJ将返回一个数组obstdObjects。

你也做$array[] = $array;当..

$data = array(); 
foreach($threads as $threadid){ 
    $sql = ("SELECT sender,message,timestamp,username,msgtype,threadid FROM Messages WHERE threadid = '$threadid' AND subject = '' AND timestamp > '$newtimestamp' ORDER BY timestamp"); 
    //            here it is: 
    $arrayOfObjects = $conn->query($sql)->fetchAll(PDO::FETCH_OBJ); 
    $data[] = $arrayOfObjects; 
} 

// now you can encode that as json and show it: 
echo json_encode($data); 
+0

这确实是一个JSON字符串,我打算在这里对不起,不太清楚。 –

+0

看到我的编辑。那是你想要的吗? – Jeff

+0

我尝试了所有的修改,但我得到了相同的结果。我也更新了最初的问题,所以你可以看到我说的是什么。 –

0

@akuhn

好吧,我决定给你的建议一次机会,并设法做一个没有准备的方式。我知道这应该是有风险的,但到目前为止这个项目只需要工作,然后将php代码更新为更安全的版本,然后上线。它的工作,所以谢谢一堆!

$sql = ("SELECT sender,message,timestamp,username,msgtype,threadid FROM Messages WHERE threadid IN ('" . implode("','",$threadid) . "') AND subject = '' AND timestamp > '$newtimestamp' ORDER BY timestamp"); 
$data = $conn->query($sql)->fetchAll(PDO::FETCH_OBJ);