簡単な投稿サイトを作る際の注意点

このQ&Aのポイント
  • 投稿サイトの作成にあたっては、Ajaxを使ったJavaScriptを使用して、inputに入力された情報をPHPの変数に入れることがおすすめです。
  • また、データベースにデータを入力する際は、適切なエスケープ処理を行うことを忘れずに。
  • さらに、Laravelを使用することで、より効率的に投稿サイトを開発することができます。
回答を見る
  • ベストアンサー

簡単な投稿サイトを作りたい

簡単な投稿サイトを作りたいのですが、下記のようにDBデータを表記することとDBにデータを入れることは何とか出来たのですが、実際に投稿サイトを作る場合、 inputに入力してもらった情報をDBのカラムに入れて、それを表記したい要素に渡してブラウザ上に表記し、削除ボタンを押したらカラムのデータを空にして表記していた要素を削除しないといけないですよね? これらの作業はすべてphpで行うよりサーバの負担を避けるためにinputに入力された文字列をphpの変数に入れるまではajaxを使ったjsで行うべきでしょうか? その場合どうやってphpのこの変数に入れるとするのでしょうか? そして$stmt->execute(array(値を受け取ったphpの変数名)); とすれば問題なくカラムにデータが入るでしょうか? 正直難しくてあまり検討が付きません。 ここまで来るとlaravelを使った方がよいのでしょうか? 生では厳しいですか? $db_host = "localhost"; // データベースのホスト $db_name = "toukoutest"; // データベースの名前 $db_user = "root"; // データベース接続ユーザー $db_pass = ""; // データベース接続パスワード // データベース接続を確立 try { $db = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_user, $db_pass); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーモードの設定 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // prepareのエミュレーションを停止 } catch (PDOException $e) { // エラー発生時 exit("データベースの接続に失敗しました"); } // データの問い合わせ $rows_post = array(); // 配列の初期化 try { // toukoutableの部分がテーブル名。itemの部分がカラム(フィールド)名 $stmt = $db->prepare("SELECT * FROM toukoutable ORDER BY item DESC"); $stmt->execute(); // クエリの実行 $rows_post = $stmt->fetchAll(); // SELECT結果を二次元配列に格納 } catch (PDOException $e) { // エラー発生時 exit("クエリの実行に失敗しました"); } if (count($rows_post) > 0) { echo '<ul>'; foreach ($rows_post as $row) { printf('<li>%s</li>', $row['item']); } echo '</ul>'; } else { // 取得行数が 0 だったときの処理 } // データをデータベースに入力 $stmt = $db->prepare('insert into `add` (addcol2) values (?)'); $stmt->execute(array('値222'));

  • MySQL
  • 回答数14
  • ありがとう数9

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

> iinputに入力された情報をDBに登録するためにはhtmlのpostで可能なので、phpもajaxも必要ないのですね。 横から失礼しますが、 Webアプリの根本的な動作を理解されていないようです。 【投稿時】 (1)ブラウザから サーバーへFormデータを送る ↓ (2)サーバーでは、サーバーサイドのスクリプトで  受け取ったFormデータをDBに格納して、完了なりエラーなりのHTMLを生成する。 ↓ (3) (1)のブラウザに(2)のHTMLが送信されてブラウザ上に表示される 【閲覧時】 (1) 閲覧したい情報をブラウザ上で選択(リンクなりFormなり)してサーバーに送る ↓ (2) サーバーは、サーバーサイドのスクリプトで リクエストに合わせたHTMLを作る ↓ (3) (1)のブラウザに(2)のHTMLが送信されてブラウザ上に表示される です。 つまり用意するのは、 (1)のHTMLと、(2)のPHPです。 (1)でFormでなくAjaxを使ったとしても、(2)のPHPはいらなくなる訳ではなく、 (2)のPHPで生成するのがHTMLでなくて、XMLやJsonになるだけの違いです。

okweb12345
質問者

お礼

htmlのformで送ってそれを受け取ったphpファイルの変数に代入して、 その変数を指定してdbのカラムに入れればajaxを使わなくてもできるので、ajaxを使うと軽くなるというメリットはないのですね。 あるのはページ遷移しなくてよくなるだけですね。

その他の回答 (13)

  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.3

