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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Q&A

解決済

3回答

520閲覧

phpでツイートデータをjsonにし、必要な部分だけsqlに格納したい。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

0グッド

0クリップ

投稿2019/06/24 14:44

編集2019/06/25 05:12

前提・実現したいこと

php初心者です。
phpからjsonデータの必要な部分だけ取り出して、sqlに一括格納したいです。
jsonにするまでには出来ているので、そこまでは略します。

tweets.json

1{ 2 "statuses": [ 3 { 4 "created_at": "略1", 5 "id": "略1", 6 "id_str": "略1", 7 "text": "#テスト\n略1。", 8 "truncated": false, 9 "entities": { 10 "hashtags": [ 11 { 12 "text": "テスト", 13 "indices": [ 14 0, 15 7 16 ] 17 } 18 ], 19 "symbols": [], 20 "user_mentions": [], 21 "urls": [] 22 }, 23 "metadata": { 24 "iso_language_code": "ja", 25 "result_type": "recent" 26 }, 27 "source": "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Twitter Web App</a>", 28 "in_reply_to_status_id": null, 29 "in_reply_to_status_id_str": null, 30 "in_reply_to_user_id": null, 31 "in_reply_to_user_id_str": null, 32 "in_reply_to_screen_name": null, 33 "user": { 34 "id": "1075985828399046656", 35 "id_str": "1075985828399046656", 36 "name": "略1", 37 "screen_name": "略1", 38 "location": "", 39 "description": "略1", 40 "url": null, 41 "entities": { 42 "description": { 43 "urls": [] 44 } 45 } 46 { 47 "created_at": "略2", 48 "id": "1140596976062304256", 49 "id_str": "1140596976062304256", 50 "text": "#テスト/n略2", 51 "truncated": false, 52 "entities": { 53 "hashtags": [ 54 { 55 "text": "テスト", 56 "indices": [ 57 0, 58 7 59 ] 60 } 61 ], 62 "symbols": [], 63 "user_mentions": [], 64 "urls": [] 65 }, 66 "metadata": { 67 "iso_language_code": "ja", 68 "result_type": "recent" 69 }, 70 "source": "<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Twitter Web App</a>", 71 "in_reply_to_status_id": null, 72 "in_reply_to_status_id_str": null, 73 "in_reply_to_user_id": null, 74 "in_reply_to_user_id_str": null, 75 "in_reply_to_screen_name": null, 76 "user": { 77 "id": "1075985828399046656", 78 "id_str": "1075985828399046656", 79 "name": "略2", 80 "screen_name": "略2", 81 "location": "", 82 "description": "略2", 83 "url": null, 84 "entities": { 85 "description": { 86 "urls": [] 87 } 88 }

このようにデータを持っていて(ツイートデータで長いので略してます)、そこから"id","id_str","name","screen_name","text","created_at"の部分をツイート別に格納したいです。↓こんな感じに

idid_strnamescreen_nametweetscreated_at
略1略1略1略1略1略1
略2略2略2略2略2略2
### 発生している問題・エラーメッセージ
array to string conversionとなり、insertは出来るが、結果が全てarrayになります。

該当のソースコード

twitter.php

1<?php 2$json2 = file_get_contents("tweets.json"); 3$json3 = json_decode($json2, true); 4 5 6if($json3 == NULL){ 7 return; 8}else{ 9 $json_count = count($json3["statuses"]); 10 $screen_name = array(); 11 $name = array(); 12 $tweets = array(); 13 $id = array(); 14 $id_str = array(); 15 $created_at = array(); 16 for($i=$json_count-1; $i>=0; $i--){ 17 $screen_name[] = $json3["statuses"][$i]["user"]["screen_name"]; 18 $name[] = $json3["statuses"][$i]["user"]["name"]; 19 $text[] = $json3["statuses"][$i]["text"]; 20 $id[] = $json3["statuses"][$i]["id"]; 21 $id_str[] = $json3["statuses"][$i]["id_str"]; 22 $created_at[] = $json3["statuses"][$i]["created_at"]; 23 24 25 } 26} 27try{ 28 $sql = new PDO('略',[ 29 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 30 PDO::ATTR_EMULATE_PREPARES => false, 31 ]); 32 }catch(PDOException $e){ 33 echo 'connection error: ' . $e->getMessage(); 34 } 35 36 $params ='INSERT INTO php_json (id, id_str, name, screen_name, tweets, created_at) VALUES (:id, :id_str, :name, :screen_name, :tweets, :created_at)'; 37 $stmt = $sql->prepare($params); 38 $stmt->execute(array(':id'=>$id, ':id_str'=>$id_str, ':name'=>$name, ':screen_name'=>$screen_name, 'tweets'=>$text, 'created_at'=>$created_at));} 39 40?>

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

ライブラリはtwitteroauth、phpはバージョンは7.3.6です。

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

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

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

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

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

takasima20

2019/06/24 16:27

指定してるのが全部配列変数なんでそうなるでしょうねえ。
m.ts10806

2019/06/25 02:13

「データをどのように入れたいのか」によってやりかたが全く違います。 具体的に想定しているデータの形を例示してください。
m.ts10806

2019/06/25 05:15

でしたら「ループ内でINSERT」ですね。既にその旨の回答がいくつか出ています。
guest

回答3

0

すべてのデータを1レコードに押し込む

jsonを配列として持っているうちはただの配列です
すべてのデータを1レコードに押し込みたいならjson_encodeしてください

PHP

1$stmt->execute([ 2 ':id'=> json_encode($id), 3 ':id_str'=> json_encode($id_str), 4 ':name'=> json_encode($name), 5 ':screen_name'=> json_encode($screen_name), 6 'tweets'=> json_encode($tweets), 7 'created_at'=> json_encode($created_at), 8 ]);

※ただし、おそらくレコードをバラバラに処理したいんですよね?

データを順次複数レコードに押し込む

PHP

1$sql ="INSERT INTO php_json (id, id_str, name, screen_name, tweets, created_at) VALUES"; 2$sql.=implode(",",array_fill(0,count($id),"(".implode(",",array_fill(0,6,"?")).")")); 3$data=[]; 4foreach($id as $key=>$val){ 5 $data=array_merge($data,[$val,$id_str[$key],$name[$key],$screen_name[$key],$tweets[$key],$created_at[$key]]); 6} 7$stmt = $sql->prepare($sql); 8$stmt->execute($data); 9

投稿2019/06/25 01:13

yambejp

総合スコア114839

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

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

退会済みユーザー

退会済みユーザー

2019/06/25 05:28

ありがとうございます!解決しました!
guest

0

ベストアンサー

php

1$params ='INSERT INTO php_json (id, id_str, name, screen_name, tweets, created_at) VALUES (:id, :id_str, :name, :screen_name, :tweets, :created_at)'; 2$stmt = $sql->prepare($params); 3$json_count = count($json3["statuses"]); 4 5for($i=$json_count-1; $i>=0; $i--){ 6 $screen_name = $json3["statuses"][$i]["user"]["screen_name"]; 7 $name = $json3["statuses"][$i]["user"]["name"]; 8 $tweets = $json3["statuses"][$i]["text"]; 9 $id = $json3["statuses"][$i]["id"]; 10 $id_str = $json3["statuses"][$i]["id_str"]; 11 $created_at = $json3["statuses"][$i]["created_at"]; 12 $stmt->execute(array(':id'=>$id, ':id_str'=>$id_str, ':name'=>$name, ':screen_name'=>$screen_name, 'tweets'=>$tweets, 'created_at'=>$created_at)); 13}

$stmt->executeしている変数内をarrayから各値にしてください。

投稿2019/06/25 02:11

hide0128

総合スコア245

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

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

退会済みユーザー

退会済みユーザー

2019/06/25 05:28

ありがとうございました!できました!
guest

0

下記で配列にしているからです。

php

1 for($i=$json_count-1; $i>=0; $i--){ 2 $screen_name[] = $json3["statuses"][$i]["user"]["screen_name"]; 3 $name[] = $json3["statuses"][$i]["user"]["name"]; 4 $tweets[] = $json3["statuses"][$i]["text"]; 5 $id[] = $json3["statuses"][$i]["id"]; 6 $id_str[] = $json3["statuses"][$i]["id_str"]; 7 $created_at[] = $json3["statuses"][$i]["created_at"]; 8 9 10 }

どういうデータにしたいのかにもよりますが、提示のコードのように一度配列におさめるのではなく、いっそのことfor内で毎回insertしてしまえば良いのではないでしょうか。

蛇足:
DBに関する処理でtry-catchで囲むことは良くありますが、接続部分だけを囲ってもあまり意味がありません。
特にDBに変更を加える処理(INSERT,UPDATE,DELETE)では、何か起きたときに「ロールバック」と言って、DBを処理前の状態に戻すようにする必要があります。
トランザクション→コミットorロールバック の流れをきちんとおさえてください。

投稿2019/06/25 00:26

編集2019/06/25 00:37
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2019/06/25 05:29

ありがとうございます1解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問