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

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

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

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

PHP

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

Q&A

解決済

1回答

1806閲覧

phpからsql の insertエラー

111ttt

総合スコア2

MySQL

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

PHP

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

0グッド

0クリップ

投稿2022/03/08 14:27

本での勉強が一周し、ほんの少しアレンジに挑戦している初心者です。
予約テーブルへの登録ができません。エラーの意味も引数がなんとかという意味もよく分かりません。
3時間くらい色々調べてもわからなく心が折れそうなので何が原因なのか教えていただきたいです。

$pdo = new PDO ~~ は消してあります。

コードif (isset($_POST)){ //$id = $_SESSION['customer']['kaiin_id']; //顧客マスタに登録済の会員ID //$date = $_REQUEST['day']; //予約した時間 //$time = $_REQUEST['time0']; //半角スペース(&nbsp;)が入った日時文字列 "2022-03-25&nbsp;17:00" // echo $date; echo '<br>'; // echo $time; echo '<br>'; $sql = $pdo->prepare('INSERT INTO reserve values(null.?.?.?)'); $sql->execute($_SESSION['customer']['kaiin_id'],$_REQUEST['day'],$_REQUEST['time0']); //$sql->execute($id,$date,$time); ただ短くしてみた }

エラー文
Fatal error: Uncaught ArgumentCountError: PDOStatement::execute() expects at most 1 argument, 3 given in

executeの行に問題がある様なのですがわかりません。

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

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

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

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

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

maisumakun

2022/03/08 14:49

> executeの行に問題がある様なのですがわかりません。 英語を和訳してみましょう。
111ttt

2022/03/08 15:18

すみません、いつもまず和訳するようにしているんですが execute()は最大で1つの引数を期待し、3つは…… 意味がわかりません。 js php のエラーは分かるようになってきたんですが、sqlのエラーはまだ理解できません
ebal4

2022/03/08 16:05

SQLのエラーではなくPHPのエラーですね
111ttt

2022/03/10 04:07

そうなんですね、それも分からないとは…重症です
guest

回答1

0

ベストアンサー

$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 設定あたりで検索して、
コーディング時に引数やその他の事についてのヒントを出してくれる開発環境を使うことを強くお勧めします。

投稿2022/03/08 17:14

編集2022/03/08 17:18
tanat

総合スコア18778

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

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

111ttt

2022/03/10 04:05

すごくわかりやすく調べ方まで教えていただきありがとうございます。 VScodeの開発環境も変更してみます! 本当にありがとうございました。 素人の為また質問させていただきますが、よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問