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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

2回答

790閲覧

sqlのDELETE文が効かない。

ituking

総合スコア80

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2022/04/14 11:49

編集2022/04/17 00:48

こんにちは。私は現在書籍の在庫管理システムを作っている者です。バックエンドの部分に関してわからないことがありこの場をお借りして質問させていただきたいと思います。よろしくお願いします。

発生している問題

SQLのdelete文が機能しなく、選択した本のデータが削除できない。

実現したいこと

SQLのdelete文で削除ボタンを押したときに本のデータが削除されるようにしたい。

わからないこと

なぜ本のデータが削除されないのか、私としてはSQL文が間違っているとかその辺りだと思っているのですがそこだけに固執している可能性があり、皆さんの力をお借りしたい。

実際に行ったこと

idカラムをバインドさせるのではなくtitleカラムをバインドさせることをやってみたが変化なし。

参考にしたWEBページ

https://www.sql-reference.com/delete/delete.html
https://style.potepan.com/articles/15564.html
http://www.mitene.or.jp/~rnk/TIPS_ORCL_DELETE.htm>

開発環境

Mac OS Monterey 12.3.1
PHP version 7.4.16

コード

<?php // db_connect.phpの読み込み require_once("db_connect.php"); // function.phpの読み込み require_once("function.php"); // ログインしていなければ、login.phpにリダイレクト check_user_logged_in(); // URLの?以降で渡されるIDをキャッチ $id = $_GET['id']; // もし、$idが空であったらmain.phpにリダイレクト // 不正なアクセス対策 if (empty($id)) { header("Location: main.php"); exit; } // PDOのインスタンスを取得 $pdo = db_connect(); if (!empty($_POST)) { // idを格納 $id = $_POST["id"]; try { // SQL文の準備 $sql = "delete from 'books' where 'books'.'id' = ':id'"; // プリペアドステートメントの作成 $stmt = $pdo->prepare($sql); // idのバインド $stmt->bindParam(':id', $id); // 実行 $stmt->execute(); // main.phpにリダイレクト // header("Location: main.php"); exit; } catch (PDOException $e) { // エラーメッセージの出力 echo 'Error: ' . $e->getMessage(); // 終了 die(); } } ?> <!doctype html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="../CSS/delete_books.css"> <title>削除</title> </head> <body> <h1>削除画面</h1> <div>削除しました</div><br> <a href="main.php">在庫一覧画面に戻る</a> </body> </html>

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

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

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

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

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

ituking

2022/04/14 11:59

フォルダの情報を記載するのを忘れていました。4-2フォルダです。
nukasa

2022/04/14 12:05

PHPのソースコードがなければ、答えられる人はいません。
退会済みユーザー

退会済みユーザー

2022/04/14 12:10

質問欄は編集できるので追加情報などは質問欄を編集して追記してください。その際突然出てきた「4-2フォルダ」とは一体何なのかも書いてください。 また、 https://teratail.com/help/question-tips をよく読んで質問内容を見直した方が良さそうです。特に以下のあたり。 "人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。一見簡単なようですが、実はとても難しいことです。何がわからないかわからない人から質問を受けても、答える側も困ってしまいます”
guest

回答2

0

ベストアンサー

他にも原因はありそうですが、とりあえずは

PHP

1$sql = "delete from 'books' where 'books'.'id' = ':id'";

PHP

1$sql = "delete from `books` where `books`.`id` = :id";

の修正は必要です(シングルクォートとバッククォートは違うものです)

なぜ本のデータが削除されないのか、私としてはSQL文が間違っているとかその辺りだと思っているのですがそこだけに固執している可能性があり、皆さんの力をお借りしたい。

SQLの正しさを確認したい場合は、

  1. MySQLクライアントなりphpMyAdminなりMySQL WorkbenchなどのSQLを実行できる環境を用意する
  2. 1の環境から値が固定のSQLを実行して、SQLそのものが正しいことを確認する
  3. 変数にしたい箇所だけプレースホルダ(質問文だと:idの部分)に変更してPHPに組み込む

という感じで一つづつ確認してみてください。

その他

db_connect.phpの中身が分からないので何ともですが、現状で
echo 'Error: ' . $e->getMessage();
の部分でエラー表示が出来ていないのであれば、(表示されているのであれば質問文に追記してください)

PHPでデータベースに接続するときのまとめを参考にしてPDOがSQLエラーを例外として表示するように設定してみてください。
(db_connect.phpがご自身で書いたものでないのであれば、まずは自力で書いてみることを強くお勧めします)

あとは、
PHP デバッグ 方法で検索してみて、基本的なデバッグの方法を学習されることをお勧めします。
(エラーメッセージと勘だけでデバッグするのは上級者でも困難です)
出来ればその後PHP デバッグ xdebug ブレークポイント VSCodeあたりで検索して、ブレークポイントを使ったデバッグ環境を整えると捗ります。

投稿2022/04/14 14:32

編集2022/04/15 03:42
tanat

総合スコア18709

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

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

m.ts10806

2022/04/14 22:03

':id' ここのシングルクォートも不要に思います。
tanat

2022/04/15 03:43

> m.ts10806さん 補足ありがとうございます。 回答修正しました。
ituking

2022/04/16 15:48

皆さん解説ありがとうございます。まず、GET通信を使っているのでPOSTで受け取るのは不可能なのでそこをGETにするということと、シングルクオートとバッククオートが似て非なるものというのをしっかり認識していませんでした。いただいた解説を読み込み自分の中で理解して今後の開発経験に活かしていきたいと思います。
guest

0

$id = $_POST["id"];ではなく$id = $_GET["id"];では?(ざっと見ただけ)

投稿2022/04/14 13:29

編集2022/04/14 13:31
5ugarVVatch1ng

総合スコア356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問