質問するログイン新規登録
MySQL

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

PHP

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

Q&A

解決済

1回答

849閲覧

【PHP】配列を引数に展開したい

Fujiman

総合スコア41

MySQL

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

PHP

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

0グッド

0クリップ

投稿2022/06/02 01:19

0

0

ポイントを絞れないまま質問して回答を得られなかったので、再度、聞きたいことポイントを絞って質問します。

mysqliの手続き型で、データベースを更新したいケースで、mysqli_stmt_bind_param関数にわたす引数を配列で持ってしまっており、それを展開した形で引数に渡したいです。現状では下記の湯なエラーになってタイプ属性の文字数と与えた引きの数が合わないというエラーになります。

FatalError

1Uncaught ArgumentCountError: The number of elements in the type definition string must match the number of bind variables

前回の質問で教えていただいたことをやってみたのですが、そもそもよく考えてみると、以下の自分のコードでは、根本的に、実際には配列の中身をmysqli_stmt_bind_param関数の第三引数以降に展開できていないと思うのです。どうすればうまく渡せるでしょうか?getParam関数内で、標準出力の書き出しではだめのような気がするのですが。

PHP

1 $link = mysqli_connect(DB_HOST, DB_USER, DB_USER_PASS, DB_NAME); 2 $sqlBase = "UPDATE jirei SET name = ?, age = ?, addr = ? WHERE id = ?;"; 3 $columnP = "sisi"; 4 $params = ['Mike',23,'Tokyo', 56] 5 6 function getParam(...$list) { 7 foreach ($list as $val) { 8 echo $val."<br>"; 9 } 10 } 11 12 function test1($callable, $arr) { 13 return call_user_func_array($callable, $arr); 14 } 15 16 if ($stmt = mysqli_prepare($link, $sqlBase)) { 17 mysqli_stmt_bind_param($stmt, $columnP, test1("getParam", $params)); 18 mysqli_stmt_execute($stmt); 19 $stmt_error = mysqli_stmt_error($stmt); 20 if ($stmt_error !== "") { 21 var_dump($stmt_error); 22 exit(); 23 } 24 mysqli_stmt_close($stmt); 25 } else { 26 echo 'dame'; 27 exit(); 28 }

pho.netより

mysqli_stmt_bind_param() と call_user_func_array() を組み合わせて使う場合は注意が必要です。
mysqli_stmt_bind_param() へのパラメータは参照渡しでなければなりませんが、 call_user_func_array() には変数のリストをパラメータとして渡すことができます。 この変数は参照であっても値であってもかまいません。

↑このこともクリアしていると思うのですが・・・

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

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

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

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

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

guest

回答1

0

ベストアンサー

mysqliの呪縛ですね、しかも手続き型を使い続けるなら
もっと真剣に学習した方がよいですね
すなおにPDOにすれば楽なんですけどね・・・

PHP

1call_user_func_array("mysqli_stmt_bind_param",array_merge([$stmt,$columnP],$params));

投稿2022/06/02 01:49

yambejp

総合スコア118079

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

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

Fujiman

2022/06/02 03:04

ありがとうございます。また本気で取り組んでいないことは否めません。すみません。教えていただいたのは、必要なものを全部、配列にまとめてそれから"mysqli_stmt_bind_param"関数自体をcall_user_func_arrayで呼ぶことで可変の配列内容をうまく渡せるということだったと思います。おかげで解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問