iT邦幫忙

0

如何取出 foreach 的值,並且更新數據表?

$keyyy = null;

while ($r = mysqli_fetch_array($rs)){

    $tagg = array($r['name']);

    foreach ($tagg as $key) {
      $keyyy = $key.',';
    }
    
    UPDATE `blog` SET
      `tags` = '{$keyyy}'
      WHERE url = 'XXX'
}

印出結果是

1,2,3,4,5,
只是為什麼我 update 到數據表,都只有 1, 呢?
而不是 1,2,3,4,5,

假設 A 文章tag是 1,2,3, B文章tag是 3,4,5, (確定篩選好了)
如果在 $keyyy = $key.','; 加上 .$keyyy .= $key.',';
B文章被更新的時候會變成 1,2,3,3,4,5, ....以此類推,會把前一個文章的 tag 累加上來
如果不加 . 又只會把最後一個字串更新上去...
A文章: 1, B文章:3,
這是什麼問題??

看更多先前的討論...收起先前的討論...
浩瀚星空 iT邦研究生 3 級 ‧ 2018-09-28 11:49:11 檢舉
其實這邊是真的看不出來你想要做的事是什麼。
感覺你的foreach根本沒意義啊。

$tagg = array($r['name']);

foreach ($tagg as $key) {
$keyyy = $key.',';
}


$keyyy = $r['name'].',';

都是同等效果。
相信你並非是要這樣的目的,只是不知道該怎麼處理

因不太清楚你想要做的用意為何。只能大約知道說,你想要統計tag也就是你的name值的樣子。

你可以善用一下explode跟implode這兩個函數來做分解組合陣列字串值。
並利用array_unique()來刪除一下重覆的值。

我只能教你這些。畢竟不太清楚你要做的事。沒辦法幫你改
asys0512 iT邦研究生 5 級 ‧ 2018-09-28 12:25:00 檢舉
我 `$rs` 是在其他地方把 tag資料表東西拉過來,用文章ID
然後用 `$r['name']` 印出找到的所有該文章ID的 tag

假設 A 文章等於 1 ,B文章等於2
tag 資料表:

blog ID / tag-name
1 / 餐飲
1 / 娛樂
2 / 住宿
2 / 電影

假設文章ID是1 ,我用 `$r['name']` 印出來的就是`餐飲, 娛樂,`,我有用ID做篩選
浩瀚星空 iT邦研究生 3 級 ‧ 2018-09-28 13:40:39 檢舉
其實這邊我大多數都會教人家用index表應用法。盡量不要將多重參數用在同一個欄位上用,區分。

所謂index表應用吧。就是將你要多重區分的欄位,建立到一個index表上。
依你上面的利字。你會有個blogid跟tagid。其中tagid會定義多個到同一個blogid上。
那我就會開另一個表可能名叫 blog_tag_index
欄位就只用blogid跟tagid。並建立好索引

這樣子的話,你要用該文章,可以使用join的方式搭配select_group的相關用法。來取得你想要的對應值。也可以用程式來額外取得對應值。
在搜尋的速度上跟統計也會變得單純許多。
youarefat iT邦新手 5 級 ‧ 2018-09-28 16:08:10 檢舉
變數名稱為何如此牛逼
weiclin iT邦高手 4 級 ‧ 2018-09-28 18:34:46 檢舉
變數名稱別亂取, 在那邊誤導別人
foreach ($array as $value)
foreach ($array as $key => $value)
老實說看不懂你想幹嘛,你一直強調印,但又沒說是在哪個時間點印 ..
你要的結果只是幫每個 tags 加一個逗號嗎?
如果是的話你不用做 foreach 也可以阿

2 個回答

0
小魚
iT邦高手 1 級 ‧ 2018-09-28 12:02:11
最佳解答

沒看到你印出在哪裡...
我猜你應該是要這樣

$keyyy .= $key.',';

PHP不熟,
不過感覺一開始的 $keyyy = null 加上我改的部份應該會導致錯誤,
宣告的地方是不是要改成

$keyyy = '';
看更多先前的回應...收起先前的回應...
asys0512 iT邦研究生 5 級 ‧ 2018-09-28 12:26:06 檢舉

我試過 $keyyy .= $key.',';
但他會把上一個文章的 tag 累加上來

asys0512 iT邦研究生 5 級 ‧ 2018-09-28 12:27:17 檢舉

所以我不解的是,竟然都可以把上一個文章所有tag都累加過來了,為什麼我單純 $keyyy = $key.','; 卻不能得到所有 tag,永遠都是第一個被抓到而已

小魚 iT邦高手 1 級 ‧ 2018-09-28 12:40:25 檢舉

改成這樣

