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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

1028閲覧

SQLSTATE[HY093]について

yuuu752

総合スコア18

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/10/29 13:38

前提・実現したいこと

入力内容チェック後、正常にデータベースに反映させたい。

ここに質問の内容を詳しく書いてください。
PHPで在庫管理アプリを作っています。
在庫情報の修正画面入力後、入力内容をチェックし、データベースに反映するところでエラーが発生しました。
エラーについて調べたところ引数が異なるとのことでしたが、確認した限りでは引数の間違えは見当たりませんでした。
他にどこか怪しい箇所があれば教えて頂きたいです。

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

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

該当のソースコード

「stock_edit_check.php 入力内容チェック」

PHP

1<?php 2session_start(); 3session_regenerate_id(true); 4if(isset($_SESSION['login'])==false) 5{ 6 print'ログインされません。<br />'; 7 print'<a href="../user_login/login_form.html">ログイン画面へ</a>'; 8 exit(); 9} 10else 11{ 12 print $_SESSION['user_name']; 13 print'さんログイン中<br />'; 14 print'<br />'; 15} 16?> 17 18<!DOCTYPE html> 19<html> 20<head> 21<meta charset="UTF-8"> 22<title>在庫修正</title> 23</head> 24<body> 25 26<?php 27 28require_once('../common/common.php'); 29 30$post=sanitize($_POST); 31 32if (!empty($_POST['stock_id'])) 33{ 34 $stock_id=$_POST['stock_id']; 35} 36$stock_purchase_date=$_POST['purchase_date']; 37$stock_deadline=$_POST['deadline']; 38$stock_name=$_POST['stock_name']; 39$stock_price=$_POST['price']; 40$stock_number=$_POST['number']; 41$stock_gazou_name_old=$_POST['gazou_name_old']; 42$stock_gazou=$_FILES['gazou']; 43 44if($stock_gazou['size']>0) 45{ 46 if($stock_gazou['size']>1000000) 47 { 48 print'画像が大き過ぎます。'; 49 } 50 else 51 { 52 move_uploaded_file($stock_gazou['tmp_name'],'./gazou/'.$stock_gazou['name']); 53 print'<img src="./gazou/'.$stock_gazou['name'].'">'; 54 print'<br />'; 55 } 56} 57 58if($stock_purchase_date=='') 59{ 60 print '購入日が入力されていません。<br />'; 61} 62else 63{ 64 print '購入日 :'; 65 print $stock_purchase_date; 66 print '<br />'; 67} 68 69if($stock_deadline=='') 70{ 71 print '消費期限が入力されていません。<br />'; 72} 73else 74{ 75 print '消費期限:'; 76 print $stock_deadline; 77 print '<br />'; 78} 79 80if($stock_name=='') 81{ 82 print '商品名が入力されていません。<br />'; 83} 84else 85{ 86 print '商品名 :'; 87 print $stock_name; 88 print '<br />'; 89} 90 91if(preg_match('/\A[0-9]+\z/',$stock_price)==0) 92{ 93 print '価格をきちんと入力してください。<br />'; 94} 95else 96{ 97 print '価格  :'; 98 print $stock_price; 99 print '円<br />'; 100} 101 102if($stock_number=='') 103{ 104 print '数量が入力されていません。<br />'; 105} 106else 107{ 108 print '数量  :'; 109 print $stock_number; 110 print '<br />'; 111} 112 113if($stock_name=='' || preg_match('/\A[0-9]+\z/',$stock_price)==0 || $stock_gazou['size']>1000000) 114{ 115 print '<form>'; 116 print '<input type="button" onclick="history.back()" value="戻る">'; 117 print '</form>'; 118} 119else 120{ 121 print '上記のように変更します。<br />'; 122 print '<form method="post" action="stock_edit_done.php">'; 123 if(isset($stock_id)) 124 { 125 print '<input type="hidden" name="stock_id" value="'.$stock_id.'">'; 126 } 127 print '<input type="hidden" name="purchase_date" value="'.$stock_purchase_date.'">'; 128 print '<input type="hidden" name="deadline" value="'.$stock_deadline.'">'; 129 print '<input type="hidden" name="stock_name" value="'.$stock_name.'">'; 130 print '<input type="hidden" name="price" value="'.$stock_price.'">'; 131 print '<input type="hidden" name="number" value="'.$stock_number.'">'; 132 print '<input type="hidden" name="gazou_name_old" value="'.$stock_gazou_name_old.'">'; 133 print '<input type="hidden" name="gazou_name" value="'.$stock_gazou['name'].'">'; 134 print '<br />'; 135 print '<input type="button" onclick="history.back()" value="戻る">'; 136 print '<input type="submit" value="OK">'; 137 print '</form>'; 138} 139 140?> 141</body> 142</html>

「stock_edit_done.php データベースに反映」

