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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

901閲覧

PHPでSQLの更新/削除ができません!

Kqze

総合スコア0

SQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/04/09 02:04

編集2021/04/09 02:11

前提・実現したいこと

PHPで簡易的な掲示板的なものを作りたいのですが「更新」「削除」の機能が動きません。

SQLテーブルkeijibanの中身ですが、「id(int)」「nameok(varchar:15)」「comment(varchar:300)」「created(DATETIME)」を作ってます。
idに主キーを設定しAutoIncrimentしています。
「投稿」は動作しているのでSQLの接続で問題が起きているわけでは無さそうなんですが、、。

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

「更新」「削除」機能が動きません。エラーがブラウザ上に出ないので困っています。
こういうエラーが出ないときの対処法というか、どういう確認をしていったらいいかもわからず、そこらへんも教えて頂けたら嬉しいです。

該当のソースコード

PHP

1<?php header('Content-type: text/html; charset=UTF-8'); ?> 2<html> 3 <body> 4 5 <form method="post" action="/testphp/kjban.php"> 6 7 <label for="nameok">名前:</label> <!-名前ラベル-> 8 <input type="text" id="nameok" name="nameok" size="15" maxlength="15"><!-名前入力欄-> 9 <br><br><p> 10 <input type="radio" id="ins" name="set" value='1' checked><!-それぞれラジオボタン-> 11 <label for="ins">投稿</label> 12 <input type="radio" id="upd" name="set" value="2"> 13 <label for="upd">更新</label> 14 <input type="radio" id="del" name="set" value="3"> 15 <label for="del">削除</label> 16 </p> 17 <label for="comment">内容:</lavel> <!-コメントラベル-> 18 <textarea id="comment" name="comment" rows="3" cols="100" wrap="hard" maxlength="300" 19 placeholder="300字制限です"></textarea><!-投稿テキストボックス-> 20 <br> 21 <input type="submit" name="decide" value="確定する"><!-確定ボタン-> 22 <pre> 23 <?php 24 //MySQLに接続 25 $dsn = 'mysql:dbname=zpdb;host=localhost;charset=utf8mb4'; //DBへの接続情報 26 $user = 'root'; //ユーザー名 27 $password = 'OOOO'; //パスワード 28 29 try{ 30 $dbh = new PDO($dsn, $user, $password); //DBへ接続 31 } catch(PDOException $e) { 32 die('Connect Error: ' . $e->getCode()); //DB接続エラー時の処理 33 } 34 35 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //エミュレート機能をオフ 36 37 if(isset($_POST['set'])){ //ラジオボタンの値取得 38 if(isset($_POST['decide'], $_POST['nameok'] ) && $_POST['comment'] && $_POST['set']==1){ //投稿処理 39 $sql = 'INSERT INTO keijiban(nameok,comment,created) VALUES(?,?,CURDATE())'; 40 $sth = $dbh->prepare($sql); 41 $sth->bindValue(1,$_POST['nameok'],PDO::PARAM_STR); 42 $sth->bindValue(2,$_POST['comment'],PDO::PARAM_STR); 43 $sth->execute(); //SQL実行 44 } 45 46 elseif(isset($_POST['decide'],$_POST['check']) && $_POST['set']==2){ //更新 47 if(isset( $_POST['nameok'] ) && $_POST['nameok'] != '' && $_POST['comment'] != ''){ 48 $sql = 'UPDATE keijiban SET nameok=?,comment=? WHERE id = ?' ; 49 $sth = $dbh->prepare($sql); 50 $sth->bindValue(1,$_POST['nameok'],PDO::PARAM_STR); 51 $sth->bindValue(2,$_POST['comment'],PDO::PARAM_STR); 52 var_dump($_POST['comment']); 53 foreach($_POST['check'] as $chk){ 54 $id = (int)$chk; 55 $sth->bindValue(3,$id,PDO::PARAM_STR); 56 $sth->execute(); 57 } 58 } 59 } 60 else if(isset($POST['decide'],$_POST['check']) && $_POST['set']==3){ //削除 61 $sql = 'DELETE FROM keijiban WHERE id=?'; 62 $sth = $dbh->prepare($sql); 63 foreach($_POST['check'] as $chk){ 64 $id = (int)$chk; 65 $sth->bindValue(1,$id, PDO::PARAM_INT); 66 $sth->execute(); 67 } 68 } 69 } 70 $sql='SELECT nameok,comment FROM keijiban ORDER BY created DESC'; 71 //コメント表示 72 $sth = $dbh->prepare($sql); 73 $sth->execute(); 74 while($row = $sth->fetch(PDO::FETCH_ASSOC)){ 75 echo '<input type="checkbox" name="check[]" value="'; 76 echo htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8'); 77 echo '">'; 78 echo '<table border="1" style="border-collapse:collapse" style="table-layout:fixed;width:100%;">'; 79 echo '<tr><th align="left">',htmlspecialchars($row['nameok'], ENT_QUOTES, 'UTF-8'); 80 echo '</th></tr><tr><td>'; 81 echo htmlspecialchars($row['comment'], ENT_QUOTES, 'UTF-8'); 82 echo '</td></tr></table><br>'; 83 } 84 ?> 85 </pre> 86 </form> 87 </body> 88</html>

