[英]Why I can't add a new item from a CSV file into an array inside a while loop in PHP?
我想生成一個jSON字符串,其中包含使用PHP從csv文件導入的一些數據,並將其稍后添加到mySQL數據庫字段中。
我想獲取數據庫字段中已經存在的信息,並使用從csv文件導入的信息進行更新。
導入的數據是對數據庫中每個帖子的注釋。 注釋以jSON格式插入表字段。 我想要的是逐行添加所有注釋(在csv文件中)。
這是我的論壇表:
CREATE TABLE foro (
foroID int unsigned not null auto_increment primary key,
userID int(11) NOT NULL,
deprecated_nodeID int(11) NULL,
datosPost text null //THIS IS THE FIELD IN JSON FORMAT
)
不推薦使用的節點ID是我正在從中導入信息的舊站點的發布ID。
這是來自csv文件的一些示例數據:這是我將每一行插入數組時的格式:
array(5) {
[0]=> string(3) "deprecated_nodeID"
[1]=> string(16) "commentTitle"
[2]=> string(9) "date"
[3]=> string(16) "userID"
[4]=> string(10) "comment"
}
“ 9193”,“ Mabel de acuerdo a mis”,“” 13.02.2017 16:54:37“,” 21222“,” En caso de que se quieran ejecutarmásde dos y el demandado paga。Saludos“
“ 9193”,“Segúnel material”,“ 01.03.2017 17:03:10”,“ 24970”,“Segúnel material suministrado”
“ 9193”,“ Lo Planteo en clase”,“ 02.03.2017 09:03:22”,“ 21222”,“ Hay una incongruencia entre el material y lo que se dio en clase,gracias Marcela”
“” 9191“,” Hola Mabel,行政長官“,” 13.02.2017 16:48:51“,” 21222“,”行政長官在沒有依賴權的情況下,必須在服務上保留一切權利。“
“” 9168“,”實現實體“,” 13.02.2017 17:03:19“,” 21222“,”注冊人登記表“,一個人的名義。
如您所見,csv文件中的前三行對應於同一nodeID的注釋,因此它們都應插入同一字段中。
為此,我正在這樣做,而我的問題是,即使我處於while循環中,也無法插入所有新的數組元素,因為新的元素會覆蓋舊的元素。
請注意,我仍然沒有將輸出轉換為jSON,它仍然是數組格式,由於循環問題,目前我被困在那里。
if (($handle = fopen("importar.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$conectar = new PDO('mysql:host='.HOST.'; dbname='.DATABASE.'; charset=utf8', USER, PASS);
$deprecated_nodeID = $data[0];
$importarNodo = $conectar->prepare('
SELECT deprecated_nodeID, datosPost FROM foro
WHERE deprecated_nodeID = ?
');
$importarNodo->bindParam(1, $deprecated_nodeID);
$ok = $importarNodo->execute();
//HERE I GET THE NODE TO BE UPDATED LATER WITH THE NEW INFORMATION.
//THE FIELD THAT SHOULD BE UPDATED LATER IS datosPost THAT IT ALREADY HAS SOME INFORMATION.
$x = $importarNodo->fetch(PDO::FETCH_ASSOC);
$datosPost = json_decode($x['datosPost'], TRUE);
如果我執行var_dump($ datosPost),則會得到以下格式:
array(3) {
["fecha"]=> array(1) {
[0]=> int(1158019156)
}
["autor"]=> array(1) {
[0]=> string(1) "1"
}
["mensaje"]=> array(1) {
[0]=> string(160) "Si se dispone que el pago de las expensas"
}
}
//IF THE NODE ID IS THE SAME AS THE NODE ID OF THE CSV LINE
//THEN PROCEED TO ADD A NEW ITEM TO THE ARRAY
if ($x['deprecated_nodeID'] == $data[0]) {
$datosPost['fecha'][] = obtenerUnixTime($data[2]);
$datosPost['autor'][] = $data[3];
$datosPost['mensaje'][] = $data[4];
添加所有新信息之后的預期輸出是這樣的:
array(3) {
["fecha"]=> array(1) { //date of first post and each comment
[0]=> int(1158019156)
[1]=> int(1158019654)
[2]=> int(1158749156)
[3]=> int(6548019156)
...
}
["autor"]=> array(1) { //author user ID
[0]=> string(1) "1"
[1]=> string(1) "58"
[2]=> string(1) "23"
[3]=> string(1) "5"
...
}
["mensaje"]=> array(1) { //first post and later comments
[0]=> string(160) "Si se dispone que el pago de las expensas"
[1]=> string(160) "Banco a la orden del Consorcio"
[2]=> string(160) "el ticket del Banco sirve"
[3]=> string(160) "como recibo de expensas?"
}
}
...
我得到的只是添加了一條注釋(在每種情況下,我都得到[0]
和[1]
),好像在每次循環傳遞中它們都被覆蓋了,還是循環不起作用?
我嘗試使用array_push()
而不是使用$datosPost['fecha'][]
等添加新項,但是結果是相同的。
您的$datosPost
在每次迭代的while
循環內$datosPost
被覆蓋,請嘗試在代碼的$myArr = array();
添加一個數組,例如$myArr = array();
並在將$datosPost
填充后,使用array_push($myArr, $datosPost)
將其添加到$myArr
(可以在if
語句之后執行此操作,
也嘗試var_dump($datosPost );
在while
循環中查看它是否實際上正在更新,
您可以echo 'here';
添加echo 'here';
在if ($x['deprecated_nodeID'] == $data[0])
查看您的代碼是否真正進入if
語句,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.