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

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

ただいまの
回答率

89.20%

WebページからDBのレコードの更新・削除方法について

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 949

mikipro

score 6

 前提・実現したいこと

PHPを用いてmysqlにつなげ、mysqlのテーブルのレコードを削除・更新する機能を作成しています。
データベースではテーブルとして、レンタルCD表を使っています。
webページ側に写しているCDタイトル、アーティスト名、レンタル開始日などが入ったテーブルに削除・更新の2種類のチェックボックスをレコード(行)一つ一つに付け、チェックされたレコードに対して、
WHEREでIDを指定して、それに対して削除・更新を行うことを目標としています。

両方にチェックが付いている場合は削除を優先させます。
勉強不足は重々承知でおそらく間違いだらけで、大変読みづらいコードで申し訳ありませんが、回答してくださる方何卒よろしくお願いいたします。

サンプルプログラムなども教えて頂けるとありがたいです。

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

チェックされたチェックボックスに対して、登録ボタンを押下することにより、そのレコードを削除・更新する予定ですが、押下しても無反応です。

 該当のソースコード

データベース接続//

foreach ($cds as $cd) {

print('<td><input type="checkbox" name="del[]" value="<?=$id?>" style="width:20px;height:20px;"></td>');
print('<td><input type="checkbox" name="change[]" style="width:20px;height:20px;"></td>');
print('<td><input type="text" size="4" maxlength="4" name="cdid"$i"" value='.$cd['CD識別ID'].'></td>');
print('<td><input type="text" size="30" maxlength="50" name="cdtitle"$i"" value='.$cd['タイトル名'].'></td>');
print('<td><input type="text" size="30" maxlength="50" name="artist"$i"" value='.$cd['アーティスト名'].' ></td>');
print('<td><input type="text" size="10" maxlength="20" name="cdgenre"$i"" value='.$cd['ジャンル'].' ></td>');
print('<td><input type="text" size="3" maxlength="2" name="zaiko"$i"" value='.$cd['在庫数'].' ></td>');
print('<td><input type="text" size="3" maxlength="3" name="basyo"$i"" value='.$cd['場所'].' ></td>');
print('<td><input type="text" size="20" maxlength="50" name="gazopass"$i"" value='.$cd['画像パス'].' ></td>');
print('<td><input type="text" size="8" maxlength="8" name="rentstart"$i"" value='.$cd['レンタル開始日'].' ></td>');
print('</tr>');

}

print('</table>');

   for( $i=0; $i < count($del); $i++ ){



            foreach($_POST['del'] as $check)
            $sql = "DELETE test.cd表 = WHERE cdid= $cdid[$i]";
           }

            $stmt = $pdo->prepare($sql);
            $params = array(':cdid');

            $stmt->execute($params);


         }catch (PDOException $e) {
        throw new Exception('失敗', $e->getCode(), $e);
        }



ソースコード

PHP(更新文) changeは更新チェックボックスの属性です。//

if(isset($_POST["change$i"])){

}else{

}

try{
$sql = "UPDATE test.cd表 = SET タイトル名 =:cdtitle アーティスト名 = :artist ジャンル = :cdgenre        在庫数 = :zaiko 場所 = :basyo 画像パス = :gazopass レンタル開始日 = :rentstart WHERE CD識別ID =        :cdid";

$stmt = $pdo -> prepare($sql);
$stmt->bindParam(":cdid", $cdid, PDO::PARAM_STR);
$stmt->bindParam(":cdtitle", $cdtitle, PDO::PARAM_STR);
$stmt->bindParam(":artist", $artist, PDO::PARAM_STR);
$stmt->bindParam(":cdgenre", $cdgenre, PDO::PARAM_STR);
$stmt->bindParam(":zaiko", $cdzaiko, PDO::PARAM_INT);
$stmt->bindParam(":basyo", $cdbasyo, PDO::PARAM_INT);
$stmt->bindParam(":gazopass", $cdgazo, PDO::PARAM_INT);
$stmt->bindParam(":rentstart", $cdrent, PDO::PARAM_STR);

$cdid       = htmlentities( $_POST["cdid".$i.""], ENT_QUOTES, "UTF-8" );
$cdtitle    = htmlentities( $_POST["cdtitle".$i.""], ENT_QUOTES, "UTF-8" );
$artist     = htmlentities( $_POST["artist".$i.""], ENT_QUOTES, "UTF-8" );
$cdgenre    = htmlentities( $_POST["cdgenre".$i.""], ENT_QUOTES, "UTF-8" );
$cdzaiko    = htmlentities( $_POST["zaiko".$i.""], ENT_QUOTES, "UTF-8" );
$cdbasyo    = htmlentities( $_POST["basyo".$i.""], ENT_QUOTES, "UTF-8" );
$cdgazo     = htmlentities( $_POST["gazopass".$i.""], ENT_QUOTES, "UTF-8" );
$cdrent     = htmlentities( $_POST["rentstart".$i.""], ENT_QUOTES, "UTF-8" );

$stmt->execute();

}catch (PDOException $e) {
throw new Exception('失敗', $e->getCode(), $e);
}

 試したこと

色々なサイトの似たプログラムを参考に試しましたがうまくいきませんでした。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/02/06 14:12

    ソースコードがきちんと囲えていません。調整してください。「うまくいかない」「無反応」だけではみている人に状況は正しく伝わりません(質問者の画面を一緒に見ているわけではないので)起きている現象を詳しく追記し、試したこと・調べたことも追記してください。(特に何かエラーが出ていないか、などは解決のためには貴重な情報です)

    キャンセル

  • m.ts10806

    2018/02/06 14:14

    エラー出力しない設定になっているかもしれませんので、開発途中の段階ではソースコードの冒頭に ini_set('display_errors', "On"); を入れておくことをすすめます。

    キャンセル

回答 1

+1

<form>
<input type="checkbox" name="del[]" value="1">1
<input type="checkbox" name="del[]" value="2">2
<input type="checkbox" name="del[]" value="3">3
<input type="submit" value="go">
</form>

<?PHP
$del=filter_input(INPUT_GET,"del",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
if(count($del)>0){
  $sql = "DELETE FROM tbl WHERE cdid in (".implode(",",array_fill(0,count($del),"?")).")";
  print $sql;
  $stmt = $pdo->prepare($sql);
  $stmt->execute($del);
}
?>


※ SQL文にfromがぬけてましたので修正してあります

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/06 17:24

    おかげさまで書いて頂いたサンプルはうまく動かすことができました。
    このプログラムはチェックボックスのvalueにIDの値が初めから入っているようですが、テーブルのIDが表示されているwebページで特定するにはどう記述したら良いでしょうか。

    キャンセル

  • 2018/02/06 17:42

    普通にselect でとってきたデータをforeachで回して
    idに当たる部分をvalueのところに流し込むだけじゃないでしょうか?
    DBと連携しているということはidをいかに拾ってきて
    データに埋め込み、それをどう再利用するかだけですから

    キャンセル

  • 2018/02/08 15:24

    すみません、その後も試していますが上手くいきません。
    value="<?=$id?>"でwebページ上のテキストボックスのID欄のCD識別IDを拾ってこられますか?
    回答者様のサンプルコードを元に処理の部分を変更しました。

    $del=filter_input(INPUT_POST,"del",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
    if(count($del)>0){
    $sql = "DELETE FROM test.cd表 WHERE CD識別ID in (".implode(",",array_fill(0,count($del),"?")).")";
    print $sql;
    $stmt = $pdo->prepare($sql);
    $stmt->execute($del);

    キャンセル

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

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる