前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/07/26 12:07
2020/07/26 12:12
退会済みユーザー
2020/07/26 12:17
2020/07/26 12:28
退会済みユーザー
2020/07/26 12:42
2020/07/26 12:55
退会済みユーザー
2020/07/26 12:58
2020/07/26 13:03 編集
退会済みユーザー
2020/07/26 13:25