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

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

ただいまの
回答率

90.61%

  • PHP

    19820questions

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

  • MySQL

    5690questions

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

  • PDO

    331questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

update文を簡易化

解決済

回答 1

投稿 編集

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

N.Y..

score 21

PHP,Mysql,PDOで住所録を作っています。
insert,delete,selectの関数を作ってあとはupdateで完成です。
しかしフィールドが以下の様になっているのですが
1つ1つにsqlのupdateを指定するのは面倒だし簡潔にしたいので
一気に変更したいものだけupdateできる様にしたいです。
id
name
kana
post_number
address
phone_number
note
register_time
update_time

仕事でphpを使っているのですが、独自フレームワークを使っているため、
まだまだ初心者ですが、改めて一度初心に帰り、phpとmysqlだけで住所録を作って見ようと思いました。
仕事での独自フレイムワークによるupdateは、下記のような感じにしたら処理ができます。

$model = new Model;
$hash = array(
        "field名" => 値,
        "field名" => 値,
        "field名" => 値
        );
$model->update($hash,テーブル名);


この場合fieldが何個あっても、$hashの配列でupdateしたいものだけ入れれば
その部分だけupdateされるので、とても楽に実装できます。
以下が現在の住所録のコードです。

//index.php
<?php
require_once('select.php');
$all = select();
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>住所録</title>
</head>
<body>
    <h1>住所録</h1>
    <!-- insert -->
    <section>
        <form action="insert.php" method="post" accept-charset="utf-8">
            名前<input type="text" name="name"><br>
            カナ<input type="text" name="kana"><br>
            郵便番号<input type="text" name="post_number"><br>
            住所<input type="text" name="address"><br>
            電話番号<input type="text" name="phone_number"><br>
            備考<input type="text" name="note"><br>
            <input type="submit" value="登録">
        </form>        
    </section>

    <!-- select -->
    <section>
        <table>
            <caption>住所</caption>
            <thead>
                <tr>
                    <th>名前</th>
                    <th>カナ</th>
                    <th>郵便番号</th>
                    <th>住所</th>
                    <th>電話番号</th>
                    <th>備考</th>
                </tr>
            </thead>
            <tbody>
            <?php foreach ($all as $a):?>
                <tr>
                    <td><?=$a['name']?></td>
                    <td><?=$a['kana']?></td>
                    <td><?=$a['post_number']?></td>
                    <td><?=$a['address']?></td>
                    <td><?=$a['phone_number']?></td>
                    <td><?=$a['note']?></td>
                    <td>
                      <form action="edit.php" method="post" accept-charset="utf-8">
                        <input type="hidden" name="id" value="<?=$a['id']?>">    
                        <input type="submit" value="変更">  
                      </form>
                    </td>
                    <td>
                      <form action="delete.php" method="post" accept-charset="utf-8">
                        <input type="hidden" name="id" value="<?=$a['id']?>">    
                        <input type="submit" value="削除">  
                      </form>
                    </td>
                </tr>
             <?php endforeach; ?>
            </tbody>
        </table>       
    </section>

</body>
</html>
//select.php
<?php 

//全件取得
function select(){
    require_once('config.php');
    try{
            $pdo->beginTransaction();
            $sql = "select * from info";
            $pre = $pdo->prepare($sql);
            $pre->execute();
            $pdo->commit();
    }catch(PDOException $e){
        echo "selectできませんでした。: ".$e->getMessage();
    }

    $result = $pre->fetchAll();

    return $result;
}


//該当の一件だけ取得
function selectOne($id){
    require_once('config.php');
    try{
        $pdo->beginTransaction();
        $sql = "select * from info where id = :id";
        $pre = $pdo->prepare($sql);
        $pre->bindValue(":id",$id,PDO::PARAM_INT);
        $pre->execute();
        $pdo->commit();
    }catch(PDOException $e){
        "selectOneできませんでした。 : ". $e->getMessage();
        exit;
    }

    $result = $pre->fetch();
    return $result;

}
//insert.php
<?php
if(!empty($_POST['name'])){
    $name = $_POST['name'];
    $kana = $_POST['kana'];
    $post_number = $_POST['post_number'];
    $address = $_POST['address'];
    $phone_number = $_POST['phone_number'];
    $note = $_POST['note'];
    insert($name,$kana,$post_number,$address,$phone_number,$note);
    header("Location:./index.php");
    exit;
}

