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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

1回答

1028閲覧

PHP プレースホルダに対して配列の値をバンドしたい

Fujiman

総合スコア41

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

1クリップ

投稿2023/01/28 02:28

編集2023/01/28 03:19

質問

PHPで動的に生成したプレースホルダを含むSQL文について、そのプレースホルダの値のバインドを以下のようにやってみたのですが、データベースにはINSERTされません。execute関数に単純に連想配列を渡すだけではだめなのでしょうか?

PHP

1require 'db_connection.php'; 2 3// テスト用ダミーデータ 4$params = [ 5 'id' => 99, 6 'your_name' => 'John', 7 'email' => 'test3@test.com', 8 'url' => 'http://test3.com', 9 'gender' => '1', 10 'age' => '33', 11 'contact' => 'メッセージ', 12 'created_at' => '2023-01-28' 13]; 14 15$count = 0; 16$columns = ''; 17$values = ''; 18 19foreach(array_keys($params) as $key){ 20 if($count++>0){ 21 $column='id,your_name,email,url,gender,age,contact,created_at '; 22 $columns .= ','; 23  $values=':id,:your_name,:email,:url,:gender,:age,:contact,:created_at' 24 $values .= ','; 25 } 26 $columns .= $key; 27 $values .= ':'.$key; 28} 29 30$sql = 'insert into contacts ('. $columns .') values('. $values .')'; 31 32// var_dump($sql); // "insert into contacts (id,your_name,email,url,gender,age,contact,created_at) values(:id,:your_name,:email,:url,:gender,:age,:contact,:created_at)" 33// exit; 34 35$stmt = $pdo->prepare($sql); 36$stmt->execute($params); 37

試したこと

以下のテストは正常に動作しています(INSERTできています)

PHP

1require 'db_connection.php'; 2 3//INSERTテスト 4$stmt = $pdo->prepare('INSERT INTO contacts (id, your_name, email, url, gender, age, contact, created_at) VALUES(:id, :name, :email, :url, :gender, :age, :contact, :created_at)'); 5$stmt->bindValue(':id', 99); 6$stmt->bindValue(':name', '山田次郎'); 7$stmt->bindValue(':email', 'abc@abc.com'); 8$stmt->bindValue(':url', 'http://text'); 9$stmt->bindValue(':gender', 1); 10$stmt->bindValue(':age', 41); 11$stmt->bindValue(':contact', 'メッセージ'); 12$stmt->bindValue(':created_at', '2023-01-28'); 13$stmt->execute();

また以下のようにバインドをやってみたりもしましたが駄目でした

PHP

1 $stmt->bindValue(":id", $params['id'], PDO::PARAM_INT); 2 $stmt->bindValue(":your_name", $params['your_name'], PDO::PARAM_STR); 3 $stmt->bindValue(":email", $params['email'], PDO::PARAM_STR); 4 $stmt->bindValue(":url", $params['url'], PDO::PARAM_STR); 5 $stmt->bindValue(":gender", $params['gender'], PDO::PARAM_INT); 6 $stmt->bindValue(":age", $params['age'], PDO::PARAM_INT); 7 $stmt->bindValue(":contact", $params['contact'], PDO::PARAM_STR); 8 $stmt->bindValue(":created_at", $params['created_at'], PDO::PARAM_STR); 9 $stmt->execute(); //実行

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

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

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

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

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

yuma.inaura

2023/01/28 02:55

>バインドをループでやってみたり こちらは連想配列の扱いが変なような
m.ts10806

2023/01/28 02:57

エラーハンドリングを入れて確かめてみてください。
m.ts10806

2023/01/28 02:58

ただ、$paramsのキーには:がついてないのでバインド対象とならないような。
Fujiman

2023/01/28 03:05

最初のループのところ、たしかに変でしたので修正しました。
Fujiman

2023/01/28 03:14 編集

実は以下のようにコロンを付けた配列を別に作ってテストもしてみたのですが駄目でした $params2 = [ ':id' => 99, ':your_name' => 'John', ':email' => 'test3@test.com', ':url' => 'http://test3.com', ':gender' => '1', ':age' => '33', ':contact' => 'メッセージ', ':created_at' => '2023-01-28' ]; $stmt->execute($params2);
yuma.inaura

2023/01/28 03:18

具体的なエラー内容を確認することは難しいですか? $sql の文字列はどんな中身になってますか?
Fujiman

2023/01/28 03:26 編集

PHPでのエラーは何も発生していないのですが DB側で発生しているエラーについてどう補足すればいいのかわからないんです とりあえず以下のようにしてexecute()のあと実行したのですが何も表示されません $stmt->execute(); //実行 print_r($stmt -> errorInfo());
m.ts10806

2023/01/28 03:31 編集

私の1つ目のコメントにキーワードがありますし、例えば「PDO エラー捕捉」とかでもすぐヒットするのではと(PHPマニュアルは必須)
yuma.inaura

2023/01/28 03:34

gender と age が文字列になってしまってるような
Fujiman

2023/01/28 05:20

大変すみません 最初の質問のコードはある関数の中身だったのですが その関数にPDOオブジェクトを渡しておらず参照できないことが原因でした。 コロンとか色々、疑ってみましたが、結局はそこでした。 くだらないことですみません。
guest

回答1

0

自己解決

PDOを参照できるようにする

大変すみません
最初の質問のコードはある関数の中身だったのですが
その関数にPDOオブジェクトを渡しておらず参照できないことが原因でした。
コロンとか色々、疑ってみましたが、結局はそこでした。
くだらないことですみません。

投稿2023/01/28 05:21

編集2023/01/28 05:22
Fujiman

総合スコア41

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

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

Fujiman

2023/01/28 12:13

いいリンクをありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問