dポイントプレゼントキャンペーン実施中!

phpを使い、開発を行っています。
ある画面から値を選択し、POSTを使用して、別の画面に遷移させ、プリペアドステートメントにてDB(MySQL)からデータを取得するコードを記載していたのですが、下記エラーが出力されてしまいます。

「PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in 」

下記にソースを記載しておりますが、bindValueの定義等、誤ってないと思うのですが。。。

どなたか、解決策をご教示頂けないでしょうか。


送信側のソース
<?php
function showOption($start, $end, $step = 1) {
for ($i = $start; $i <= $end; $i += $step) {
print('<option value="'.$i.'">'.$i.'</option>');
}
}
<form method="POST" action="AAA.php">
<div id="container">
<select id="rdate_year" name="rdate_year">
<?php showOption(2013, 2020); ?>
</select>
<label for="rdate_year">年</label>
<select id="rdate_month" name="rdate_month">
<?php showOption(1, 12); ?>
</select>
<label for="rdate_month">月</label>
<select id="rdate_day" name="rdate_day">
<?php showOption(1, 31); ?>
</select>
<label for="rdate_day">日</label>
</div>
<input type="submit" value="検索" />
</p>
</form>

AAA.php
<?php
$db = new PDO('mysql:host=localhost; dbname=php10; charset=utf8', 'ユーザー', 'パスワード');
$sqla = "SELECT * FROM AAAAAA WHERE rdateyear = :rdata_year AND rdatemonth = :rdate_month AND rdateday = :rdate_day";
$stt = $db->prepare($sqla);
$stt->bindValue(':rdate_year', $_POST['rdate_year']);
$stt->bindValue(':rdate_month', $_POST['rdate_month']);
$stt->bindValue(':rdate_day', $_POST['rdate_day']);
$stt->execute();
while ($row = $stt->fetch()) {
print($row['rdate_year']);
}?>

よろしくお願いしますm(_ _)m

A 回答 (4件)

>誤ってないと思うのですが。

。。

そう思って見直すと見落とします(汗

>$sqla = "SELECT * FROM AAAAAA WHERE rdateyear = :rdata_year
>AND rdatemonth = :rdate_month AND rdateday = :rdate_day";

rdateyearのプレースホルダが、::rdata_yearになっています(bindValueでは':rdate_year')。
    • good
    • 0
この回答へのお礼

shimixさん

ご回答ありがとうございます。
誤りを修正し、無事にphpが実行できました。
(rdataに気づかず、恥ずかしい限りです)

ありがとうございましたm(_ _)m

お礼日時:2013/05/01 19:52

shimixさんの回答で事足りてると思いますが、スルーされた部分を補足的に回答(汗



ArwinさんはbindValueのマニュアルをまず…
http://php.net/manual/ja/pdostatement.bindvalue. …

bindValue・bindParamともにコロンは必要で、エスケープは自動的にこのメソッドによって行われるため不要。
    • good
    • 0

一点だけ・・・



ANo.2で

>コロンは、SQL文側での変数宣言する意味合いでしょうから、
>bindvalueの引数にはいらないと思いますよ。

という回答がありますが【必要です】。コロンもプレースホルダ名の一部ですので。


#それ以外の部分は華麗にスルーで(ぉぃ
    • good
    • 0
この回答へのお礼

shimixさん

ANo.1に続き、ありがとうございました。

お礼日時:2013/05/01 19:58

phpはよく知りませんが、まあ、エラーメッセージに書いてありますよね。


そんなパラメータ名知らねえぞって。

bindvalue(':param_name', values);

コロンは、SQL文側での変数宣言する意味合いでしょうから、bindvalueの引数にはいらないと思いますよ。


あと、ちなみにですが、Formからポストされた値そのままぶち込むのはどうかと思いますし、dbとのコネクションもロジックの中に直書きして大丈夫ですか?
自分の趣味で作ってるものであればいいですが、私がマネージャーだと怒りますよ。
派遣だったりクビにします。
    • good
    • 0
この回答へのお礼

Arwinさん

ご回答ありがとうございます。
また、ご指摘ありがとうございます。
最近、プログラミングを始めたばかりでして、恥ずかしい限りでございます。
ありがとうございました。

お礼日時:2013/05/01 19:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!