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

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

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

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

Q&A

解決済

1回答

773閲覧

PHP/SQLSTATE[HY093]

NT111

総合スコア17

PHP

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

0グッド

0クリップ

投稿2020/01/25 16:59

編集2020/02/01 13:40

前提・実現したいこと

phpでブログを実装していました。
コメント作成機能を実装中に以下のエラーメッセージが発生しました。

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

問題 コメントは入力できるがコメント送信ができずエラーメッセージが出てしまう エラーメッセージ Error: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens ```ここに言語名を入力→HTML/CSS

該当のソースコード/ソースコード

<?php require_once('db_connect.php'); require_once('function.php'); check_user_logged_in(); if (!empty($_POST)) { $post_id = $_POST["post_id"]; if (empty($_POST["name"])) { echo 'ng'; } else if (empty($_POST["content"])) { echo 'ng'; } if (!empty($_POST["name"]) && !empty($_POST["content"])) { $name = $_POST["name"]; $content = $_POST["content"]; $pdo=db_connect(); try { $sql = "SELECT * FROM comments WHERE post_id = :post_id"; $stmt=$pdo->prepare($sql); $stmt->bindparam(':post_id',$post_id); $stmt->bindparam(':name',$name); $stmt->bindparam(':content',$content); $stmt->execute(); header("Location: detail_post.php?id=".$post_id); exit; } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); die(); } } } else { $post_id = $_GET['post_id']; redirect_main_unless_parameter($post_id); } ?> <!DOCTYPE html> <html> <head> <title> </title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h1></h1> <form method="POST" action=""> <input type="hidden" name="post_id" value="<?php echo $post_id; ?>"> :<br> <input type="text" name="name"> <br> :<br> <input type="text" name="content" style="width:200px;height:100px;"><br> <input type="submit" value="submit"> </form> <a href="detail_post.php?id=<?php echo $post_id; ?>"></a> </body> </html> ```

試したこと

-エラーコード検索しました。
https://www.google.com/search?client=safari&rls=en&q=Error:+SQLSTATE%5BHY093%5D:+Invalid+parameter+number:+number+of+bound+variables+does+not+match+number+of+tokens&ie=UTF-8&oe=UTF-8

-SQL文がそもそも間違っていることに気づき訂正しました
$sql = "SELECT * FROM comments WHERE post_id = :post_id";

$sql = "INSERT INTO comments (name,content)values(:name,:content)";
(結果は変わりませんでした)。

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

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

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

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

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

m.ts10806

2020/01/25 22:40

検索したら何かしら見つかるわけでそこから試してみようとするはずなんですが、どこまでやってみたのでしょうか。
NT111

2020/01/26 04:07

エラーコードをそのまま検索して色々サイトを見ましたが解決に糸口が見つかりませんでした。
m.ts10806

2020/01/26 05:17

一例で良いので質問本文にリンクとして追記してください。 その記事が解決に繋がるかどうかは見てみないと誰にも判断できません。 提示することによりどう見たら解決に繋がるかアドバイスも可能となります
NT111

2020/01/26 05:35

リンクを追加いたしました。 そうですよね、記事の見方も学んでいきたいと思います。
guest

回答1

0

ベストアンサー

エラーコード検索した結果はどうだったんでしょう?
というか、エラーメッセージは読みましたか?

number of bound variables does not match number of tokens
「バインド変数が一致しないエラー」です。

「:post_id」以外のプレースホルダがありませんよね?

そこを修正しようというところに思いが到らない理由は何なんでしょうか?

─── 追記

とても埒があきそうにないので……

PHP

1$sql = "SELECT * FROM comments WHERE post_id = :post_id"; 2$stmt=$pdo->prepare($sql); 3$stmt->bindparam(':post_id',$post_id); 4$stmt->bindparam(':name',$name); 5$stmt->bindparam(':content',$content); 6$stmt->execute();

の部分を

PHP

1$sql = "INSERT INTO comments (name,content)values(:name,:content)"; 2$stmt=$pdo->prepare($sql); 3$stmt->bindparam(':name',$name); 4$stmt->bindparam(':content',$content); 5$stmt->execute();

としたらどうでしょうか?

投稿2020/01/25 19:11

編集2020/01/26 14:08
takepan1973

総合スコア821

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

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

NT111

2020/01/26 04:25

回答ありがとうございます。 エラーメッセージを検索しましたが糸口が見つからずこちらに質問いたしました。 実際にコード追加しましたがエラーは同じものが出てきました。 自身、まだ至らない部分が多いので母数を踏みながら目のつけどころなど覚えて行こうと思います。 } else { $post_id = $_GET['post_id']; redirect_main_unless_parameter($post_id); $name = $_GET['name']; $content = $_GET['content'];
takepan1973

2020/01/26 05:47

「母数を踏みながら」って何語ですか? 場数かと思いましたが、それでも適当な表現とは思えません。 あと、質問は編集できるので、いちいち回答を増やさないようにお願いします。
takepan1973

2020/01/26 05:52 編集

プログラムでバインドしているパラメータ「:post_id」「:name」「:content」 SQL文にあるプレースホルダ「:post_id」  →不一致 修正されたSQL文にあるプレースホルダ「:name」「:content」  →不一致 どうして「一致させる」という方向に進まないのでしょうか? プログラムの意味を考えながらやらないと、無駄に時間を消費するだけだと思いますよ。
NT111

2020/01/26 13:33

すみません。正直に申し上げますと初心者なんです。 恐縮ですがもう少しだけ、柔らかい言い方をして頂けないでしょうか。 よろしくお願いいたします。
takepan1973

2020/01/26 13:50

えーと、初心者だから物の言い方を柔らかくしろ、と仰せですが、 これでも十分我慢している方なんですよ。 ごめんなさい、私にはプレースホルダが3つあってなぜバインドも3つ書くということが分からないのかが分かりません。 3つの容器A,B,Cがあって、Aにしか蓋をしなかったらBとCに虫が入った。 容器に入れるものが1つしかないなら、容器BとCはしまった方が良い、ですよね? それなのに、なぜか今度は容器BとCに蓋をして、容器Aは開けっ放し。 そりゃーAに虫入りますよね。 別段「正直に申し上げられなくても」初心者なのは分かります。 SQL文にある「:ほにゃらら」と「$stmt->bindparam(':ほにゃらら' ~ の対応関係が分かる、分からないは初心者だからどう、という話ではないと思うのですが……
NT111

2020/01/26 14:14

すみませんでした。もう少し勉強して見ます。
NT111

2020/02/01 13:34

お返事遅くなり申し訳ございません。 教えて頂いた方法で試してみて再度復習してみたところ、解決できました。 今回の件で一歩成長できたと思うので引き継ぎ頑張ります。 回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問