$sql->execute($_SESSION['customer']['kaiin_id'],$_REQUEST['day'],$_REQUEST['time0']);
↓
$sql->execute([$_SESSION['customer']['kaiin_id'],$_REQUEST['day'],$_REQUEST['time0']]);
とすればとりあえずこのエラーは解消するかと思います。
少し冗長に書くと以下の様にも書くことが出来ます。
PHP
1$reserve_values = [$_SESSION['customer']['kaiin_id'],$_REQUEST['day'],$_REQUEST['time0']];
2$sql->execute($reserve_values);
3
引数を配列にまとめてPDOStatement::execute()
に渡している訳です。
(その後、インサート分のエラーが出ると思われるのでそちらはそちらで解決してみてください。.と,は違うものです)
原因
Fatal error: Uncaught ArgumentCountError: PDOStatement::execute() expects at most 1 argument, 3 given in
は許されている引数(1つ)より多くの引数(3つ)を与えているというPHPのエラーです。
$sql->execute($_SESSION['customer']['kaiin_id'],$_REQUEST['day'],$_REQUEST['time0']);
を見ると、$_SESSION['customer']['kaiin_id'],$_REQUEST['day'],$_REQUEST['time0']
と、三つの引数を与えています。
PDOStatement::execute()
は一つの配列を引数として受け取るメソッドなので、単に三つの引数を与えるとエラーが発生します。
調べ方
全部のメソッドの仕様を暗記する必要は無く、不明なメソッドや関数があったら
PHPマニュアル(公式リファレンス)で調べるのが最も確実です。
(分かりやすい風の残念なページも多いので、まずは公式リファレンスで調べるのがベストです)
PDOStatement::execute() site:www.php.net
で検索すると
PHPマニュアル(公式リファレンス)の該当ページにたどり着くので、パラメータの部分を確認してみてください。
パラメータ ¶
params
実行される SQL 文の中のバインドパラメータと同数の要素からなる、 値の配列。すべての値は PDO::PARAM_STR として扱われます。
ひとつのパラメータに対して複数の値をバインドすることはできません。 例えば、IN() 句の中のひとつのパラメータに対して 2 つの値をバインドすることはできません。
指定した数よりも多い値をバインドすることはできません。 params のキーが PDO::prepare() で指定した SQL にある数より多い場合は、 ステートメントが失敗してエラーが発生します。
と記述があります。
今回のエラーは
実行される SQL 文の中のバインドパラメータと同数の要素からなる、 値の配列。
のところを無視して引数を三つ与えていることが原因だと分かります。
また、サンプルコードもよく読んでみましょう。
今回のケースだと
例3 位置を指定した値を伴うプリペアドステートメントの実行
PHP
1<?php
2/* 入力値の配列を伴うプリペアドステートメントの実行 */
3$calories = 150;
4$colour = 'red';
5$sth = $dbh->prepare('SELECT name, colour, calories
6 FROM fruit
7 WHERE calories < ? AND colour = ?');
8$sth->execute(array($calories, $colour));
9?>
10
が参考になります。(ここでは配列の定義が古い記法で記述されていますが、array($calories, $colour)
と[$calories, $colour]
は同じ意味を持ちます)
お勧め
PHP VSCode 設定
あたりで検索して、
コーディング時に引数やその他の事についてのヒントを出してくれる開発環境を使うことを強くお勧めします。