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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

3281閲覧

タイトルとコンテンツを追加すると、SQLSTATE[HY093]のエラーになってしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2020/07/26 11:39

編集2020/07/26 12:16

前提・実現したいこと

create_artical.phpにて、タイトルとコンテンツの追加をできるようにしたいです。
以下のコードで実装してresult.phpにリダイレクト後、以下のようなエラーメッセージが表示されます。

考えられる原因としては、
・result.phpのSQL構文が間違っている
・メソッドのバインド数が異なる
のいずれかだとは思うのですが、問題解決には至っておりません。

お手数ですが下記のご確認をお願いします。

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

ErrorSQLSTATE[HY093]: Invalid parameter number: parameter was not defined

該当のソースコード

db_connect.php

<?php // DB名を追加 define('DB_DATABASE', 'skill_check3'); // MySQLのユーザー名を追加 define('DB_USERNAME', 'root'); // MySQLのパスワードを追加 define('DB_PASSWORD', 'root'); // DSNを追加 define('PDO_DSN', 'mysql:host=localhost;charset=utf8;dbname='.DB_DATABASE); function db_connect() { try { // PDOインスタンスを作成 $pdo = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); // エラーの処理方法を設定 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $pdo; } catch(PDOException $e) { echo 'Error: ' . $e->getMessage(); die(); } }

function.php

<?php function check_user_article($param){ session_start(); if(empty($param)){ header("Location: create_article.php"); exit; } } function find_post_by_title($title) { $pdo = db_connect(); try { $sql = "SELECT * FROM article WHERE title = :title order by id DESC"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':title', $title); $stmt->execute(); } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); die(); } if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { return $row; } } ?>

creat.article.php

<?php // db_connect.phpの読み込み処理 require_once('db_connect.php'); // function.phpの読み込み処理 require_once('function.php'); // セッション開始 session_start(); // 記事を追加した場合、下記の処理を実行する if(!empty($_POST)){ // titleとcontentの入力チェック // タイトルとコンテンツが入力されていない場合 if(empty($_POST["title"]) || empty($_POST["content"])){ if(empty($_POST["title"]) && empty($_POST["content"])){ echo "タイトルとコンテンツが未入力です。"; }elseif(empty($_POST["title"])){ echo "タイトルが未入力です。"; }elseif(empty($_POST["content"])){ echo "コンテンツが未入力です。"; } } // HTMLに入力された値に不適切な内容を無視する処理 if(!empty($_POST["title"]) && !empty($_POST["content"])){ // タイトル名のエスケープ処理 $title = htmlspecialchars($_POST["title"], ENT_QUOTES); // 記事内容のエスケープ処理 $content = htmlspecialchars($_POST["content"], ENT_QUOTES); // PDOのインスタンス取得 $pdo_article=db_connect(); try{ // articleテーブルにデータを追加する処理 // SQL文の準備 $sql_article="INSERT INTO article(title, content) VALUES (:title, :content)"; // プリペアドステートメントの準備 $stmt_article=$pdo_article->prepare($sql_article); // タイトルをバインド(固定する) $stmt_article->bindParam(':title', $title); // 内容をバインド(固定する) $stmt_article->bindParam(':content', $content); // 実行 $stmt_article->execute(); // $titleのresult.phpにリダイレクト header("Location: result.php?title=".$title); exit; }catch(PDOException $e){ // エラーメッセージの出力 echo 'Error' .$e->getMessage(); // 終了 die(); } } } ?> <!-- HTML領域 --> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title></title> <link rel="stylesheet" href=""> </head> <body> <form action="" method="POST" accept-charset="utf-8"> <h1>記事追加</h1><br /> <br /> タイトル:<br /> <input type="text" name="title" style ="width: 200px;height: 50px;" ><br /> コンテンツ:<br /> <input type="text" name="content" style="width: 200px;height: 100px;"><br /> <input type="submit" value="追加" style="font-size: 1.0em; margin-top: 10px;"><br /> </form> </body> </html>

result.php

