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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

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

Q&A

解決済

4回答

2083閲覧

phpでUPDATEできない

aobatact

総合スコア7

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

PHP

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

0グッド

0クリップ

投稿2016/08/17 09:13

編集2016/08/17 10:04

###前提・実現したいこと
現在練習のためにBBSを作っているのですがうまくいきません。
getで送られてくるactionとedidの値を用いて
まずactionで場合分けをしてeditなら更新するフォームに値を送り、それが書き換えられて送信されたらその値をデータベースに更新するようにしたいです。
###発生している問題・エラーメッセージ
フォームに送るのは大丈夫なのですが、その値を送信するとデータベースに新しく登録されて、もとのidの場所を変更することができません。
UPDATEのところでなにか問題があると思うのですが…。

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

php

1 if(!empty($_GET['action'])){//actionの取得 2 $act=$_GET['action']; 3 } 4 else{ 5 $act=null; 6 } 7 switch ($act){//actionのcheck 8 case 'edit'://action edit 変更 9 // データ取得 10 $sql = 'SELECT * FROM `posts` WHERE `id` = ?'; 11 $ed[]=$_GET['id']; 12 $stmt = $dbh->prepare($sql); 13 $stmt->execute($ed); 14 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 15 // 取得した値の格納 16 $edname=$rec['nickname']; 17 $edcomment=htmlspecialchars_decode($rec['comment']); 18 $edid=$_GET['id']; 19 $edbutton='更新する'; 20 $CUDsw=1; 21 break; 22 23 default://action null 登録 24 $edname=""; 25 $edcomment=""; 26 $edbutton='つぶやく'; 27 $CUDsw=0; 28 break; 29 30 case 'delete'://action delete 削除 31 $edid=$_GET['id']; 32 $CUDsw=2; 33 $edname=""; 34 $edcomment=""; 35 $edbutton='つぶやく'; 36 break; 37 } 38 $ownurl=$_SERVER["PHP_SELF"];//このphpのurl取得 39 40 if(!empty($_POST)){//DB登録 変更 削除 41 $nickname=htmlspecialchars($_POST['nickname']); 42 $comment=htmlspecialchars($_POST['comment']); 43 switch($CUDsw){ 44 case 0://登録 45 $sql='INSERT INTO posts (nickname,comment) VALUES(?,?)'; 46 $data[] = $nickname; 47 $data[] = $comment; 48 break; 49 case 1://変更 50 $sql = 'UPDATE `posts` SET `nickname`=?,`comment`=? WHERE `id` = ?'; 51 $data[] = $nickname; 52 $data[] = $comment; 53 $data[] = $edid; 54 break; 55 case 2://削除 56 $sql='DELETE FROM posts WHERE `id`= ?'; 57 $data['id'] = $edid; 58 break; 59 } 60 $stmt = $dbh->prepare($sql); 61 $stmt ->execute($data); 62 header('Location:'.$ownurl); 63 exit(); 64 }

###試したこと
if(!empty($_POST))の真下に$CUDsw=1を入れたり$dataを直接指定してもいけませんでした。
まとめる前の編集機能だけの時はうまくいきました。
###補足情報(言語/FW/ツール等のバージョンなど)
XAMPPを使っています。

###追記
html のフォーム周辺です。

html

1<div class="col-md-4 content-margin-top"> 2 <!-- form部分 --> 3 <form id="formmo" action= 4 <?= $ownurl; ?> method="post"> 5 <!-- nickname --> 6 <div class="form-group"> 7 <div class="input-group"> 8 <input type="text" name="nickname" class="form-control" id="validate-text" <?= 'value="'.$edname.'"' ?> placeholder="nickname" required> 9 <span class="input-group-addon danger"><span class="glyphicon glyphicon-remove"></span></span> 10 </div> 11 </div> 12 <!-- comment --> 13 <div class="form-group"> 14 <div class="input-group" data-validate="length" data-length="4"> 15 <textarea type="text" class="form-control" name="comment" id="validate-length" placeholder="comment" required><?php echo htmlspecialchars_decode($edcomment); ?></textarea> 16 <span class="input-group-addon danger"><span class="glyphicon glyphicon-remove"></span></span> 17 </div> 18 </div> 19 <!-- つぶやくボタン --> 20 <button type="submit" class="btn btn-primary col-xs-12" disabled><?= $edbutton ?></button> 21 </form> 22 </div>

指摘があったので今から直しますがeditのボタン周辺

html

1<?php foreach ($data as $d): 2 $id=$d['id']; ?> 3 <a href=<?= $ownurl."?action=edit&id=".$id ?> class="timeline-icon bg-success" > 4 <i class="entypo-feather"></i> 5 <i class="fa fa-cogs"></i> 6 </a> 7 <div class="timeline-label"> 8 <?php 9 echo '<h2><a href="#" id="id'.$id.'">'.$id.':'.$d['nickname']; ?></a> 10 <?php 11 $created = strtotime($d['created']); 12 $created = date('Y年m月d日 H時i分s秒',$created); 13 echo '<span>'.$created.'</span>'; 14 ?> 15 </h2> 16 <p><?php echo $d['comment'] ?></p> 17 </div> 18 <?php endforeach; ?>

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

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

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

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

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

FKM

2016/08/17 09:42

HTMLソース、特にフォーム周りのコードはどうなっていますか?
aobatact

2016/08/17 10:06

ありがとうごさいます。 HTMLソース追加しました。
guest

回答4

0

php

1$sql = 'UPDATE `posts` SET `nickname`=?,`comment`=? WHERE `id` = ?';

php

1$sql = 'UPDATE posts SET nickname=?,comment=? WHERE id = ?';

ですよね?

更新処理だけ追いかけてみると、
nicknameとcommentに該当するのは

php

1$nickname=htmlspecialchars($_POST['nickname']); 2$comment=htmlspecialchars($_POST['comment']);

で取得しているのがわかりますが、肝心のidに該当するものをどこから取得していますか?

php

1$ed[]=$_GET['id'];

なぜここだけ$_GETなのか。$_POSTで取得するべきでしょう。
となると、

php

1 case 1://変更 2 $sql = 'UPDATE posts SET nickname=?,comment=? WHERE id = ?'; 3 $data[] = $nickname; 4 $data[] = $comment; 5 $data[] = $edid; 6 break; 7 case 2://削除 8 $sql='DELETE FROM posts WHERE `id`= ?'; 9 $data['id'] = $edid; 10 break;

php

1 case 1://変更 2 $edid = htmlspecialchars($_POST['id']); 3 $sql = 'UPDATE posts SET nickname=:nick, comment=:comm WHERE id = :edid'; 4 $data = array(':nick'=>$nickname, ':comm'=>$comment, ':edid'=>$edid); 5 break; 6 case 2://削除 7 $edid = htmlspecialchars($_POST['id']); 8 $sql = 'DELETE FROM posts WHERE id=:edid'; 9 $data = array(':edid'=>$edid); 10 break;

としてはいかがでしょうか。
名前付きパラメータにしたのは、バインドミスを防ぐためです。
$edidは変更と削除のアクションの時だけ必要なため、
case文の分岐の中で取得するようにしてみました。

投稿2016/08/17 09:35

編集2016/08/17 09:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aobatact

2016/08/17 09:53

回答ありがとうございます。 とりあえずget送信のところ以外は修正したのですがうまくいきませんでした。 今からpost送信に直してみます。
退会済みユーザー

退会済みユーザー

2016/08/18 02:44

GETは$_GETでしか受けられないし、POSTは$_POSTでしか受けられません。両方受けられる$_REQUESTというのもありますがPOSTで受けると決めているのであれば$_POSTを使うべきです。
退会済みユーザー

退会済みユーザー

2016/08/18 03:04

変更や削除のアクションを送信するフォームに、hidden属性で$edidに相当するものを入れておけば解決しそうです。
kunai

2016/08/18 03:20

$_POSTと$_GETは同時に使えますよ。 サーバ設定にもよるでしょうが、PHPのデフォルトとしては使えます。 べき論でいえば、色々突っ込みどころの多いソースコードですので、言い出すときりがなさそうですけど。。
aobatact

2016/08/18 09:53

ご指摘の通りフォームから別の変数を送ったらできました。 まだ修正点多いだろうから頑張って直していきます。
guest

0

ベストアンサー

PHPプログラムが、登録しかされないってことは、$CUDswには0しか代入されないってことですね。では、$CUDswに0が代入されるタイミングを見ると、swtich($act)がnullの場合です。…ということは、$actには何も値が代入されていないと断定できます。

そこで、htmlを見直すと、

html

1<a href=<?= $ownurl."?action=edit&id=".$id ?> class="timeline-icon bg-success" > 2 <i class="entypo-feather"></i> 3 <i class="fa fa-cogs"></i> 4</a>

このようになっています。GETと関係のない所にボタンがあるので、GETのパラメータは無視されます。したがって、このままだとeditという値は入ってきませんね。FORMタグのactionに記述してGETで送るか、hiddenを使ってPOSTで送るかなりしないといけない気がします。

投稿2016/08/18 02:57

FKM

総合スコア3608

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

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

aobatact

2016/08/18 09:43

回答ありがとうございました。 その通りでした。フォームに情報を送る場合分けとフォームの情報からの処理の場合分けを混同していました。別にフォーム部分から送るための変数を用意したらできました。
guest

0

$_GETと$_POSTが混在しているのが原因のように思えます。
HTML上どちらを指定しているのでしょう?
統一した上で、デバッグ文を入れるなりして、希望通りのコードを通過しているか確認してみてください。

投稿2016/08/18 00:12

ttyp03

総合スコア16996

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

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

aobatact

2016/08/18 09:49

回答ありがとうございます。 今回は直接は関係ありませんでしたけど、どこに何を送るかしっかりとさせるために統一したほうがよさそうですね。
guest

0

まず、UPDATEではなくINSERTになる原因について。
INSERTになるという事は、下記のソースコードの流れからみると

PHP

1if(!empty($_GET['action'])){//actionの取得 2 $act=$_GET['action']; 3 } 4 else{ 5 $act=null; 6 } 7###中略 8 switch ($act){//actionのcheck 9 case 'edit'://action edit 変更 10 $CUDsw=1; 11###中略 12 default://action null 登録 13 $CUDsw=0; 14###中略 15 16switch($CUDsw){ 17###中略 18 case 1://変更

UPDATE(変更)扱いにする為には、$CUDswが1である必要があり
$CUDswが1である為には、$actが'edit'である必要があり
$actは$_GETの'action'が指定される必要がありますね。

ではactionはどのように渡っているかを見てみると、$_GETですので、FormのactionのURLにクエリストリングとしてわたってきているはずです。
そこのソースを見てみると、まずPHPで

PHP

1 $ownurl=$_SERVER["PHP_SELF"];//このphpのurl取得

という変数に、自分自身のURLを格納し、それをHTMLのFormで

HTML

1 <form id="formmo" action= 2 <?= $ownurl; ?> method="post">

として、渡しています。
ここで、$ownurlは$_SERVER['PHP_SELF']ですが、PHP_SELFではクエリストリングは含まれないURLとなります。
つまり、
http://example.com/form.php?action=edit
というURLにアクセスしていたとしても、$ownurlは
http://example.com/form.php
が入っていることになります。

つまり、actionがこの時点で欠落する。
ですので、$_GET['action']はemptyとなり、その為$actはnullとなり、その為$CUDswは0となり、その為INSERTの処理になるわけです。

$CDUsw=1を強制的に指定してもうまく行かなかったという問題も同じような問題で、$_GETでIDを取ろうとしているわけですが、actionと同様、idが引き継がれない為、と言うのが原因でしょうね。

投稿2016/08/18 03:13

kunai

総合スコア5405

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

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

kunai

2016/08/18 03:23

失礼、回答に値するものとしては不十分でしたね。 $_SERVER['REQUEST_URI'] を使えば、クエリストリングを含めたURLを取る事が出来ます。 これをそのまま使うのは、XSS等の脆弱性も考えられるのでお勧めできませんが。
aobatact

2016/08/18 09:47

回答ありがとうございました。 自分でも現在どこに情報を送っているのかあやふやなままでした。 しっかりとそこを意識してきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問