<?php session_start(); session_regenerate_id(true); if(isset($_SESSION['login'])==false) { print'ログインされません。<br />'; print'<a href="../user_login/login_form.html">ログイン画面へ</a>'; exit(); } else { print $_SESSION['user_name']; print'さんログイン中<br />'; print'<br />'; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>在庫修正</title> </head> <body> <?php try { require_once('../common/common.php'); $post=sanitize($_POST); if (!empty($_POST['stock_id'])) { $stock_id=$_POST['stock_id']; } if (!empty($_POST['purchase_date'])) { $stock_purchase_date=$_POST['purchase_date']; } if (!empty($_POST['deadline'])) { $stock_deadline=$_POST['deadline']; } $stock_name=$_POST['stock_name']; $stock_price=$_POST['price']; if (!empty($_POST['number'])) { $stock_number=$_POST['number']; } $stock_gazou_name_old=$_POST['gazou_name_old']; $stock_gazou_name=$_POST['gazou_name']; $dsn='mysql:dbname=user;host=localhost;charset=utf8'; $user='yusei'; $password='rogin1111'; $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql='UPDATE stocks SET purchase_date=?,deadline=?,stock_name=?,price=?,number=?,gazou=? WHERE stock_id=?'; $stmt=$dbh->prepare($sql); if(isset($stock_purchase_date)) { $data[]=$stock_purchase_date; } if(isset($stock_deadline)) { $data[]=$stock_deadline; } $data[]=$stock_name; $data[]=$stock_price; if(isset($stock_number)) { $data[]=$stock_number; } if(isset($stock_id)) { $data[]=$stock_id; } $data[]=$stock_gazou_name; $stmt->execute($data); $dbh=null; if($stock_gazou_name_old!=$stock_gazou_name) { if($stock_gazou_name_old!='') { unlink('./gazou/'.$stock_gazou_name_old); } } print '修正しました。<br />'; } catch(Exception$e) { echo "エラー発生:" . htmlspecialchars($e->getMessage(),ENT_QUOTES, 'UTF-8') . "<br>"; print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?> <form action="list.php"> <input type="submit" value="戻る"> </form> </body> </html>

試したこと

stock_edit_check.phpとstock_edit_done.phpで引数に間違いがないかの確認。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

kyoya0819

2020/10/29 14:33

PHPのバージョンはいくつですか?
yuuu752

2020/10/29 22:54

ターミナルで確認したところ、7.3.11でした。
guest

回答3

0

ベストアンサー

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

とあるので、

php

1$stmt->execute($data);

の直前で$dataが意図した配列になっているか確認してください。

コードをざっとしか見てませんが、プリペアードステートメント用の SQL が固定で、投入パラメータを
isset($parameter) の後、$data[] = $parameterとしているので、isset で false 判定されると、エラーが発生します。

投稿2020/10/29 21:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuuu752

2020/10/30 02:27

回答ありがとうございます。 edit_check.phpからedit_done.phpまで配列の確認をしてみましたが、おそらく問題ないと思われます。
退会済みユーザー

退会済みユーザー

2020/11/16 23:53

配列に問題はなかったとコメントがありますが、なぜ、ベストアンサーに選ばれたのでしょうか? 問題が別の箇所に発生していたのであれば、自己回答として記述いただけると嬉しいです。
guest

0

ごめんなさい、エラーの意味を取り違えていました。

?の数と変数の数が異なっている場合に出るエラーのようです。
SQLSTATE:HY093

te2jiさんのご回答にあるように、$data配列の、SQL実行直前の内容を確認してください。
このコードですと、一か所でも、isset()がfalseになると、数が合わなくなります。

間違っていた回答は、以下の通り。

stocksテーブルの構造が不明なので推測になりますが。

stocksテーブルのnumberカラムは、数値型ではないでしょうか?
数値型に文字列を代入しようとすると、このエラーが発生すると思われます。

$data[]=$stock_number;

この時点では、要求される型が不明な為、文字列のまま、格納されると思われますので、適切な型にしてから、設定してみてください。

投稿2020/10/29 15:31

編集2020/10/30 02:37
YT0014

総合スコア1750

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

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

yuuu752

2020/11/15 02:40 編集

回答ありがとうございます。 おっしゃる通りnumberとpriceカラムは数値型となっています。 アドバイス頂いた通り、(int)を追加してみましたがエラーは出てしまいました。 改善内容は下記の通りです。 [edit_done.phpでPOSTから変数に代入時] if (!empty($_POST['number'])) { $stock_number=(int)$_POST['number']; } [data[]に代入時] if(isset($stock_number)) { $data[]=(int)$stock_number; } 新規で商品を追加する際は、(int)を入れなくても問題なくデータベースに反映されているのですが、何故か追加した商品の修正になると反映されなくなっている状況です。
guest

0

申し訳ございません。
再度確認したところ解決できてなく、ただ今ようやく解決しました。

原因は、issetで確認している$errの一つが$_POSTになっていたからでした。

投稿2021/02/20 11:07

yuuu752

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問