質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • PHP

    18639questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5351questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

DBから取得したデータを文字列に変換

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 152

N.Y..

score 12

 DBから取得したデータを文字列に変換

・前提
1.phpとmysqlを使い、記事掲載ページを作っています。
2.異なるデータベースを使用しています。

・やりたいこと
異なるDBのデータと、使用しているDBのデータ紐づけ、条件をつけて表示したいです。

実現したいことの例)
DB:AとDB:Bがあったとします。
DB:Aには記事の情報が入っています。
具体的には、記事ID,記事Title, 記事Body.....のような感じです。
DB:Bには、Bookmarkした記事IDが入っています。
具体的には、2,4,8,22...のように入っています。
そこで、DB:Bから取得したデータ(Bookmarkした記事ID)を一度文字列にし、
DB:Aのデータと一致すれば、Bokmarkした記事を取得できる。

といった感じにしたいです。

しかし、DB:BからBookmarkした記事IDは取得できるのですが
どうやら文字列に変換できないようです。

こちらがそのエラーメッセージです。

 発生している問題・エラーメッセージ

Notice: Array to string conversion in ......on line 80 Array ( )

 該当のソースコード1

SQL文の関数です。

 function from_B(){ //BはDB名です。
$sql = <<<SQL
select bookmarked_id
from bookmarke_table
SQL;

return query($sql); // 本来のqueryはもっとちゃんとしたものを使っています。
}

function from_A($data){ //AはDB名です。
$sql = <<<SQL
select *
from A.all_article where article_id in ("+$data+")  --AはDB名です。
SQL;

return query($sql);
}

 該当のソースコード2

PHP側でデータを取得する関数です。

 function from getbookedarticle(){
$get_first = $this->from_B() //bookmarkした記事のIDを取得
$implode = implode(",",$get_first) //配列を文字列にする
$get_second = $this->from_A($implode);//bookmarkした記事IDと記事のIDが一致したデータを取得
echo $get_second;
}

 補足情報(FW/ツールのバージョンなど)

現在、テスト用にDB:Bに入っているBookmarkした記事の数は1つだけです。
そのため、文字列へ変換し、連結するimplode関数で大丈夫なのでしょうか?
また、print_rなどでDB:Bから取得した値は、多次元配列になっております。

Array ( [0] => Array ( [article_id] => 4 ) ) 
のような感じです。

DB:A、DB:B各々のIDはintです。
詳しい情報を提供できなく、大変申し訳ないのですが、
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2018/04/24 16:56 編集

    理解しにくいからテーブルの定義は CREATE TABLE文で載せては?

    キャンセル

  • N.Y..

    2018/04/24 16:58

    既に既存してあるサービスで、既存のものを使うしかありません。大変申し訳ないのですが、ご理解よろしくお願いいたします。

    キャンセル

  • ttyp03

    2018/04/24 17:11

    前置きとか不要。要は二次元配列をimplodeするには?ってことですよね?

    キャンセル

  • N.Y..

    2018/04/24 17:14

    できるだけ詳しく書こうと思ったのですが、そうですね。おっしゃる通りです。

    キャンセル

回答 3

+2

<?php

$array = [
    0 => ['article_id' => 4],
    1 => ['article_id' => 6],
];

$result = [];
foreach ($array as $arr_item) {
    $result[] = $arr_item['article_id'];
}

echo implode(',', $result);  // '4,6'


実行結果

こんなんでいかがでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/24 17:29

    ご回答ありがとうございます。
    試して見ます!

    キャンセル

  • 2018/04/24 18:17 編集

    もしも前提になるデータ構造が違うのであればこのサンプルコードは無意味になるので、その点のチェックをお願いします。

    キャンセル

check解決した方法

0

implodeではなく、
foreachを使い、配列の値だけを取得するようにすると、うまく行きました。

    foreach($get_first as $marked){
      foreach($marked as $m){
                 echo $m;
      }
    }