while ($r = mysqli_fetch_array($rs)){
    $keyyy = '';

    $tagg = array($r['name']);

    foreach ($tagg as $key) {
      $keyyy .= $key.',';
    }
    
    UPDATE `blog` SET
      `tags` = '{$keyyy}'
      WHERE url = 'XXX'
}

前面加 $keyyy = ''; 將上一個文章的資料清掉
$keyyy .= $key.','; 將這一篇文章的資料累加

小魚 iT邦高手 1 級 ‧ 2018-09-28 12:41:35 檢舉

我也很不解, 照理說應該是取最後一筆資料才對,
除非你是由大到小...

asys0512 iT邦研究生 5 級 ‧ 2018-09-28 13:51:22 檢舉

喔不對,是最後一筆

asys0512 iT邦研究生 5 級 ‧ 2018-09-28 13:59:04 檢舉

用了你的方式後,我發現又回到只取最後一筆了。好怪。。

Homura iT邦研究生 2 級 ‧ 2018-09-28 16:01:07 檢舉

asys0512
這樣呢?

while ($r = mysqli_fetch_array($rs)){
    $keyyy = '';

    foreach ($r as $key) {
      $keyyy .= $key['name'].',';
    }
    
    UPDATE `blog` SET
      `tags` = '{$keyyy}'
      WHERE url = 'XXX'
}
asys0512 iT邦研究生 5 級 ‧ 2018-09-28 16:19:58 檢舉

出現錯誤:Illegal string offset 'name'

asys0512 iT邦研究生 5 級 ‧ 2018-09-28 16:22:07 檢舉

這問題真的也太有趣。。。一開始我直接印 foreach 取出來的 $keyyy時,是可以順利印出 1,2,3,4,5,
但是 UPDATE 之後反而只有最後一筆 5, 有進去。。。
然後用 .= 這招竟然把上一個文章的全部也加進來,這是啥鬼問題。。。。

小魚 iT邦高手 1 級 ‧ 2018-09-28 19:05:55 檢舉

你沒有用我最後發的那個方法吧,
那個方法應該不會這樣。
其實你最好拿個紙筆寫一下流程...
思考一下你的程式是怎麼跑的...

asys0512 iT邦研究生 5 級 ‧ 2018-10-03 14:45:42 檢舉
$rs = $do->query(
    "SELECT
      t.name as name,
      tr.object_id as object_id
    FROM wp_terms as t
    JOIN wp_term_relationships as tr ON tr.term_taxonomy_id = t.term_id
    JOIN blog as b ON b.url = tr.object_id "
  );
while ($r = mysqli_fetch_array($rs)){

  $keyyy = '';
  $keyyy .= $r['name'];

  $do->query(
    "UPDATE `blog` SET
    `tags` = '{$keyyy}'
    WHERE url = '{$r['object_id']}' "
  );

}

我有用你那個方式,但都一樣只會丟最後的進去資料庫。。很怪
而我現在改成這樣,結果也是一樣,所以我搞不懂哪裡有問題

0
Homura
iT邦研究生 2 級 ‧ 2018-09-28 16:30:55

仔細看了一下裡面那麼foreach跟浩瀚星空說得一樣沒有用啊...
改成這樣呢?

$keyyy = null;

while ($r = mysqli_fetch_array($rs)){

    $keyyy .= $r['name'];
}

UPDATE `blog` SET
`tags` = '{$keyyy}'
WHERE url = 'XXX'
看更多先前的回應...收起先前的回應...
asys0512 iT邦研究生 5 級 ‧ 2018-09-28 16:40:37 檢舉

這個就是會變成 1,2,3,3,4,5, 把上一篇文章的 tag 拿到下一篇來用,所以越來越多。。

Homura iT邦研究生 2 級 ‧ 2018-09-28 16:43:32 檢舉

asys0512
你截圖一下你的資料表...

asys0512 iT邦研究生 5 級 ‧ 2018-09-28 16:47:06 檢舉
asys0512 iT邦研究生 5 級 ‧ 2018-09-28 16:53:14 檢舉

一開始我直接印 foreach 取出來的 $keyyy 時,是可以順利印出 1,2,3,4,5,
但是 UPDATE 之後反而只有最後一筆 5, 有進去。。。
然後用 .= 這招竟然把上一個文章的全部tag也加進來
假設上一個文章是 1,2,3, 我要更新下一個文章(tag為3,4,5,)時變成 1,2,3,3,4,5,

Homura iT邦研究生 2 級 ‧ 2018-09-28 16:58:26 檢舉

asys0512
那這樣小魚寫的是對的啊....
你while換資料列時
要先把變數清空

我要發表回答

立即登入回答