###前提
簡易掲示板の課題に取り組んでいます。
テキスト保存のものを作成した後、MySQL保存のものを作成しています。
PHP5.2.4(指定による)
外部のMySQLで設定によりコマンドによる操作はできません。
##本題
前回のアドバイスに従い、投稿機能だけ取り出し作成してみたところです。
https://teratail.com/questions/227810
POSTされた値の格納された変数をバインドした形で書き直し、ヒアドキュメント構文に直しました。
何故か、SQL文がおかしくて投稿できません。
教えていただいた構文チェツクサイトでみたところ、
insertのSQL文の:name, :comment, now(), :passwordの行がエラーになりました。
何が行けないのでしょうか?
以下はエラー文です。
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':name, :comment, now(), :password
)'at line 4
試したことを追記です。
他のファイルで投稿機能、削除機能、編集機能まで書いたものがあります。
そこでは同じコードがうまく動作しました。
それをコピペしましたが、投稿機能だけ取り出した方ではうまくいきませんでした。
そしてそれを構文チェックのサイトにコピペすると同じエラーが出てきます。
サーバー情報は伏せてあります。
###その後試したこと
進展がありましたので追記します。
どうやらSQL文のせいではなかったようです。
$name,$comment,$passwordをvar_dumpしたところ、$nameだけが空になっていました。
フォームに問題がありそうですが、まだ見つかりません。
変数の定義、投稿のコード、投稿フォームの$nameの関係するところをもう少し丁寧に見てみます。
道理でブラウザにはエラーが表示されなかったわけですね。
構文チェックサイトでエラーになったので勘違いしドツボにはまってしまいました。
大変お騒がせしました。
もっと慎重に順序立てて考えていかないといけないですね。
反省します。
PHP
1<?php 2ini_set( "display_errors", 1 ); 3error_reporting( E_ALL ); 4//MySQL接続情報 5$servername = ""; 6$username = ""; 7$serverpassword = ""; 8$dbname = ""; 9//データベースに接続 10try { 11 $db = new PDO( 12 "mysql:dbname=$dbname;host=$servername;charset=utf8mb4", $username, $serverpassword, [ 13 PDO::ATTR_ERRMODE =>PDO::ERRMODE_EXCEPTION, 14 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 15 ] ); 16} catch ( PDOException $e ) { 17 print( "接続エラー:". $e->getMessage() ); 18 die(); 19} 20//投稿フォームの変数定義 21$name = (string)filter_input( INPUT_POST, "name" );//post送信された投稿者の名前 22$comment = (string)filter_input( INPUT_POST, "comment");//post送信された投稿コメント 23$password = (int)filter_input( INPUT_POST, "password" );//post送信された投稿パスワード 24//投稿機能 25try{ 26 if ( !empty( $name ) && !empty( $comment ) && !empty( $password ) ){ 27 $sql = <<<EOT 28 INSERT INTO toko( 29 name, comment, date, password 30 ) VALUES ( 31 :name, :comment, now(), :password 32 ) 33EOT; 34 $stmt = $db -> prepare( $sql ); 35 $stmt -> bindvalue( ':name', $name, PDO::PARAM_STR ); 36 $stmt -> bindvalue( ':comment', $comment, PDO::PARAM_STR ); 37 $stmt -> bindvalue( ':password', $password, PDO::PARAM_INT ); 38 $stmt -> execute(); 39 } 40} catch ( PDOException $e ) { 41 print( "投稿エラー:". $e->getMessage() ); 42 die(); 43} 44 45?> 46<!doctype html> 47 48<html lang="ja"> 49<head> 50<meta charset="utf-8"> 51<title>投稿フォームMySQL版</title> 52<style> 53 .akaji{ 54 color : red ; 55 } 56 .komoji{ 57 font-size : 0.8em; 58 } 59</style> 60</head> 61 62<body> 63 <!--投稿フォーム--> 64 <form method="post"> 65 <label for="name">お名前<span class="akaji">【必須】</span></label><br> 66 <input type="text" name="name" id="name" required><br> 67 <label for="comment">コメント<span class="akaji">【必須】</span></label><br> 68 <textarea name="comment" cols="30" rows="3" id="comment" required></textarea><br> 69 <label for="password">パスワード<span class="akaji">【必須】</span></label><br> 70 <input type="password" name="password" id="password" required><br> 71 <input type="submit" value="送信"> 72 </form> 73 <br> 74 <!--投稿一覧表示--> 75<?php 76//投稿内容の表示 77 //XSS対策 78 function h( $str ) { 79 return nl2br( htmlspecialchars( $str,ENT_QUOTES, 'UTF-8' ) ); 80 } 81 try{ 82 //行数の取得 83 $sql = 'SELECT COUNT(*) FROM toko'; 84 $count = $db -> query( $sql ); 85 $count = $count -> fetchColumn(); 86 var_dump( $count ); 87 if ( $count == 0 ) {//行数が0だったら 88 echo "<p>投稿はまだありません</p>";//投稿はまだありませんと表示する 89 } else {//それ以外の場合は 90 $sql = 'SELECT * FROM toko';//テーブルデータの取得のクエリ 91 $select = $db -> query( $sql );//クエリ実行 92 foreach ( $select as $row ) {//ループ 93 echo "<span class='komoji'>No</span>:" . h( $row[ 'num' ] ) . "  ";//番号の表示 94 echo "<span class='komoji'>名前</span>:" . h( $row[ 'name' ] ) . "<br>";//名前の表示 95 echo h( $row[ 'comment' ] ) . "<br>" ;//コメントの表示 96 echo "<span class='komoji'>" . h( $row[ 'date' ] ) . "</span><br>";//日時の表示 97 } 98 } 99 } catch ( PDOException $e ) { 100 print( "表示エラー:" . $e->getMessage() ); 101 die(); 102 } 103?> 104</body> 105</html>
回答2件
あなたの回答
tips
プレビュー