作法的に違うのかもしれませんが、前回の質問を解決済みにしてしまってるのですが、やはり解決してなくて再度質問させてください。
以下のように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}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/29 10:31
2022/05/29 14:41