95267


PHPで、MYSQLへUPDATEするソースを書いていますが、エラーになります。  
エラー内容は下記です。

[code]

    Fatal error: Uncaught ArgumentCountError: PDOStatement::execute() expects at most 1 argument, 7 given in C:\xampp\htdocs\Portfolio\user_update_commit.php:30 Stack trace: #0 C:\xampp\htdocs\Portfolio\user_update_commit.php(30): PDOStatement->execute('\xE5\xB1\xB1\xE7\x94\xB0', '\xE5\x8F\x8B\xE9\x87\x8C', '\xE3\x83\xA4\xE3\x83\x9E\xE3\x83\x80', '\xE3\x83\xA6\xE3\x83\xAA', 'yuri', 'yuririn1969', '1') #1 {main} thrown in C:\xampp\htdocs\Portfolio\user_update_commit.php on line 30
    
[/code]

エラーを見ると、引数が不足しているようですが、下記のようにvar_dumpしたところ、想定通りの値が出力されます。

[code]

    var_dump($_REQUEST['sei']);
    var_dump($_REQUEST['mei']);
    var_dump($_REQUEST['sei_kana']);
    var_dump($_REQUEST['mei_kana']);
    var_dump($_REQUEST['user']);
    var_dump($_REQUEST['password']);
    var_dump($_REQUEST['seq']);
    
[/code]

何が原因か不明なため、ご教示いただけないでしょうか。

[code]

        <?php
    
        try{
            require_once('db_connect.php');
            $sql=$pdo->prepare('update user_table set last_name=?, first_name=?, last_name_kana=?, first_name_kana=?, user=?, password=? where id=? ');
                if(empty($_REQUEST['sei']) || empty($_REQUEST['mei']) || empty($_REQUEST['sei_kana']) || empty($_REQUEST['mei_kana']) || empty($_REQUEST['user']) || empty($_REQUEST['password']))
                    {
                        echo '未入力の項目があります。';
                    }
                    else if(!preg_match('/\A[ァ-ヴー]+\z/u', $_REQUEST['sei_kana']) || !preg_match('/\A[ァ-ヴー]+\z/u', $_REQUEST['mei_kana']))
                        {
                             echo 'カナ名は全角カナで入力してください。';
                        }
                        else if(!preg_match('/\A[a-zA-Z0-9!-\/:-@[-`{-~]+\z/u', $_REQUEST['user']))
                            {
                                echo 'ユーザーは半角英数字記号で入力します';
                            }
                            else if(!preg_match('/\A[a-zA-Z0-9!-\/:-@[-`{-~]{10,}\z/u', $_REQUEST['password']))
                                {
                                    echo 'パスワードは半角英数字記号10文字以上で入力します。';
                                }
                                else if(!preg_match('/\A[a-zA-Z0-9!-\/:-@[-`{-~]{10,}\z/u', $_REQUEST['password2']))
                                    {
                                        echo 'パスワードは半角英数字記号10文字以上で入力します。';
                                    }
                                    else if($_REQUEST['password'] !== $_REQUEST['password2'])
                                        {
                                            echo '2つのパスワードが一致してません。';
                                        }
                                        else if($sql->execute(
                                                htmlspecialchars($_REQUEST['sei'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
                                                htmlspecialchars($_REQUEST['mei'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
                                                htmlspecialchars($_REQUEST['sei_kana'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
                                                htmlspecialchars($_REQUEST['mei_kana'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
                                                htmlspecialchars($_REQUEST['user'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
                                                htmlspecialchars($_REQUEST['password'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
                                                htmlspecialchars($_REQUEST['seq'],ENT_QUOTES | ENT_HTML5,'UTF-8')))
                                            {
                                                echo '更新に成功しました。';
                                            }
                                                else {
                                                        echo '更新に失敗しました。';
                                                    }}
        catch(PDOException $e)
            {
                echo "次がエラーの内容です。;" .$e->getMessage();
            }
        ?>
    
[/code]


CC BY-SA 4.0
2023-06-16T11:54:22.023
95261
2023-06-16T20:15:00.357
2023-06-16T14:57:11.873
3060
58703
question
php
PHPで、MYSQLへのUPDATEでエラー


> 引数が不足しているようですが、

`PDOStatement::execute() expects at most 1 argument, 7 given` =
「1引数を期待しているのに7個も渡された」（意訳）とある通り、引数が不足しているのではなく過剰に渡しています。

実際に、PHPの関数マニュアルにある[PDOStatement::executeのページ](https://www.php.net/manual/ja/pdostatement.execute.php)を確認してみましょう。  
このメソッドが求めているのは、プリペアドステートメントに対して「バインドパラメータと同数の要素からなる値の配列」となっています。  
それに対して、実際のコードではパラメータの分だけそれぞれ別の引数として渡しています。

そのため、配列1個のみの要求に対してパラメータ数の7個分の引数を指定しまっているため、実際のエラー原因となっています。

## 対応例

このコードの状態を前提としてピンポイントな対処を考えると、単純に渡したい値をまるごと一つの配列としてあげればエラー自体は解消されると思います。

（元コードから整形して抜粋）

[code]

    $sql->execute(
      htmlspecialchars($_REQUEST['sei'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
      htmlspecialchars($_REQUEST['mei'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
      htmlspecialchars($_REQUEST['sei_kana'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
      htmlspecialchars($_REQUEST['mei_kana'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
      htmlspecialchars($_REQUEST['user'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
      htmlspecialchars($_REQUEST['password'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
      htmlspecialchars($_REQUEST['seq'],ENT_QUOTES | ENT_HTML5,'UTF-8')
    )
    
[/code]

↓  
「7個の引数」を配列としてひとまとめにして「1個の引数」に変える。  
↓

[code]

    $sql->execute(
      [
        htmlspecialchars($_REQUEST['sei'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
        htmlspecialchars($_REQUEST['mei'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
        htmlspecialchars($_REQUEST['sei_kana'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
        htmlspecialchars($_REQUEST['mei_kana'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
        htmlspecialchars($_REQUEST['user'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
        htmlspecialchars($_REQUEST['password'],ENT_QUOTES | ENT_HTML5,'UTF-8'),
        htmlspecialchars($_REQUEST['seq'],ENT_QUOTES | ENT_HTML5,'UTF-8')
      ]
    )
    
[/code]


CC BY-SA 4.0
2023-06-16T20:15:00.357
95267
2023-06-16T20:15:00.357
2784
95261
answer