//insert
function insert($name,$kana,$post_number,$address,$phone_number,$note)
{
    require_once('config.php');
    try{
        $pdo->beginTransaction();
        $sql = "insert into info(name,kana,post_number,address,phone_number,note,register_time,update_time) values (:name,:kana,:post_number,:address,:phone_number,:note,now(),now())";
        $pre = $pdo->prepare($sql);
        $pre->bindValue(":name",$name,PDO::PARAM_STR);
        $pre->bindValue(":kana",$kana,PDO::PARAM_STR);
        $pre->bindValue(":post_number",$post_number,PDO::PARAM_INT);
        $pre->bindValue(":address",$address,PDO::PARAM_STR);
        $pre->bindValue(":phone_number",$phone_number,PDO::PARAM_STR);
        $pre->bindValue(":note",$note,PDO::PARAM_STR);
        $pre->execute();
        $pdo->commit();
    }catch(PDOException $e){
        echo "insertできませんでした。 : ".$e->getMessage();
        exit;
    }
}
//edit.php
<?php
require_once('select.php');
if(!empty($_POST['id'])){
    $id = $_POST['id'];
    $one = selectOne($id);
}else{
    echo "取得できませんでした。";
}
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>変更</title>
</head>
<body>
    <!-- 該当住所一覧 -->
    <section>
        <table>
            <caption><?=$one['name']?>さんの住所</caption>
                <thead>
                    <tr>
                        <th>名前</th>
                        <th>カナ</th>
                        <th>郵便番号</th>
                        <th>住所</th>
                        <th>電話番号</th>
                        <th>備考</th>
                    </tr>
                </thead>
            <tbody>
                    <tr>
                        <td><?=$one['name']?></td>
                        <td><?=$one['kana']?></td>
                        <td><?=$one['post_number']?></td>
                        <td><?=$one['address']?></td>
                        <td><?=$one['phone_number']?></td>
                        <td><?=$one['note']?></td>
                       </tr>
            </tbody>
        </table>
    </section>
    <!-- update form -->
    <section>
        <form action="update.php" method="post" accept-charset="utf-8">
            名前<input type="text" name="name"><br>
            カナ<input type="text" name="kana"><br>
            郵便番号<input type="text" name="post_number"><br>
            住所<input type="text" name="address"><br>
            電話番号<input type="text" name="phone_number"><br>
            備考<input type="text" name="note"><br>
            <input type="hidden" name="id" value="<?php echo $id;?>">    
            <input type="submit" value="変更">  
        </form>
    </section>
</body>
</html>
//delete.php
<?php
if(!empty($_POST['id'])){
    $id = $_POST['id'];
    delete($id);
    header("Location:./index.php");
    exit;
}
function delete($id)
{
    require_once('config.php');
    try{
        $pdo->beginTransaction();
        $sql = "delete from info where id = :id";
        $pre = $pdo->prepare($sql);
        $pre->bindValue(":id",$id,PDO::PARAM_INT);
        $pre->execute();
        $pdo->commit();
    }catch(PDOException $e){
        echo "deleteできませんでした。: ".$e->getMessage();
        exit;
    }
}
//update.php
<?php
if(!empty($_POST['id']) && !empty($_POST['name'])){
    $id = $_POST['id'];
    $name = $_POST['name'];
    update($id,$name);
    header("Location:./index.php");
    exit;
}else{
    header("Location:./index.php");
}
function update($id,$name)
{
    require_once('config.php');
    try{
        $pdo->beginTransaction();
        $sql = "update set name = :name where id = :id";
        $pre = $pdo->prepare($sql);
        $pre->bindValue(":id",$id,PDO::PARAM_INT);
        $pre->bindValue(":name",$name,PDO::PARAM_STR);
        $pre->execute();
        $pdo->commit();
    }catch(PDOException $e){
        echo "updateできませんでした。: ".$e->getMessage();
        exit;
    }
}

今のupdate.phpはnameだけ変更できる様にしています。
しかし、かなり面倒です。
どうしたら良いでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

edit.phpからupdate.phpへは全てのカラムがpostされてくるので、update.phpの先頭で、$idや$nameだけでなく、全てのカラムを変数にとり($kana,$post_number...)、全部更新するupdateを作ればいいのでは?

$sql = "UPDATE SET name = :name, kana = :kana,  post_number = :post_number where id = :id";
で、全部bindValueする。
(名前は消せないみたいですが、備考は消せてもいいと思うので、バリデーションはまとめて先にする感じですかね)

そういうのが嫌だったら、sqlを組み立てるか、update_nameとか、update_kanaとかを作って、必要なだけ実行していくか。

というか、この問題って、selectでも起きませんかね?idで探すか全部かみたいなことしかできませんが、住所録といえば、色々なデータで検索できるのが一般的な気がします(個人用なら全部取って、phpでフィルタしても問題ないっちゃないですが、そういうところを考慮しないなら自分で実装している意味が薄いように思いました)。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/24 21:18

    ご回答ありがとうございます。
    >というか、この問題って、selectでも起きませんかね?...
    今はupdateできる形まで持っていき、ベースができたら修正をくわえながら全てのデータで検索できる形にしようと思っています。バリデーション自体はまだ作っていないので、そこもこれからです。
    なので、最低限のsqlでのデータのやりとりができる形にしようと思っていました。
    ありがとうございます。

    キャンセル

  • 2018/06/24 21:31

    selectをsqlで解決する(計画)なら「sql文を組み立てる」という作業が出てくるのかなと思いました。まあ逆にphp側で検索するなら、updateだけで、sqlをがんばって組みたててもあれなんで、全カラムupdateでいいかなとか考えるのではないかと。ざっくり設計をしたほうがいいのではないかという発言意図です。

    キャンセル

  • 2018/06/24 22:00

    設計ですね。
    確かにそうですね。。。仕事では、上司の人が設計してその通りに作るだけなので
    全然したことなかったです。ありがとうございます。再度考えてみます!

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    19820questions

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

  • MySQL

    5690questions

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

  • PDO

    331questions

    PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。