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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1316閲覧

PHPからMySQLへの連想配列INSERT

Yt182

総合スコア4

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/05/12 03:11

編集2021/05/12 05:04

連日の質問失礼いたします。

Pythonで作成したJSON配列をPOST通信でPHPへ送信、
PHPでJSON配列をデコードし、取り出した連想配列をMySQLへINSERTしたく思い、
下記コードを作成致しました。

Python

1import csv 2import requests 3import json 4import hashlib 5import hmac 6import base64 7 8# リクエスト先PHP 9API_Endpoint = 'http://localhost:8888/------/logs_insert.php' 10 11 12body = { 13 "data" : [ 14 { 15 'user_id': '0001', 16 'ins_id': 'green_green_greeeeen', 17 'ha_tag': '国分寺', 18 'tar_id': 'cobo.cobo.sucrier', 19 'li_at': '2021-05-11 00:25:46', 20 'pos_at': '2021-05-10T15:17:03.000Z' 21 }, 22 { 23 'user_id': 'AAAAA', 24 'ins_id': 'green_green_greeeeen', 25 'ha_tag': '国分寺', 26 'tar_id': 'kimagure_took', 27 'li_at': '2021-05-11 00:26:04', 28 'pos_at': '2021-05-10T14:53:51.000Z' 29 }, 30 { 31 'user_id': 'AAAAA', 32 'ins_id': 'green_green_greeeeen', 33 'ha_tag': '国分寺', 34 'tar_id': 'm710ys', 35 'li_at': '2021-05-11 00:26:19', 36 'pos_at': '2021-05-10T14:47:33.000Z' 37 } 38 ] 39 } 40 41json_body = json.dumps(body) 42custom_header = {'Content-Type': 'application/x-www-form-urlencoded', 43 'X-Signature' : xxxxxxxx} 44 45# API接続 46result = requests.post(API_Endpoint,data=json_body,headers=custom_header) 47print( "status:", result.status_code ) 48 49print(result) 50print(result.text)

↓Pythonから受け取るPHPです。

PHP

1<?php 2require_once('function.php'); 3$dbh = dbConnect(); 4 5$logs = json_decode(file_get_contents('php://input'),true); 6 7foreach($logs as $log){ 8 foreach($log as $values){ 9 foreach($values as $value){ 10 try { 11 $stmt = $dbh->prepare("INSERT INTO like_logs(user_id,ins_id,ha_tag,tar_id,li_at,pos_at) values (?,?,?,?,?,?)"); 12 $stmt->execute($value); 13 $dbh->commit(); 14 echo '送信成功'; 15 16 } catch(PDOException $e){ 17 echo '送信失敗'. $e->getMessage(); 18 exit(); 19 }; 20 } 21 } 22} 23?>

下記エラー文が出ます。

error

1There is no active transaction

MySQLのテーブル情報は以下です。
①id int(191) AUTO_INCREMENT
②user_id varchar(191)
③ins_id varchar(191)
④ha_tag varchar(191)
⑤tar_id varchar(191)
⑥li_at datetime(6)
⑦pos_at datetime(6)
⑧created_at timestamp(6)

$valueをvar_dampしてみてデータの数を数えても、SQL命令文内のデータの数と一致しているのにエラーが出ます。
他にコード内で悪い箇所があるのでしょうか。

宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

プレースホルダの使い方をきちんと学ぶ必要がある、のは当然として……

PHP

1 $stmt = $dbh->prepare("INSERT INTO logs(user_id,ins_id,ha_tag,tar_id,li_at,pos_at) values (?,?,?,?,?,?)");

ここでプレースホルダありの SQL 文を準備しています。

PHP

1 $stmt->execute($value);

この文が誤っています。
executeをする際には、プレースホルダの全てに値をバインドしておかなくてはなりません。もとの SQL ではプレースホルダが6個ありますので、6つの値をバインドしなくてはいけません。

投稿2021/05/12 03:57

tacsheaven

総合スコア13703

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

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

Yt182

2021/05/12 04:26

Foreachの中でもう一度Forearchすることによりエラーを回避できました。 が、MySQLへお目当ての項目がINSERTされておりませんでした。 エラーも出ていないので、何がおかしいかが不明です。データベースへの接続も問題なく行われていました。
tacsheaven

2021/05/12 04:30

オートコミットでない場合は execute() した後に commit() しなくては結果が反映されません。 また、insert の SQL が成功したかどうか、execute() の戻り値をチェックするなどしましょう。
Yt182

2021/05/12 04:59

ありがとうございます。 試してみましたが、There is no active transactionとエラー文が出てしまいます。 また、戻り値のチェックはどうやって行うのでしょうか。 度々すみません。 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問