yyy752
@yyy752 (ゆう)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Invalid parameter numberについて教えてください。

解決したいこと

気づけばプロ並みPHP改訂版という参考書を参考にして在庫管理アプリを作っています。
在庫の修正情報力入力(画像1)→内容チェック(画像2)→DB反映するところでエラーが発生(画像3)
エラーについて調べたところ引数が異なるとのことでしたが、確認した限りでは引数の間違えは見当たりませんでした。
他にどこか怪しい箇所があれば教えて頂きたいです。

発生している問題・エラー

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

スクリーンショット 2020-10-30 20.05.46.png

スクリーンショット 2020-10-30 20.06.10.png

スクリーンショット 2020-10-30 20.06.42.png

該当するソースコード

stock_edit_check.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

require_once('../common/common.php');

$post=sanitize($_POST);

if (!empty($_POST['stock_id']))
{
    $stock_id=$_POST['stock_id'];
}
$stock_purchase_date=$_POST['purchase_date'];
$stock_deadline=$_POST['deadline'];
$stock_name=$_POST['stock_name'];
$stock_price=$_POST['price'];
$stock_number=$_POST['number'];
$stock_gazou_name_old=$_POST['gazou_name_old'];
$stock_gazou=$_FILES['gazou'];

if($stock_gazou['size']>0)
{
    if($stock_gazou['size']>1000000)
    {
        print'画像が大き過ぎます。';
    }
    else
    {
        move_uploaded_file($stock_gazou['tmp_name'],'./gazou/'.$stock_gazou['name']);
        print'<img src="./gazou/'.$stock_gazou['name'].'">';
        print'<br />';
    }
}

if($stock_purchase_date=='')
{
    print '購入日が入力されていません。<br />';
}
else
{
    print '購入日 :';
    print $stock_purchase_date;
    print '<br />';
}

if($stock_deadline=='')
{
    print '消費期限が入力されていません。<br />';
}
else
{
    print '消費期限:';
    print $stock_deadline;
    print '<br />';
}

if($stock_name=='')
{
    print '商品名が入力されていません。<br />';
}
else
{
    print '商品名 :';
    print $stock_name;
    print '<br />';
}

if(preg_match('/\A[0-9]+\z/',$stock_price)==0)
{
    print '価格をきちんと入力してください。<br />';
}
else
{
    print '価格  :';
    print $stock_price;
    print '円<br />';
}

if($stock_number=='')
{
    print '数量が入力されていません。<br />';
}
else
{
    print '数量  :';
    print $stock_number;
    print '<br />';
}

if($stock_name=='' || preg_match('/\A[0-9]+\z/',$stock_price)==0 || $stock_gazou['size']>1000000)
{
    print '<form>';
    print '<input type="button" onclick="history.back()" value="戻る">';
    print '</form>';
}
else
{
    print '上記のように変更します。<br />';
    print '<form method="post" action="stock_edit_done.php">';
    if(isset($stock_id))
    {
        print '<input type="hidden" name="stock_id" value="'.$stock_id.'">';
    }
    print '<input type="hidden" name="purchase_date" value="'.$stock_purchase_date.'">';
    print '<input type="hidden" name="deadline" value="'.$stock_deadline.'">';
    print '<input type="hidden" name="stock_name" value="'.$stock_name.'">';
    print '<input type="hidden" name="price" value="'.$stock_price.'">';
    print '<input type="hidden" name="number" value="'.$stock_number.'">';
    print '<input type="hidden" name="gazou_name_old" value="'.$stock_gazou_name_old.'">';
    print '<input type="hidden" name="gazou_name" value="'.$stock_gazou['name'].'">';
    print '<br />';
    print '<input type="button" onclick="history.back()" value="戻る">';
    print '<input type="submit" value="OK">';
    print '</form>';
}

?>
</body>
</html>

stock_edit_done.php(チェック画面から受け取ってDBに反映)

<?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'];
}

if (!empty($_POST['stock_name'])) 
{
    $stock_name=$_POST['stock_name'];
}

if (!empty($_POST['price'])) 
{
    $stock_price=$_POST['price'];
}

if (!empty($_POST['number'])) 
{
    $stock_number=$_POST['number'];
}

if (!empty($_POST['gazou_name_old'])) 
{
    $stock_gazou_name_old=$_POST['gazou_name_old'];
}

if (!empty($_POST['gazou_name'])) 
{
    $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;
}

if(isset($stock_name)) 
{
    $data[]=$stock_name;
}

if(isset($stock_price)) 
{
    $data[]=(int)$stock_price;
}

if(isset($stock_number)) 
{
    $data[]=(int)$stock_number;
}

if(isset($stock_gazou_name)) 
{
    $data[]=$stock_gazou_name;
}

if(isset($stock_id)) 
{
    $data[]=(int)$stock_id;
}
$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>

自分で試したこと

各配列の引数間違えの確認。

0

1Answer

SQLの中の「?」をプレースホルダと言います。そこに当てはめられる変数をバインド変数と言い$stmt->execute($data)$dataの各要素がそれにあたります。
エラーメッセージの「number of bound variables does not match」というのはプレースホルダとバインド変数の数があっていないという意味で、if文で$dataに要素を追加したりしなかったりしているため数が合わなくなっているものと思われます。

0Like

Comments

  1. @yyy752

    Questioner

    返答ありがとうございます。
    全てif文で$dataに要素追加してみましたが、変わらずエラーが出てしまいました。
    質問に記載しているコードも修正しましたので、お手数ですがご確認お願い致します。

Your answer might help someone💌