この方法だと、まだまだ初心者感が出ていると思いますが正常に動作しました。

みなさんご協力ありがとうございました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

まず前提としてDBとDBのリレーション的な流れで話をされていますが
テーブルとテーブルでよろしいでしょうか?

内容的にはfrom_A($data)で渡している$dataが配列なのでは?
またquery()という関数に$sqlを投げていますが,$dataを直接埋め込むような
処理は適切ではありません。
もし状況が許すのであればプレースホルダーを利用して
セキュリティやエスケープ作業の負荷をシステム側に任せたほうがよいでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/24 17:27 編集

    ご回答ありがとうございます。
    おっしゃる通り、$dataが配列ということは承知しております。
    引数の$dataに値を渡す以前に、取得したデータを文字列にし、$dataには文字列が渡されるようにしたいと思っております。
    まだまだ初心者でなので、その実装方法がわからずにいます。
    勉強不足で、申し訳ございません。
    queryに関して、セキュリティーが弱い件に関しては
    上位のクラスにセキュリティーなどの処理を実装しております。
    御気遣いありがとうございます。

    キャンセル

  • 2018/04/24 17:31

    > 上位のクラスにセキュリティーなどの処理を実装しております。
    これ、事故起こす発想ですよ^^;

    キャンセル

  • 2018/04/24 17:33

    そうなのですね、、、
    もう一度確認して見ます。
    私もまだまだですね。ありがとうございます。

    キャンセル

  • 2018/04/24 17:35

    > queryに関して、セキュリティーが弱い件に関しては
    > 上位のクラスにセキュリティーなどの処理を実装しております。

    処理とデータが別れていない以上、上位のクラスもないも
    セキュリティを高めることはほぼ不可能です
    処理とデータを分けて提案する形にしないと意味がありません
    (それがすなわちプレイスホルダ)

    キャンセル

  • 2018/04/24 17:40

    ご返信ありがとうございます。
    プレイスホルダに関しても、ざっくりとしか理解しきれてなかったので
    勉強します。
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    複数ワードでのand検索方法

    phpでキーワード検索を実装したいのですが、もっと綺麗な書き方ありますでしょうか? 下記の方法しか思いつきませんでした。 if ( $serchWord != '' ) {

  • 解決済

    for

    前提・実現したいこと 初めまして。今、私は友人からPHPを教わっています。 その友人から出された宿題に関して分からないことが起きてしまったため質問させていただきます。 出され

  • 受付中

    ショッピングサイトをつくっていて、クラスを別に分けたいのですが、分け方がわかりません。

    データベースに接続するコネクトの部分を別クラスに分けたいのですが、方法につまっています。 分けたクラスには別の名前をつけて、読み込みもしたいです。 分かる方おしえてください

  • 解決済

    phpの掲示板で最初のデータだけ表示されない

    phpで掲示板を作成しました。 フォームでmysqlのテーブルにデータを送信し、その内容を取ってきて一度配列に入れて、100件づつ、日付順に表示する、というものです。 しかし、

  • 解決済

    PHP ユーザ定義関数の書き方について

    前提・実現したいこと 3桁の数字の配列が、変数$iの数字と一致(数字の並び順は関係なし)していたら、 "OK"のメッセージを表示させるプログラムを書きたいです。 発生して

  • 受付中

    PHP 配列について

    XXX4.phpでループ処理した配列データをデータベースから取得して、メインのクラスで一覧表示するという処理を行いたく、コーディングしてみて分からなくなった箇所があります メ

  • 解決済

    クラスの作成が成功に至りません。

    <?php class User { public $name; public function __construct($name) { $this->name

  • 解決済

    複数の配列データを一括でDBに書き込む方法

    表題のように、PHPで複数の配列データを一括でDBにinsertする方法が分かりません。F/Wはlaravel5.4を使用しています。 流れを説明しますと、 ① control

同じタグがついた質問を見る

  • PHP

    18639questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5351questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。