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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

MySQL

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

PHP

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

Q&A

解決済

3回答

1869閲覧

PHP SQL文(DELETE)がうまく動作しない

Chihaya

総合スコア1

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

MySQL

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

PHP

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

0グッド

0クリップ

投稿2021/05/11 01:35

編集2021/05/11 02:03

前提・実現したいこと

フォームで受け取ったデータをSQL文に入れて一致したデータを削除するといった感じに動かしたいです
UtilConnDBの->Connect()はクラスの変数に入っているPDOの接続情報をreturnで返すものです。

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

DELETEは実行されていて、$contでは1が帰ってきているのですが、DB上では情報が消されておらず何度実行してもうまくいきません、

該当のソースコード

php

1<?php 2require_once 'Include/utilConnDB.php'; 3$util = new UtilConnDB(); 4try{ 5 $pdo = $util->connect(); 6 $sqlword = 'delete from `skill` where syainbangou = '.$_REQUEST['id'].' and sikakucode = '.$_REQUEST['code'].';'; 7 $cont = $pdo->exec($sqlword); 8 if($cont == 1){ 9 echo $cont.'<a href="jouhouhenkou.php?id='.$_REQUEST['id'].'">exit</a>'; 10 11 //header('Location:jouhouhenkou.php?id='.$_REQUEST['id']); 12 }else{ 13 echo 'エラーが発生'; 14 echo $sqlword; 15 //header('Location:jouhouhenkou.php?id='.$_REQUEST['id']); 16 } 17}catch(PODException $e){ 18 echo 'PDOエラー <a href="/Home/">戻る</a>'; 19} 20?>

試したこと

exec()のほかにも、prepare()や、query()も試したのですが同じ結果になりました。
Select文は同じ記述でも普通に出力されるのですが
DELETEと同様にUPDATE文でも同じことが起こっています。

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

エディタはVisualStadioもしくは、VScodeで書いています。文字コードはUTF-8です。
SQL文はphpMyAdminの方では正常に動作していました。
使用DBはmySQLです

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

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

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

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

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

m.ts10806

2021/05/11 01:38

PDO利用時のエラーモード設定はどうなってますか? https://www.php.net/manual/ja/pdo.error-handling.php 設定無しだとExeptionはthrowされませんし、throwされるようにしても捕捉したExeptionを出力してないのでエラーが起きていても確認できる実装になっていません。
m.ts10806

2021/05/11 01:39

あと、SQLインジェクションが可能なので、そこはなんとかしたほうが良いです。
Chihaya

2021/05/11 02:09

PDO::ATTR_ERRMODE =>PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC これで合っていますか?無責任だと思うのですが、正直理解できていないです。 SQL文に関しては動きが確認でき次第bindValueで対策をとる予定です。 回答ありがとうございます!少しPDOのエラーについて調べてみます。
m.ts10806

2021/05/11 02:12

理解できないことは無責任とは言わないのでは。
Chihaya

2021/05/11 02:29 編集

少し丸投げ感があったのでそう思いました。とくに深い意味はないです。
guest

回答3

0

ベストアンサー

使用している DB が不明ですが、単純に
「commit していない」
からでは。

投稿2021/05/11 01:39

tacsheaven

総合スコア13703

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

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

m.ts10806

2021/05/11 01:47 編集

タグとphpMyAdminというところからの推測にはなりますが、実装でどうなってるか、バージョンや環境、設定(オートコミットの有無)までは確かに不明ですね。
tacsheaven

2021/05/11 01:49

delete の exec 結果行数が 1 だといっているので、SQL 自体は正常に動いている。 とすると、コミットくらいしかないですからねえ。
Chihaya

2021/05/11 02:55

SELECT文に関しては正常に動いているのですがこれはコミットできていることになりますか? SELECTとDERETEでプログラムの文法はあまり変えていないです。
tacsheaven

2021/05/11 03:01 編集

コミットが必要になるのは「データの変更が発生したとき(追加・更新・削除)」です。 SELECT は変更を伴わないので関係ありません。 ※他のセッションで更新(トランザクションをかけている場合)したときにSELECTがどういう挙動をするかは設定によります。これは DB でのトランザクション制御の根幹部分ですのできちんと調べて理解しておきましょう
Chihaya

2021/05/11 03:05

$pdo->commit();を追加したところ、動作しました ありがとうございます!
m.ts10806

2021/05/11 03:35

やはり、今提示されてる内容だけだとエスパーになってしまいますね。 MySQLのデフォルトはオートコミットですし。
guest

0

$pdo->Commit();をexec($sqlword);の後に入れたら、無事反映されました。

投稿2021/05/11 03:07

Chihaya

総合スコア1

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

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

0

本件と関連があるかどうかは別として、アプリケーションからDBに対してexecuteする場合、SQLは一本ずつしか実行できないので、終端はつける必要がなく、言語や機能によっては終端が自動でつけられた上で実行されるため自前でつけてしまったためにエラーが起きるということはありえます。

まあひとまず、エラーハンドリングするにしても、エラーをthrowされる設定にしないとthrowしてくれませんし、catchしてもExeptionを出力せず握りつぶす実装になっているので、何が起きても知る術がないようになっています。

SQLインジェクションへの考慮は必須です。

そんなときに参考したいまとめ記事はこれ。
PHPでデータベースに接続するときのまとめ

一通り対策しても変化がない場合、
実行されるSQLを取得し直接実行してみてください。

それでも変化がない場合、
接続時や実行前にオートコミットオフにしてたりしないかとか、既に回答で言及のあるコミットをしてみるとか(トランザクション開始はしましょう)、確実に実行されるような実装にしてみてください。

返却値も固定値で条件式通ったものを「1が返ってきてる」と根拠とするのではなく、var_dumpして返却値そのものを確認してください。
PHPマニュアルで確認すると分かりますが、返るのは行数だけとは限りませんし、警告にあるように比較が==では弱いです。

投稿2021/05/11 02:00

m.ts10806

総合スコア80875

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

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

Chihaya

2021/05/11 02:24 編集

エラーの設定はExceptionになっていました。 DB接続のまとめも確認してみたのですが、見た感じ引っかかる項目はないと思いました。 var_dumpは使用していないのですが、echoで出力は出しています。別の場所でecho $cont;と行ったりはしていて、存在しないキー値を送信した場合は0が返りif文のelseの部分を通ることも確認できています。 try,catchは、まだ理解が浅いので調べてみます。
m.ts10806

2021/05/11 02:27

質問に現状追記してください。 文章だけではこちらの意図が伝わった実装なのかわかりません。 echoよりvar_dumpのほうがデバッグとしては好ましいです。型も出してくれますから。 あと、utilConnDB.phpのコードも追記してください。
m.ts10806
m.ts10806

2021/05/11 02:32

後回しにするとできなくなるのが人間の性です。 それに実装方法がそもそも変わるので似たような確認を何度もしなければならなくなり非効率です。
Chihaya

2021/05/11 02:47

インジェクションは、とりあえず後回しにしています。動作が確認でき次第bindValueで対策をとる予定です。 あと、1週間くらいこれに躓いてたので GoogleでPHP SQL DELETE 反映されない や、動かない 記述法 などでヒットする部分については一通り確認したつもりです。 セキュリティの部分も見直さないといけないのですが、 とりあえず今は挙動のほうを重視してバグと格闘しています。
m.ts10806

2021/05/11 02:49

質問に現状追記してください。 文章だけではこちらの意図が伝わった実装なのかわかりません。
Chihaya

2021/05/11 02:50

非効率ですが、動きが確認できたらもう一度コードを書き直す予定です。(時間は結構あるので。) いろいろリンクを送ってくださりありがとうございます。 もう一度見て回ってみます。
m.ts10806

2021/05/11 02:53

utilConnDB.phpのコードも追記してください。 もしかしたら気づいてるかもしれないので老婆心ですが、現状のコードをなんとかしようと格闘するより提示したまとめ記事をきちんと理解するようにしたほうが、同じ1週間かけるとしても何倍も有用です。 プログラムは書いたとおりにしか動かないので「惜しい」という概念はないです。 それならより望ましい実装方法をはじめから覚えたほうが後々活きます。 どうしたいかは個人の自由なのでこのあたりにしておきますが、1エンジニアの先輩として思うところは伝えました。
m.ts10806

2021/05/11 03:33

誤解して伝わってたら申し訳ないので補足しますと、 決して「この1週間は無駄だった」というつもりではなく、「次の1週間どう過ごすとより成長できるか」にフォーカスをあててもらえたらと思います。 それにSQLインジェクションについてはずっと突っ込まれ続けることになりますし、プリペアドステートメント使った実装で作り直しになるのは分かってるので、同じような確認、似たような問題を抱えるならはじめから好ましい実装をしておいたほうが時間が無駄にならないよねと言うことを伝えたいです。 時間が確保できるかどうかではなく、同じ時間を使うならよりよい使い方をしたほうが今後の成長にも大きく関わるのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問