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

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

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

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

PHP

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

Q&A

解決済

2回答

301閲覧

データベースに複数の値を保存したい

fur

総合スコア13

phpMyAdmin

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

PHP

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

0グッド

0クリップ

投稿2019/01/16 02:49

前提・実現したいこと

PHPの学習を始めたばかりの者で、MAMPを利用して制作しています。
PHPで新規登録のシステムの値を保存する機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /sign_up.php on line 17

該当のソースコード

<?php ini_set('display_errors',1); error_reporting(E_ALL); session_start(); $pdo = new PDO('mysql:host=localhost;dbname=t_user;charset=utf8','root','root'); $user = $_SESSION['user']; $pass = $_SESSION['pass']; $mail = $_SESSION['mail']; $options = ['cost' => 12]; $hash = password_hash( $pass, PASSWORD_DEFAULT, $options); $stmt = $pdo -> prepare("INSERT INTO user_table(user,pass,mail) VALUES(?,?,?)"); $stmt -> bindValue(':user', $user, PDO::PARAM_STR); $stmt -> bindValue(':hash', $hash, PDO::PARAM_STR); $stmt -> bindValue(':mail', $mail, PDO::PARAM_STR); $stmt -> execute();//17行目です $pdo = NULL; ?>

試したこと

password_hashを使ったのがいけなかったのかと思い、password_hash抜きで実行しましたが、上記と同じく$stmt -> execute();の行で同じエラーがでました。

補足情報(FW/ツールのバージョンなど)

MAMP Version 5.2 (351)

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

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

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

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

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

guest

回答2

0

ベストアンサー

まずはエラーメッセージの意味を理解しましょう。

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

訳:無効なパラメーター番号:パラメーターが定義されていません

名前つきパラメータと疑問符パラメータの使い方を間違っています。

SQL側で疑問符パラメータにした場合は一番左の?を1番目として指定します。
名前つきパラメータを使いたい場合は、SQL側で同名のパラメータを設置してやる必要があります。

疑問符:

php

1 $stmt = $pdo -> prepare("INSERT INTO user_table(user,pass,mail) VALUES(?,?,?)"); 2 $stmt -> bindValue(1, $user, PDO::PARAM_STR); 3 $stmt -> bindValue(2, $hash, PDO::PARAM_STR); 4 $stmt -> bindValue(3, $mail, PDO::PARAM_STR);

名前つき:

php

1 $stmt = $pdo -> prepare("INSERT INTO user_table(user,pass,mail) VALUES(:user,:hash,:mail)"); 2 $stmt -> bindValue(':user', $user, PDO::PARAM_STR); 3 $stmt -> bindValue(':hash', $hash, PDO::PARAM_STR); 4 $stmt -> bindValue(':mail', $mail, PDO::PARAM_STR);

投稿2019/01/16 02:59

編集2019/01/16 03:00
m.ts10806

総合スコア80850

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

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

fur

2019/01/16 04:06

回答ありがとうございます 解決することができました。
guest

0

名前付きプレースホルダで徹底するなら:

php

1 $stmt = $pdo->prepare("INSERT INTO user_table(user,pass,mail) VALUES(:user,:hash,:mail)"); 2 $stmt->bindValue(':user', $user, PDO::PARAM_STR); 3 $stmt->bindValue(':hash', $hash, PDO::PARAM_STR); 4 $stmt->bindValue(':mail', $mail, PDO::PARAM_STR);

もしくは

php

1 $stmt = $pdo->prepare("INSERT INTO user_table(user,pass,mail) VALUES(?,?,?)"); 2 $stmt->bindValue(1, $user, PDO::PARAM_STR); 3 $stmt->bindValue(2, $hash, PDO::PARAM_STR); 4 $stmt->bindValue(3, $mail, PDO::PARAM_STR);

疑問符使うときは、1,2,3などで指定します。

なお、アロー演算子->の前後に空白を入れない書き方の方が一般的。

投稿2019/01/16 02:55

編集2019/01/16 03:01
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fur

2019/01/16 04:08

回答ありがとうございます。 空白を入れた方が見やすいかと思ったのですが空白なしに合わせていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問