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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

1回答

586閲覧

【PHP】mysqli_stmt_bind_paramの第3引数に配列を渡したい

Fujiman

総合スコア41

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2022/05/29 01:29

作法的に違うのかもしれませんが、前回の質問を解決済みにしてしまってるのですが、やはり解決してなくて再度質問させてください。

以下のようにUPDATEの実行の処理の中でmysqli_stmt_bind_paramを使っていますが、バインドする変数の列挙の部分でうまくいきません。第三引数以降、必要な変数の内容を保持した配列を展開すればいいのかと思いこのようにしたのですがエラーになってしまいます。プロパティーのタイプの文字の数と渡した値(各変数の参照)の数が合わないということなのですが、ここはどうすれば、いいでしょうか?

第三引数以降に直接、必要な変数をカンマ区切りで配置すると正常に処理できます。なのでこの部分で、配列の展開がうまくできていない、すなわち、「変数の列挙」になっていないということだと思います。どう記述すればいいでしょうか?

Error

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

PHP

1 $id = $_REQUEST['id']; 2 $title = $_REQUEST['title']; 3 $resolution = $_REQUEST['resolution']; 4 $detail = $_REQUEST['detail']; 5 $schoolyear = $_REQUEST['schoolyear']; 6 $subject = $_REQUEST['subject']; 7 $keyword = $_REQUEST['keyword']; 8 $source = $_REQUEST['source']; 9 $app = $_REQUEST['app']; 10 $params = [& $title, & $resolution, & $detail, & $schoolyear, & $subject, & $keyword, & $source, & $app]; 11 $sqlBase = "UPDATE jirei SET title = ?, resolution = ?, detail = ?, schoolyear = ?, subject = ?, keyword = ?, source = ?, app = ?"; 12 $columnP = "sssissss"; 13 $addSQL = ""; 14 15 if ($_FILES['image']['name'][0] !== "") { 16 $filename = $_FILES['image']['name'][0]; 17 $filetype = $_FILES['image']['type'][0]; 18 $filecontent = file_get_contents($_FILES['image']['tmp_name'][0]); 19 $size = $_FILES['image']['size'][0]; 20 $columnP = $columnP . "sssi"; 21 $addSQL = $addSQL . ", `image_name` = ?, `image_type` = ?, `image_content` = ?, `image_size` = ?"; 22 $params = array_merge($params, [$filename, $filetype, $filecontent, $size]); 23 } 24 25 if ($title == '' || $resolution == '' || $detail == '' || $schoolyear == '' || $subject == '' || $keyword == '') { 26 $error_flag = true; 27 } 28 29 $sqlFinal = $sqlBase . $addSQL . " WHERE id = ?;"; 30 $columnP = $columnP . 's'; 31 $params[] = & $id; 32 33 function getParam(...$list) { 34 foreach ($list as $val) { 35 echo $val; 36 } 37 } 38 39 function test1($callable, $arr1) { 40 call_user_func_array($callable, $arr1); 41 } 42 43 if (!$error_flag) { 44 if ($stmt = mysqli_prepare($link, $sqlFinal)) { 45 mysqli_stmt_bind_param($stmt, $columnP, test1("getParam", $params)); 46 mysqli_stmt_execute($stmt); 47 $stmt_error = mysqli_stmt_error($stmt); 48 if ($stmt_error !== "") { 49 var_dump($stmt_error); 50 exit(); 51 } 52 mysqli_stmt_close($stmt); 53 } else { 54 echo 'dame'; 55 exit(); 56 } 57 } 58}

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

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

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

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

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

guest

回答1

0

test1関数の返り値がないので、mysqli_stmt_bind_param($stmt, $columnP, test1("getParam", $params));と書いた場合、第3引数にはNULLが渡されます。

投稿2022/05/29 06:54

maisumakun

総合スコア145201

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

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

Fujiman

2022/05/29 10:31

ありがとうございます。なるほどと思ってtest1を以下のようにreturnを追加して試しても同じエラーが出るので、実際の返り値はどの様になっているか確認しました function test1($callable, $str1) { return call_user_func_array($callable, $str1); } var_dump(test1("getParam", $params)); // AAAA cdsc xcds 1 kokugo cdsc csdx move 45 NULL ファイルの変更情報がない場合、渡したい配列$paramsの最後はレコードのid番号で上で言うと45なのですが、なぜか最後にNULLが紛れ込んでしまっていて、プロパティータイプの文字数と合わないと言われていることがわかりました。このNULLは明らかに配列$paramsの要素ではなくforeachの処理の結果、最後に返されてるのではないかと思ってるのですが、この単純なforeachを、あと、どうすればいいのかがわからず、教えていただきたいです
maisumakun

2022/05/29 14:41

> test1を以下のようにreturnを追加して試しても同じエラーが出るので call_user_func_arrayで呼んでいるgetParamも、返り値のない関数です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問