> inputに入力された情報をDBに登録するためにはhtmlのpostで可能なので、phpもajaxも必要ないのですね。 サーバサイドの事とブラウザサイドの事を混同して考えてはいけません。 inputに入力された内容をサーバへ送信するには、HTMLのformを使ってユーザーがsubmitする方法も有れば、formを使わずにJavaScript(Ajax)を使ってプログラムで制御しながら送信する方法もあると言う事です。 どちらがいいかはサイトの構造やUI設計などに依存します。 ブラウザからサーバへデータを送信するにはHTTPのGETメソッドかPOSTメソッドを使う必要がありますが、これはブラウザとサーバ間の通信方法の問題です。 formを使おうがAjaxを使おうが、何れの手段であっても通信プロトコルとしてはHTTPのGETメソッドかPOSTメソッドを使用します。 サーバへ送られたデータは何らかのプログラムで処理しないとDBに入れる事は出来ませんので、PHPでもPerlでもRubyでもJavaでも何でもいいのでプログラミング言語を使ってプログラムを用意しなければいけません。 PHPを使うのであれば、PHPには $_GET とか $_POST と言ったHTTPで送信されてきたデータを受け取る変数が用意されているので、これらを使って受信したデータを取り出して処理します。 ただ、セキュリティの事を考えたら何らかのフレームワークを使用して受信したデータのチェックをした方がいいんじゃないでしょうか。 自分でデータチェックのプログラムを書いてもいいですが、結構手間が掛かりますよ。 それにフレームワークを使えばデータチェックだけで無く、DBへのデータの出し入れなんかもゴチャゴチャとコードを書かなくて済むので簡単です。

okweb12345
質問者

お礼

inputに入力された情報をDBに登録するためにはhtmlのpostで可能なので、phpもajaxも必要ないのですね。 そのためにはhtmlのpostでphpの変数に代入してその変数をdbにインデックスさせれた良いという事でよいでしょうか? フレームワークのlaravelを使って作ろうかとも思ったのですが、あまりに癖が強く学習コストも大きすぎそうなので、簡易な投稿サイトくらいなら生のほうがずっと簡単だと思ったのですがそうではないのでしょうか? またレンサバがsshに対応していないようでLaravelを使えないといわれてしまいました。

  • akauntook
  • ベストアンサー率19% (295/1481)
回答No.2

色々と曖昧なので、まずは整理されたらいかがでしょうか。 まず、『簡単な投稿サイト』じゃ作れません。 具体的に何を誰が投稿し、投稿内容を誰に対してどのように表示し、投稿の管理は誰がどのように行うのか。 最低限の仕様でこれくらいは明確じゃないと、着手出来ないですね。 基本的に何らかのプログラミングは、目的のために問題を分解して、最も簡単に分解することで行います。 目的がわからなければ、やりようがないです。 次に、質問でよくわからなかったのは、DBデータです。 データベースなんで、データを扱うのは当たり前なんですが、どんなデータなのかデータベースのどのテーブルにどのような構成のデータがあるのか、明確じゃないですね。 データを表記と言うのもわからない。 データを表記したならデータが並ぶだけで、データベースは関係ない。 さらに、INPUTに入力。 INPUTって言うのは入力を英語にしただけなので、入力に入力と言っているのと同じ意味で、わからない。 食べ物の摂取方法に例えるなら、口に運び噛み砕いて飲み込むと言うところを、入力に運び噛み砕いて飲み込むみたいなことになってます。 どうやって入力したいのか。これを説明しましょう。 >これらの作業はすべてphpで行うよりサーバの負担を避けるためにinputに入力された文字列をphpの変数に入れるまではajaxを使ったjsで行うべきでしょうか? これが特に何を思って何をしたいのかわからないですね。 サーバー負担は、サーバーに何らかの処理をさせればかかるはかかりますけど、処理をさせたいのだから仕方ないですね。 無駄に処理をさせる必要はないと思いますが、簡単な投稿サイトなのだから、大した負荷がそもそもかかると思えないんですけど。 phpで値を変数に入れるには、わかっていると思うんですが、=を使うだけです。 =の右側の値が左側の変数に入りますね。 WebでLAMP環境のシステム開発するなら簡単な流れ 1.HTMLのフォームを使ってDBに挿入する情報を入力させる。 2.phpで入力された情報を受け取る。 3.phpで受け取った情報を使ってSQL文を発行する。 4.phpからDBにクエリを送る。 5.DBに問い合わせたならその結果をphpで受け取る。 6.受け取ったカラムのデータをphpでごにょごにょやって整形してhtml出力する。 さて、どれがわからないんだろう。

  • t_ohta
  • ベストアンサー率38% (5081/13278)