<?php // db_connect.phpの読み込み処理 require_once('db_connect.php'); // function.phpの読み込み処理 require_once('function.php'); // create_article.phpから渡されるtitleをキャッチ $title=$_GET["title"]; check_user_article($title); // $titleに値があるかを確認 $row=find_post_by_title($title); // articleテーブルからtitleとcontentの値を受け取る処理 $row_title = $row['title']; $row_content = $row['content']; // PDOのインスタンス取得 $pdo=db_connect(); try{ // articleテーブルから表示したいレコードを受け取る処理 // SQL文の準備 $sql_result = "SELECT * FROM article WHERE title = :title, content = :content"; // プリペアドステートメントの作成 $stmt_result = $pdo->prepare('$sql_result'); // titleのバインド $stmt_result->bindParam(':title', $row_title); // contentのバインド $stmt_result->bindParam(':content', $row_content); // 実行 $stmt_result->execute(); }catch(PDOException $e){ // エラーメッセージの出力 echo 'Error' .$e->getMessage(); // 終了 die(); } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title></title> <link rel="stylesheet" href=""> </head> <body> <div> <p>あなたが追加した記事</p> <br /> <p>title : <?php echo $row_title; ?></p> <p>content : <?php echo $row_content; ?></p> <a href="create_article.php" style="float: right;">記事を追加する</a> <br /> </div> <div> <!-- 全てのレコードを表示させる処理 --> <?php while ($row = $stmt_result->fetch(PDO::FETCH_ASSOC)) { echo '<hr>'; echo $row['id']; echo '<br />'; echo $row['title']; echo '<br />'; echo $row['content']; } ?> </div> </body> </html>

試したこと

・Sublime textの上書き保存後、ブラウザを更新する。
・result.phpの37行目のSQL文を「"SELECT * FROM article WHERE title = :title AND content = :content"」に変更
・bindParamをbindValueに変更

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

・Sublime Text 3 (Build 3211)
・MAMP PRO version:7.4.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

creat.article.php

// 内容をバインド(固定する) $stmt_article->bindParam(':contet', $content);

スペルミスしています。

投稿2020/07/26 12:01

kazto

総合スコア7196

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

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

退会済みユーザー

退会済みユーザー

2020/07/26 12:07

kazto様  ご回答ありがとうございます。 こちら確認して訂正しましたが、SQLSTATE[42000]のエラーメッセージになってしまいました。 問題解決には至りませんでしたが、ご指摘いただきましてあろがとうございます。
kazto

2020/07/26 12:12

別の場所で別のエラーが発生したと考えられます。エラーの内容を追記お願いします。
退会済みユーザー

退会済みユーザー

2020/07/26 12:17

kazto様 以下、エラーメッセージの内容になります。 宜しければご確認をお願いします。 ErrorSQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$sql_result' at line 1
kazto

2020/07/26 12:28

> // プリペアドステートメントの作成 > $stmt_result = $pdo->prepare('$sql_result'); 文字列にシングルクォートを使っており、不正なSQLとなっています。という旨がエラー文には記載されています。英語を単純に翻訳にかけるなどでもある程度意味はとれるかと思います。
退会済みユーザー

退会済みユーザー

2020/07/26 12:42

kazto様 こちら確認して修正したところ、エラーが発生することなく表示されるようになりました。ありがとうございます。 大変恐縮なのですが、もう一点お伺いしたいことがあります。 result.phpにて、今まで追加した全てのレコードを表示させる処理を以下のように書きました。 <!-- 全てのレコードを表示させる処理 --> <?php while ($row = $stmt_result->fetch(PDO::FETCH_ASSOC)) { echo '<hr>'; echo $row['id']; echo '<br />'; echo $row['title']; echo '<br />'; echo $row['content']; } ?> しかし、このコードの書き方だと追加されたタイトルとコンテンツのみが表示される処理になっています。全てのレコードを表示させる処理を実装するには、どこをどのように訂正すべきでしょうか? 差し支えなければご教授お願いします。
javahack

2020/07/26 12:55

元の質問は解決してるので、kaztoさんの回答をベストアンサーとして質問をクローズして別の質問を立てられた方が良いかと。
退会済みユーザー

退会済みユーザー

2020/07/26 12:58

javahack様 その通りにいたします。ありがとうございます。
javahack

2020/07/26 13:03 編集

ちょっと余計な一言ですが、新しい質問にこの質問のURLをリンクしておくと経緯が分かりやすくなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問