🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

761閲覧

php  $_SESSIONで sqliteデータの引き渡しができない。

dendoushishi

総合スコア3

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PHP

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2024/06/24 05:00

実現したいこと

phpプログラム間で sessionモードを使用して Sqlite データを引き渡したい。

発生している問題・分からないこと

① A.php で Sqlte データを $@@@ に格納する。
② その後、下記プログラムにて $_SESSION にデータを引き渡す。
$_SESSION[''] = $@@@;
③ 引渡し先の B.php で下記プログラムにてデーターを読込みたい。
$result =$_SESSION['
'] ;

該当のソースコード

php

1A.php 2 3<?php 4session_start(); 5 6 // db定義 ********************************** 7 $file_db = '/home/patoDB.db'; 8 9 // dbに接続 ******************************** 10 function connect_db(){ 11 global $file_db; 12 $db = new SQLite3($file_db); 13 return $db; 14 } 15 //****************************************** 16 17$db = connect_db(); 18//$s_data1 = "1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0i,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0"; 19//$s_data2 = "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"; 20 21$sql = "select * from p_data_today where mid='130' limit 1;"; //先ずは1行だけ指定して確認 22$s_data3 = $db->query($sql); 23 24$_SESSION['today_table'] =$s_data3; 25 // for debug ******************************************* 26 //print "s_data: "; 27 // while ($row = $_SESSION['today_table']->fetchArray()) { 28 // var_dump($row); 29 // print '<br>'; 30 // } 31 //print '<br>'; 32 //****************************************************** 33 // $s_data3 の表示内容 34 //s_data: array(18) { [0]=> int(38120) ["id"]=> int(38120) [1]=> string(19) "2024-06-24 00:00:43" ["datetime"]=> string(19) "2024-06-24 00:00:43" [2]=> string(19) "2024-06-24 00:00:47" ["new_dd"]=> string(19) "2024-06-24 00:00:47" [3]=> int(4) ["time_dif"]=> int(4) [4]=> string(3) "OFF" ["RED_LED"]=> string(3) "OFF" [5]=> string(3) "OFF" ["ORENGE_LED"]=> string(3) "OFF" [6]=> string(3) "OFF" ["GREEN_LED"]=> string(3) "OFF" [7]=> string(3) "130" ["mid"]=> string(3) "130" [8]=> string(13) "192.168.0.130" ["ip"]=> string(13) "192.168.0.130" } 35?> 36・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 37 38B.php 39 40<?php 41session_start(); 42 43$result = array(); 44$result = $_SESSION['today_table']; 45echo "memory: "memory_get_usage() . "\n"."<br>"; // メモリ不足か確認用 46echo "result_1: ".$result."<br>"; 47 48 // for debug ******************************************* 49 print "result_2: "; 50 while ($row = $result->fetchArray()) { 51 var_dump($row); 52 print '<br>'; 53 } 54 print '<br>'; 55 //****************************************************** 56?>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ブラウザ表示は以下のようになり、$s_data3 の sqliteデータは引き継がれていない模様
memory: 350280
result_1:
result_2:

ちなみに、$_SESSION['today_table'] =$s_data3; を $s_data1 及び $s_data2 
に置き換えた場合は以下のようになるのでデータは引き継がれている模様

  $s_data1 の場合
memory: 350280
result_1:1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0i,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0
result_2:

  $s_data2 の場合
memory: 350280
result_1:1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
result_2:

sqlite データを引き継がせるにはどうしたらいいか知りたい

補足

開発環境: pi4-4GB,OS:raspbian, apache2, php7.4, Sqlite3(Node-REDにてDB集積)
PC(windows10 home)上の Chrome にて表示確認

result1: , で区切られた場合のデータ確認用。
result2: 区切りが無い場合のデータ確認用 もう少し長くなると vim がぶっ飛んでしまうのでこのくらいの長さにした。

以上。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

他の回答でお話しされている内容も確認しました。

AをAPI化してBからリクエストする方法ではどうでしょうか。

A.phpでは次のように、取得したデータをjson形式に変換します。

php

1// データを取得 2$data = 中略 3 4// JSON形式に変換 5$json = json_encode($data); 6 7// ヘッダー設定 8header('Content-Type: application/json'); 9 10// データ出力 11echo $json;

B.phpではA.phpへリクエストし、jsonを配列に復号、その後に好きなように処理してください。

php

1// APIエンドポイントURL 2$url = 'http://localhost/A.php; 3 4// リクエスト送信 5$curl = curl_init($url); 6curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 7 8// レスポンス取得 9$response = curl_exec($curl); 10curl_close($curl); 11 12// JSONデコード 13$data = json_decode($response, true); 14 15// データ処理 16var_dump($data);

例えばユーザがデータの絞り込み等をする場合、パラメータをB.phpに渡します。

https://example.com/B.php?keyword=abc

php

1// まずBで keywordを取得 2$keyword = $_GET['keyword']; 3 4// URLにパラメータも付与してリクエストするように変更 5$url = 'http://localhost/api/data?keyword=' . urlencode($keyword);

どのようなページ遷移をされるのか不明ですが、
AでのみDBアクセスできる状況は、一般に公開されているようなAPIと条件的には同じです。
こちらのAPIの仕組みを利用するのが、本件の実装としても一般的かと思います。


追記1

?api=1の時のみ、json形式に変換&jsonレスポンス

php

1if($_GET['api'] == '1') { 2 $s_data3 = $db->query($sql); 3 4 // ヘッダー設定 5 header('Content-Type: application/json'); 6 // データ出力 7 echo $json; 8}

投稿2024/06/24 06:46

編集2024/06/25 03:15
sk_

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendoushishi

2024/06/24 06:54

早速のご回答ありがとうございます! これから試してみます。 ただ、API等分からない処が多いので、時間がかかると思いますが、 結果が判明次第、またお返事致します。 以上。
sk_

2024/06/25 00:41 編集

簡単に言うと、通常のウェブサイトがHTMLやCSSを使って人間向けに優しく表示するのに対し、 APIは見た目の整形なしに、データだけを表示します。 例に挙げたjsonも一つのデータ形式です。 データだけを表示するので、人間が見るのには適していませんが、プログラム視点で見ると構造がハッキリしていて読みやすくなっています。 それをAPIと言い、ブラウザからアクセスするのではなく、プログラムBからアクセスすることで Aで取得したデータをBに渡します。
dendoushishi

2024/06/25 02:10

ご教授ありがとうございます! 色々試した結果、 ①SQLiteデータをそのまま JSON形式に encode できない。 ②ヘッダー設定 header('Content-Type: application/json'); の置き場所が分からない  → A.php をメインにして グラフを描画しているので、    ヘッダー設定をすると以下のプログラム内容が json に認識されるらしく、    以下のプログラムが動かない で悩んでおります。 現状の構成は、 A.php  ①SQLite temporary table を作成  ②グラフ描画ができるデータに加工  ③urlにてデータ引渡しし、B.php にてグラフ描画  ④③を include して CSSで指定したフレームに埋め込んで表示 となっております。 追加質問  (1)JSON データの容量はどの程度までOKなのでしょうか?  (2)上記③・④は成り立つのでしょうか? 申し訳ありませんが、ご教授願えませんでしょうか? 以上。
sk_

2024/06/25 03:06

逆質問になってすみませんが、A.phpそれ自体はアクセスすると何かグラフが描画されるページということでしょうか? つまり、 http://example.com/A.php という形でアクセスし、グラフが表示される状態ですか?
sk_

2024/06/25 03:22 編集

現時点でお答えできることで言うと、  ①SQLite temporary table を作成   既にA.phpコード内で取得されている$s_data3をjson_encode($s_data3)することで完結できますか?  ②グラフ描画ができるデータに加工  ③urlにてデータ引渡しし、B.php にてグラフ描画   ②〜③をB.php内で行います  ④③を include して CSSで指定したフレームに埋め込んで表示   こちらもA.phpから"埋め込んで表示"までと同じ手順と考えています 回答分に"追記1"を追記しました。 B.phpからリクエストする際に、URLへapi=1と言うパラメータを載せてアクセスさせます。 $url = 'http://localhost/api/data?api=1'; A.php内では$_GET['api']が1の時のみ、レスポンスをjsonにする単純なif文を書きます。(追記1参照) そうすれば、従来のアクセスでは従来通りにグラフ表示、Bからのリクエスト時はjsonレスポンスを返すと言う形にできませんでしょうか? またjsonデータには基本的に容量制限はありません。 ただし、回答に書いたような絞り込みを実施して、必要最低限のデータを渡すのがAPIにおけるベターな方法ではあります。 (1ヶ月分のデータを表示する場合は、1ヶ月分のデータのみjsonにして渡す等)
dendoushishi

2024/06/25 04:13

お返事ありがとうございます! 以下、回答させて頂きます。 1.http://example.com/A.php という形でアクセスし、グラフが表示される状態ですか?   → その通りです。 ①SQLite temporary table を作成   既にA.phpコード内で取得されている$s_data3をjson_encode($s_data3)することで完結できますか?   → json_encode($s_data3) で B.php に引渡し、json_decode できれば完結できると思います。 追記部分について  B.php は 折れ線グラフ専用のプログラムなので、全て JSON データでOKです。  ご指摘ありがとうございます。 先程投稿した SQLite テーブルをJSON方式にする方法ですが、まだ成功できていません・・・ 以上。
sk_

2024/06/25 06:06

> SQLite テーブルをJSON方式にする方法 こちらですが、必要な手順ではないと考えています。 A.phpで$s_data3として配列を取得できているので、こちらの配列をjson_encodeしてjsonデータを作成。それをB.phpから取りに行く方法はダメでしょうか? SQLite テーブルをJSON方式にする方法でも、DBからJSONを直接生成できて処理的には効率的かもしれませんが、データの源流がAとBで異なってしまうことと、(失礼ながらプログラムを普段書かれないとのことなので)既にある$s_data3をjsonにする方法が簡単かと思いました。 (SQLite テーブルをJSON方式にする方法と、$s_data3をjson_encodeする方法では、どちらも最終的に取得できるデータは同じものと認識しています。)
dendoushishi

2024/06/25 07:53

何度もご教示して頂きありがとうございます! ご指摘の通り、現在 配列をjson_encode する方向で難儀しております。 raspberry pi4:OS raspbian + apache2 + php + SQLite で開発しているのですが、 json_encode 前に $s_data3 にSQLiteデータが入っているのは以下で確認済みです。    print "data3: "; while ($row = $s_data3->fetchArray()) { var_dump($row); print '<br>'; } print '<br>'; echo json_last_error_msg(); $json2 = json_encode ($s_data3); echo $json2."<br> var_dump: "; var_dump($json2); --> Chrome で出力確認すると     No error     {}     var_dump: string(2) "{}"   となり、encode 後のデータが確認できず難儀しております。   /etc/php/7.4/cli/php.ini /etc/php/7.4/apache2/php.ini に JSON に関係する部分は無く、     $ sudo apt install php-json で更新を行い、     $ sudo systemctl restart apache2 を実施、再度プログラムを走らせても、Chrome の表示は同じです。   encode 後のデータ確認方法がお分かりでしたらご教示願えませんでしょうか?   以上。
sk_

2024/06/25 08:52

そちらのコードを見る限り、$s_data3は配列ではなく、SQLite3Resultオブジェクトかと思います。 オブジェクトはjsonエンコードできませんので、まずは$s_data3を配列(Array)に変換してください。 あまりSQLite3Resultを扱ったことがないので、ベターな方法かわかりませんが、 このような関数を用意し、 function sqliteFetchAll($results): array { $multiArray = []; while($result = $results->fetchArray()) { $multiArray[] = $result; } return $multiArray; } 次のように利用すれば配列になりませんか? $s_data3_array = sqliteFetchAll($s_data3); それで解決しなければ、 通常の配列であればjson_encodeは可能ですので、まずは$s_data3の形を確認してみてください。 var_dump(gettype($s_data3)); こちらはArrayである必要があるんですが、それ以外であれば、クラス名 php Array 変換等で検索して変換してみてください。 またjsonはbom無しutf8に最適化されていますので、PHPの文字エンコーディングも確認してください。 get_option('default_charset') →上記でも特に問題が見つからない場合 最悪、json_encode関数でなくとも構いません。xmlやcsvに変換してもよいですし、最悪、次のように手動で変換してください。 $s_data3_array = []; while ($row = $s_data3->fetchArray()) { $resultRow['columnA'] = $row['columnA']; // 実際の値の取り出し方は調整してください $resultRow['columnB'] = $row['columnB']; ... すべてのカラムを代入 $s_data3_array[] = $resultRow; } json_encode($s_data3_array); // これをレスポンスとして返す
dendoushishi

2024/06/26 00:51

おはようございます! 度々の質問に対し、丁寧な回答を頂きまして助かります! ご指摘の通り object でした。   var_dump(gettype($s_data3));    ―→ string(6) "object" var_dump: その後、   function sqliteFetchAll($results): array  以下を移植   $s_data3_array = sqliteFetchAll($s_data3); にて array 変換      var_dump(gettype($s_data3));        ―→ string(5) "array" var_dump:  array変換OK      $json_s_data3 = json_encode($s_data3 ,JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); echo json_last_error_msg()."<br>"  ―→ No error echo "var_dump(encoded_s_data3): ".var_dump($json_s_data3)."<br>"; ―→ encode OK $decoded_data = json_decode($json_s_data3, true); echo "decoded_dump: ".var_dump($decoded_data)."<br>";  ―→ decode OK を確認しました! ありがとうございました!!! ただ・・・・ decode 後の各Arrayデータの頭に  array(1) { [0]=> decode 後のお尻に         } が付いているので削除しなければなりませんが・・・ つまり、 array{ orijinal array {}} の状態ですかね・・・・ 頑張ります。 以上。   
dendoushishi

2024/06/26 01:00

当初とはかけ離れたプログラム構成になってきているのですが、 別のスレッドを立て直した方が良いのでしょうか? 自分の事だけ考えると、  「SQLiteデータを別のPHPプログラムに引き渡しできるまで」 このままだらだら続けた方が楽ですが・・・・・・・ 初心者なのでどなたか教えて頂けるとありがたいです。 以上。
sk_

2024/06/26 01:13

どこかの段階で配列が1段階余分に入れ子にっているのかと思います。 []か[[]]かの差になります。 ここまで紆余曲折あると重く捉えがちですが、単純な問題かと思いますので、 配列の構造を確認して、不要な箇所を抜いてあげてください。 [ //不要なArray [ // 必要なArray [ 必要なデータ ] [ 必要なデータ ] ] ] 例えばこの入れ子構造であれば、 このように処理すれば、一番外側の[]が外れるのはわかりますでしょうか? $array = $array[1]; 上記のように、同じ変数に再代入するのは基本悪手になるので、適当な変数名を設定ください。 https://zenn.dev/miya_tech/articles/8e6781c24e85ba または、意図せず1つ多く入れ子している部分を特定して(この変数にかかわる処理部分各所でダンプして)、余計な入れ子にならないよう処理を修正してください。 説明が前後してしまいましたが、こちらの方法がベターかと思います。
dodox86

2024/06/26 01:16

@質問者 dendoushishiさん "Raspbery Pi"のタグが付いていたので少し注視していた者です。 > 自分の事だけ考えると、 >  「SQLiteデータを別のPHPプログラムに引き渡しできるまで」 > このままだらだら続けた方が楽ですが・・・・・・・ 本来、teratailは何らかのサポートサイトではなく、プログラミングの技術的トピックに関するQ&Aサイトです。 質問当初の内容から変わっていって長々と続けていくのは主旨に反しますし、何より回答者さんの負担になるので止めた方が良いです。(そういうやり取りに応えてくださる回答者さんもいらっしゃいますが) 当初の質問に対して一定の区切りがついた時点で、いただいた回答にベストアンサーを付けるなり自己解決で閉じることをお勧めします。
dendoushishi

2024/06/26 01:38

sk_さん 早速のご指摘ありがとうございます! 至急確認致します。 また、当初の趣旨とかなりかけ離れてしまい、かなりご負担をお掛けしました事を お詫び申し上げます。 今回頂いたご回答をベストアンサーとさせて頂き、 一旦このスレッドは閉じさせて頂きます。 dodox86さん ご指摘ありがとうございます! 早速閉じさせて頂きます。 以上。
sk_

2024/06/26 16:25

とんでもないです。ご質問の内容が "データの受け渡し" でしたので、その間の些細な質問は許容範囲内と考えていますし、dendoushishiさんはもちろん、後々ここをご覧になる他の初学者さんたちの役に立てばそれでよいと思ってます。 実現までの方法という意味では示せている(≒解決済み)かと思いますので、本件は閉じられても他の方の役に立つと思います。 各キーワードで検索されれば必ず実装できるので、不躾な言い方ですが引き続き頑張ってください。
dendoushishi

2024/06/27 04:43

お返事ありがとうございます! 頑張ります!
guest

0

セッションで渡せるのは値です(オブジェクトはNG)

$s_data3 = $db->query($sql);

で戻る$s_data3はSQLite3Result オブジェクトなので

$row = $s_data3->fetchArray()

などで値として抽出しないと保持できません

投稿2024/06/24 05:32

yambejp

総合スコア116644

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dendoushishi

2024/06/24 05:48

早速のご回答ありがとうございます! オブジェクトではダメなんですね・・・・ 本プログラムはSQLiteのデータを使用して折れ線グラフ描画する為の物です。 データ量が多く、毎回SQLiteデータを読み出していると時間がかかる為、 一括して引き渡したいと思っております。 説明不足で申し訳ありません。 よって、ご指摘の方法では現状の再読み込み方法と変わらなくなってしまう為、 難しいと思います。 また、SQLiteデータベースは常に Node-REDにて更新されており、 temporary table を作成して参照している状態なので、 B.php でのtable参照ができず困っております。 以前にも https://teratail.com/questions/5y2g80n5kc4tcg で質問させて頂き、 検討したのですが、上手くいかず、今回のような方法を検討してみました。 なんとか大量のデータを引き継がせる方法をご存じでしたら、ご教授頂けると助かります。 以上。
yambejp

2024/06/24 05:56

値をファイルに落として、ファイルとして参照させるか セッションではなく飛び先で再検索すればいいのでは?
dendoushishi

2024/06/25 01:30

ご指摘ありがとうございます! 返事が遅くなり申し訳ありません。 何分初心者なので、全体構成から見直さないとダメなような気がします。 「ファイルとして参照」、「飛び先で再検索」もちんぷんかんぷんで・・・・ これから調べてみます。 sk_ 様から頂いた別回答の JSON:encode->decode も SQLiteデータをそのまま変換できず 悶絶しています・・・・ 以上。
dendoushishi

2024/06/25 04:41

度々の質問で申し訳ありません。 上記 JSON方式がなかなか進まないので、 https://appdev-room.com/php-json を参考にして   file_put_contents( ファイルパス , データ , フラグ ) で必要分だけ書込み   file_get_contents(ファイルパス) で全て読込み しようと思いますが、如何でしょうか?
dendoushishi

2024/06/25 05:01

すみません。 上記は JSONファイル用のコマンドでした・・・・・ お騒がせしました。 もう少し調べます・・・・・
dendoushishi

2024/06/26 01:41

yambejpさん せっかく頂いたご回答を生かせず申し訳ありません。 当初の趣旨とかなりかけ離れた状況になりましたので、一旦このスレッドを閉じさせて頂きます。 また、色々とお世話になることがあると思いますが、 今後とも宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問