回答No.1

> これらの作業はすべてphpで行うよりサーバの負担を避けるためにinputに入力された文字列をphpの変数に入れるまではajaxを使ったjsで行うべきでしょうか? Ajaxを使おうがHTMLでPOSTしようがサーバーの負担はそんなに変わらないでしょう。 > その場合どうやってphpのこの変数に入れるとするのでしょうか? Ajaxを使ったとしてもブラウザからサーバへデータを渡す仕組みはHTMLのフォームと同じです。 GETメソッドかPOSTメソッドを使ってサーバへリクエストを送るだけです。

okweb12345
質問者

お礼

inputに入力された情報をDBに登録するためにはhtmlのpostで可能なので、phpもajaxも必要ないのですね。 そのためにはhtmlのpostでphpの変数に代入してその変数をdbにインデックスさせれた良いという事でよいでしょうか?

関連するQ&A

  • データベースに"や'を保存できない

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 自己紹介文のような長めの文章をデータベースのTEXT型カラムにUPDATEで保存したいです。 $stmt = $db->prepare("UPDATE member SET text=:text WHERE id=:id"); $stmt -> bindParam(':text ',$text,PDO::PARAM_STR); $stmt -> bindParam(':id',$id,PDO::PARAM_INT); $stmt -> execute(); というSQL文を作成し、 文字列データを保存することはできたのですが、 「"」や「'」のような記号を含めるとそれ以降の文章が消えた状態で保存されてしまいます。 例えば顔文字などで「"」や「'」のような記号を使用する場合もあると思うので、 できれば、データベースに保存したいです。 どうしたら安全に「"」や「'」が保存できるでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • プリぺアドステートメントで変数が認識されない

    趣味でHPを作ろうとPHPを始めました。 初歩的な質問で恐縮なのですがどなたかご協力頂けないでしょうか? 多少省略していますが現在作成中のスクリプトは以下の通りです。 $sql="SELECT * FROM property WHERE price BETWEEN ? AND ? AND citycd=?"; $stmt = $db->prepare($sql); $stmt->execute(array($price1,$price2,$citycd1)); $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); foreach($rows as $r){ echo .$r['plan'].; } 上記のなかでarrayの中の変数が変数として認識されません。 変数は$_POSTで受け取っているものなのですが、受け取りの成功は確認済です。 また、変数の代わりに数字を直で入れれば動くので、やはり変数の書き方に問題があるかと思います。 変数のセットの仕方は { } や '..' など色々あると思います。 マニュアルでそのあたりを調べて何パターンか試してみたのですがうまくいきません。 http://php.net/manual/ja/language.types.string.php 恥ずかしい質問ですがよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • selectによるレコード取得結果の有無で条件分岐

    PHP(PDO)とMySQLでプログラムを組んでいます。 DBからselectでレコードを取得するのですが、もし該当するレコードが一件もない場合は404のエラーページにリダイレクトさせたいのですが、その場合の条件式は if(!$stmt->fetch()){ } で大丈夫でしょうか?一応下にプラグラムの抜粋を載せてみました。 他に何かよい方法がございましたら教えていただきたいです。 よろしくお願いします。 sql="SELECT・・・・"; $stmt=$db->prepare($sql); $stmt->bindParam(':・・',・・・']); $stmt->execute(); if(!$stmt->fetch()){ header("Location:・・・・"); } $stmt->execute(); while($row=$stmt->fetch()){ }

    • ベストアンサー
    • MySQL
  • SQLインジェクション対策

    SQLインジェクション対策として、変数を直接SQLに埋め込むのではなく、PDOのprepareメソッドを利用して作成したステートメントに値をバインドする形式にする場合、ユーザー定義関数をどのように 修正すればいいですか? function update_item_stock($db, $item_id, $stock){ $sql = " UPDATE items SET stock = {$stock} WHERE item_id = {$item_id} LIMIT 1"; return execute_query($db, $sql); } function execute_query($db, $sql, $params = array()){ try{ $stmt = $db->prepare($sql); return $stmt->execute($params); }catch(PDOException $e){ set_error('更新に失敗しました。'); } return false; } 上記のユーザー定義関数を下記のようにbindValueを用いて表す場合、$stmt->bindValueの部分を 上記のどこに追加すればいいですか? try { $sql = 'UPDATE item_stock SET stock = ?, update_date = ? WHERE item_id = ?'; $stmt = $db->prepare($sql); $stmt->bindValue(1, $update_stock, PDO::PARAM_INT); $stmt->bindValue(2, $date, PDO::PARAM_STR); $stmt->bindValue(3, $item_id, PDO::PARAM_INT); $stmt->execute(); $complete_msg[] = '在庫変更に成功しました。'; } catch (PDOException $e) { $err_msg[] = '更新に失敗しました。理由:' . $e->getMessage(); }

    • 締切済み
    • PHP
  • SQLiteでのDateTimeの扱い

    SQLiteのデータベースにphpで値を保存したいのですが、カラムのタイプがdatetimeだと上手くいきません。 現在の時刻をSQLiteに書き込むということをしたいです。 カラムのタイプをdatetimeからtextに変更するのは避けたいので、下のphpを変更して書き込めるようにするにはどうすれば良いのでしょうか? 詳しい方よろしくお願いします。 SQLite DB ---- CREATE TABLE "dt" ("ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,"REGIST" DATETIME) ---- PHP ---- $sqlite = 'SQLiteへのパス'; $db = new PDO($sqlite); $now = date('Y-m-d H:i:s'); $nfe = $db->prepare('insert into dt(REGIST) values(?)'); $nfe->execute(array($now)); ----

  • phpからsqliteにselect抽出

    phpからsqliteにselect抽出しています。 $sql = "select * from Table where C=?" $st = $db->prepare($sql); $st->bindParam(1, $key, PDO::PARAM_STR); $st->execute(); while ($row = $st->fetch(PDO::FETCH_ASSOC)) { *** *** } でエラーにはなりませんが、データがとれません。 updateやinsertで?(インジェクション)はうまくいくのですが、Selectでなぜ取得できないのでしょうか? bindParamをarrayにしたりprepare をqueryにしたりしましたが、 データが1件しか取れなかったりします。

    • ベストアンサー
    • PHP
  • PDOでLIKE検索

    LIKE検索でつまづいでいます。 こまめにチェックしながら進めており、エラーが表示されるわけではないのですが、うまくキーが引き渡せていないのが原因だとは思うのですが、どう対策すればいいかというところでつまづいています。 文字コードの指定、直接パラメーターを使わない、プレースホルダの使い方、キーの渡し方等アドバイスをいただけないでしょうか。 ※全件表示だと動作します。また、$keyの中身はきちんと渡っているのは確認できましたが、select文の部分に反映されていないような状態。。。 【検索フォーム】 <form name="" method="POST" action="result.php"> <button type="submit" name="area" value="新宿">新宿</button> </form> 【検索結果】 define('DB_HOST', 'localhost'); define('DB_USER', 'ユーザー名'); define('DB_PASSWORD', 'DBパスワード'); define('DB_NAME', 'DB名'); try { $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PASSWORD, array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8'") ); } catch (PDOException $e) { echo $e->getMessage(); exit; } $key = "%".$_POST['area']."%"; $stmt = $dbh->prepare('SELECT * FROM salon WHERE area LIKE :area'); $stmt->bindParam(':area', $key, PDO::PARAM_STR); $stmt->execute(); ?> <body> <?php foreach ($stmt as $row) : ?> <?php echo htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8'); ?> <?php echo htmlspecialchars($row['area'],ENT_QUOTES,'UTF-8'); ?> <?php endoforeach; ?> </body> アドバイスをいただければ幸いです。

    • ベストアンサー
    • PHP
  • PHP PDO化作業中ORDERでソートできない

    WAMP初級者です。 いままでPEAR::DBを使って書いていたサイトがあり、PDOを利用するように書き換えていますが、いろいろ試してもorderでの並び替えが効いてくれません。どなたかアドバイス頂けないでしょうか。 該当箇所のみ切り出して例示いたします。 キーワード検索した結果画面で、$keywordはPOSTで渡って来ています。 ●うまくいく例(画面に期待したものが表示される) $connection=new PDO('mysql:host=localhost;dbname=test_db','root','root'); $connection->query('SET NAMES utf8'); $query="select * from test_tbl join test2_tbl using(Code) where NameW lik e :keyword"; $stmt=$connection->prepare($query); $stmt->bindValue(":keyword","%$keyword%",PDO::PARAM_STR); $stmt->execute(); ●これだと画面が真っ白になる(オーダーでソートしたいのですが。。) $orderKB="10K+10B"; $direction = "desc"; $connection=new PDO('mysql:host=localhost;dbname=test_db','root','root'); $connection->query('SET NAMES utf8'); $query="select * from test_tbl join test2_tbl using(Code) where NameW lik e :keyword order by :orderKB :direction"; $stmt=$connection->prepare($query); $stmt->bindValue(":keyword","%$keyword%",PDO::PARAM_STR); $stmt->bindValue(":orderKB", $orderKB, PDO::PARAM_STR); $stmt->bindValue(":direction", $direction, PDO::PARAM_STR); $stmt->execute(); ちなみに、10Kと10Bというのは数字データで合計した数字の高い順に並び替えを したいです。 初歩的な質問ですみませんが、どなたお助けいただけますと幸いです。 環境はApache/2.2.4 (Win32) PHP/5.4.22です 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • mysql_queryがある場所について

    ZendFramework-1.11.7を使用しています。 Zend_DbでPdo_Mysqlで接続して利用しています。 そこで、クエリを実際に実行している箇所を探しているのですが、 ソースの中にmysql_queryが見つからないのです・・・ PHPとかでSQLを発行したい場合にはmysql_queryでやるんですよね?? ┬ Zend │└ Db │ ├ Statement.php ファイルには public function execute(array $params = null) { /* * Simple case - no query profiler to manage. */ if ($this->_queryId === null) { return $this->_execute($params); } があるのですが、これは $this->_execute($params); を実行していて ┬ Zend │└ Db │ ├ Statement │ │ ├ Pdo.php ファイルには public function _execute(array $params = null) { try { if ($params !== null) { return $this->_stmt->execute($params); } else { return $this->_stmt->execute(); } があるのですが、これは $this->_stmt->execute(); を実行しているようなのです。 なんか行ったり来たり(^^;)していて最終的にどこでSQLを発行(mysql_queryを実行)しているのかが フォルダ全体を文字列検索しても見つからないのです・・・ _stmtが何のオブジェクトなのかが定かではないので、追跡しづらいのかもしれませんが、 どこでSQLを発行しているのか教えて頂けないでしょうか?

    • ベストアンサー
    • PHP
  • phpプリペアードステートメントについて質問です。

    phpの練習で、以下のようなhtmlファイルとphpファイルを作り XAMPで作業をおこなっています。 以下にあるhtml.phpファイルでのやり取りはうまくいっているのですが、 このphpをプリペアードステートメントにする所で躓いています。 いろいろ調べてやってはみたものの、どうしても%を使った あいまい検索のところがわかりません。 ---------------------------------------------------------------- 以下、プリペアードステートメントにする前の ページ内容です。こちらではうまくいっています。 html <form method="post" action="kensaku.php"> ご意見コードを入力してください。<br /> <input name="code" type="text" style="width:100px"><br /> <br /> <input type="submit" value="送信"> </form> php <?php $code=$_POST['code']; $dsn = 'mysql:dbname=phpkiso;host=localhost'; $user = 'root'; $password =''; $dbh = new PDO($dsn,$user,$password); $dbh->query('SET NAMES UTF-8'); $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); while(1) { $rec=$stmt->fetch(PDO::FETCH_ASSOC); if($rec==false) { break; } print $rec['code']; print $rec['nickname']; print $rec['email']; print $rec['goiken']; print '<br />'; } $dbh = null; ?> ---------------------------------------------------------------- 以上のphpの中の以下の分を $sql = "select * from `anketo` where `goiken` like '%{$code}%' "; $stmt = $dbh->prepare($sql); $stmt-> execute(); ↓ $sql ="SELECT*FROM anketo WHERE goiken like ?"; $stmt = $dbh->prepare($sql); $data[] = $code; $stmt->execute(array("%$_GET[$data]%")); こんな風に直しては見たのですが、なんだか うまくい行かずです。 よろしければ教えてください。 宜しくお願い致します。

    • 締切済み
    • PHP