試したこと

一応、更新/削除のラジオボタンの判定は出来ているようで、そこで確定(decide)ボタン押しても投稿(insert)はされないです。
(var_dumpでもためしました )

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

複数回SQL送信するならその回数分prepareすべきと思います。

ひとまず、SQL実行時にもtry-catchでPDOException捕捉するように組んでみては(接続時は一度確立してしまえばそこまで重要ではないと思う)。
何かエラーが拾えるかもしれません。

投稿2021/04/09 02:16

編集2021/04/09 02:18
m.ts10806

総合スコア80875

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

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

Kqze

2021/04/09 02:28

ありがとうございます 更新の欄に elseif(isset($_POST['decide'],$_POST['check']) && $_POST['set']==2){ //更新 try{ if(isset( $_POST['nameok'] ) && $_POST['nameok'] != '' && $_POST['comment'] != ''){ $sql = 'UPDATE keijiban SET nameok=?,comment=? WHERE id = ?' ; $sth = $dbh->prepare($sql); $sth = $dbh->prepare($sql); $sth->bindValue(1,$_POST['nameok'],PDO::PARAM_STR); $sth->bindValue(2,$_POST['comment'],PDO::PARAM_STR); var_dump($_POST['comment']); foreach($_POST['check'] as $chk){ $id = (int)$chk; $sth->bindValue(3,$id,PDO::PARAM_STR); $sth->execute(); } } }catch(PDOException $e) { die('Connect Error: ' . $e->getCode()); //DB接続エラー時の処理 } } このようにtry-catch書いてみましたが前と同じ状態で変化なしです、。
m.ts10806

2021/04/09 02:42

catchのほうにもきてませんか? getCodeだけよりeそのものを出力したほうが良いかと。 あと、こちらの回答が加味された修正にはなってないですね。foreachのなかでprepareからexecuteまでしないと。
Kqze

2021/04/09 02:59

foreach文にprepare追加しましたが、すみません初心者なもので「eそのものを出力」とはどういう書き方をすればいいんでしょうか あと更新で確定したときにConnect Error: HY000 というエラーが出るようになりました これはnameokに記入した場合のみでnameokに記入無しだった場合はエラー出ませんが正常には動かず、何も変わらない といった感じです。 最後に現在の更新内foreach文載せます foreach($_POST['check'] as $chk){ $id = (int)$chk; $sth->bindValue(3,$id,PDO::PARAM_STR); $sth = $dbh->prepare($sql); $sth->execute(); } } }catch(PDOException $e) { die('Connect Error: ' . $e->getCode()); //DB接続エラー時の処理 } }
guest

0

$dbh = new PDO($dsn, $user, $password)

エラーモードのオプションを追加してください

$dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

投稿2021/04/09 02:15

yambejp

総合スコア116724

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

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

Kqze

2021/04/09 02:22

指定していただいた文のすぐ下にsetAttribute文追加しました。 どういう意図の文かまだ調べていませんが、更新/削除ともに変化なしです(更新前と同じです)
yambejp

2021/04/09 02:34

基本ですが、以下は設定していますか? error_reporting(E_ALL); ini_set('display_errors', '1');
yambejp

2021/04/09 02:43

$_POST["check"]がどこから持ってきているかもわからないですね
Kqze

2021/04/09 02:48

error_reprtingとini_setの設定知りませんでした。。 ソースコードの//MySQLに接続 の上に追加してみました。 $_POST['check']ですがこれは最後のほうにあるwhile文のチェックボックスの配列です。↓ while($row = $sth->fetch(PDO::FETCH_ASSOC)){ echo '<input type="checkbox" name="check[]" value="'; echo htmlspecialchars($row['id'],ENT_QUOTES,'UTF-8'); echo '">'; echo '<table border="1" style="border-collapse:collapse" style="table-layout:fixed;width:100%;">'; echo '<tr><th align="left">',htmlspecialchars($row['nameok'], ENT_QUOTES, 'UTF-8'); echo '</th></tr><tr><td>'; echo htmlspecialchars($row['comment'], ENT_QUOTES, 'UTF-8'); echo '</td></tr></table><br>'; } ?> この書き方間違ってますかね?どうでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問