前提・実現したいこと
入力内容チェック後、正常にデータベースに反映させたい。
ここに質問の内容を詳しく書いてください。
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答3件
あなたの回答
tips
プレビュー