23542


phpでmysqlデータベースに  
test_id, test_title, test_contents,
test_date.test_imageのデータを保存しています。このデータのid毎に静的htmlに生成して書き出したいです。WordPressやMovable
Typeの静的ファイルの書き出すとかに似ているイメージです。

[![画像の説明をここに入力](https://i.stack.imgur.com/ejhzH.png)](https://i.stack.imgur.com/ejhzH.png)

[![画像の説明をここに入力](https://i.stack.imgur.com/cy1lb.png)](https://i.stack.imgur.com/cy1lb.png)

例えば：上記添付した画像(CMS.png)の書き出すボタンを押すと添付した画像(database.png)から、/Applications/MAMP/htdocs/test/のディレクトリーの下に静的htmlファイにて生成して書き出したいです  
/Applications/MAMP/htdocs/test/1.html  
/Applications/MAMP/htdocs/test/2.html

1.htmlと2.htmlにはデータベースに保存されているtest_id, test_title, test_contents,
test_date.test_imageのデータ内容がそれぞれのhtmlに全部表示されるようにしたいです

これはphpや何かをして書き出すことは可能でしょうか？ ご教授お願い致します。

* * *

@D.T さん  
sync.phpファイルは下記です。

[code]

    <?php
       //require_once("db.php");
       //  取得するIDをURLパラメータから取得
        if (!isset($_GET['test_id'])) {
           echo '{$test_id} param not found. please set param [id] to url params.';
        return;
    }
    $test_id = $_GET['test_id'];
    
    //  データベースに接続
    //$db = new mysqli("localhost", "root", "root", "product");
    $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    if ($db->connect_error) {
        echo 'database connect failed.';
        return;
    }
    if ($db->set_charset('utf8') === false) {
        echo 'database connect failed. can not using utf-8.';
        return;
    }
    
    //  データ取得とhtmlに変換
    $html = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><title>{$id} </title></head><body>";
    //データベース名前はproductです, 今回の想定はいくつからのテーブルあって、その中のtestテーブルです
    $result = $db->query("select * from test where test_id = {$test_id};");    //  本当はidのエスケープを考慮しないといけない　でもselectなのでべつにこのままでも危険な事にはならない。
    $rows = array();
    for ($i=0; ($row=$result->fetch_assoc()) != null; $i++) {    //  一応一致した全行出力する
        if ($i > 0) {
        $html .= '<br />';
    }
        $html .= 'test_id = ' . $row['test_id'] . ', ';
        $html .= 'test_title = ' . $row['test_title'] . ', ';
        $html .= 'test_contents = ' . $row['test_contents'] . ', ';
        $html .= 'test_date = ' . $row['test_date'] . ', ';
        $html .= 'test_image = ' . $row['test_image'];
    }
    $html .= "</body></html>";
    
    //  ファイルに書き出し
    if (file_put_contents("/Applications/MAMP/htdocs/test/{$test_id}.html", $html) === false) {
        echo 'write to file failed.';
    } else {
        echo 'write to file succeed.';
    }
    
[/code]

* * *

@D.Tさんこちらが全ファイルです。  
sync.phpとadmin.phpとdb.phpは同じディレクトリ下にあります。

sync.phpこちらは@D.Tさんのファイル  

[code]

    //  取得するIDを取得
    if (!isset($_GET['test_id']) && !isset($_POST['test_id'])) {
        print '[test_id] param not found. please set param [test_id] to url params or post values.';
        return;
    }
    $id = isset($_GET['test_id'])? $_GET['test_id']:$_POST['test_id'];
    
    //  データベースに接続
    $db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    //$db = new mysqli("localhost", "root", "root", "product");//ここだけを自分の環境に合わせてみました。
    if ($db->connect_error) {
        print 'database connect failed.';
        return;
    }
    if ($db->set_charset('utf8') === false) {
        print 'database connect failed. can not using utf-8.';
        return;
    }
    
    //  データ取得とhtmlに変換
    $html = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\" /><title>{$id}  </title></head><body>";
    $result = $db->query("select * from test where test_id = {$id};");    //  本当 はidのエスケープを考慮しないといけない　でもselectなのでべつにこのままでも危険な事にはならない。
    for ($i=0; ($row=$result->fetch_assoc()) != null; $i++) {    //  一応一致した全行出力する
        if ($i > 0) {
            $html .= '<br />';
        }
        $html .= 'test_id = ' . $row['test_id'] . ', ';
        $html .= 'test_title = ' . $row['test_title'] . ', ';
        $html .= 'test_contents = ' . $row['test_contents'] . ', ';
        $html .= 'test_date = ' . $row['test_date'] . ', ';
        $html .= 'test_image = ' . $row['test_image'];
    }
     $html .= "</body></html>";
    
     //  ファイルに書き出し
    if (file_put_contents("/Applications/MAMP/htdocs/test/{$id}.html", $html) === false) {
        print 'write to file failed.';
     } else {
         print 'write to file succeed.';
    ?>
    
[/code]

admin.php  

[code]

        $query = "SELECT * FROM test ORDER BY test_id DESC";
        $select = mysqli_query($db, $query);
        while($row = mysqli_fetch_assoc($select)){
            $test_id =$row['test_id'];
            $test_title = $row['test_title'];
            $test_contents =$row['test_contents'];
            $test_date =$row['test_date'];
            $test_image =$row['test_image'];
            echo "<tr>";
    ?>
    <?php 
            echo "<td>$test_id</td>";
            echo "<td>$test_title</td>";
            echo "<td>$test_contents</td>";
            echo "<td>$test_date</td>";
            echo "<td>$test_image</td>";
            echo "<td><a href=''>編集</td>";
            echo "<td><a rel=''>削除</td>";
            echo "<td><form action='sync.php' method='post'><div class='form-group'>
                    <input type='hidden' name='test_id' value='".$test_id."'>
                    <input type='submit' class='btn' name='submit' value='書き出す'>
                   </div></form></td>";
            echo "</tr>";
    
[/code]

}

db.php

[code]

    <?php
        $db['db_host'] = "localhost";
        $db['db_user'] = "root";
        $db['db_pass'] = "root";
        $db['db_name'] = "product";
    
        foreach($db as $key => $value){
            define(strtoupper($key), $value);
    
       }
       $db = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);
           mysqli_set_charset($db,"utf8");
      ?>
    
[/code]


CC BY-SA 3.0
2016-03-28T02:29:00.323
23525
2016-04-01T02:52:27.217
2016-04-01T02:52:27.217
30
9013
question
php mysql
phpでmysqlにデータを保存しているデータをid毎に静的フアィルhtmlに生成して書き出したいです


お待たせしました  
sync.phpの中身を下にまるまる書き換えて下さい。  
また、今回はエスケープを行うなどしてそのまま実用できるようにしました。

[code]

    <?php
    //  取得するIDを取得（GET or POST name is test_id type:number）
    if (!isset($_GET['test_id']) && !isset($_POST['test_id'])) {
        print '[test_id] param not found. please set [test_id] param to url params or post values.';
        return;
    }
    $id = isset($_GET['test_id'])? $_GET['test_id']:$_POST['test_id'];
    
    //  パラメータが10進数の数値かチェック
    if (!ctype_digit($id) || strlen($id)==0) {
        print '[test_id] is invalid param type. need number.';
        return;
    }
    
    //  データベースに接続（現存のコードを利用）
    require_once('db.php');
    
    //  データベースからデータ取得
    $result = mysqli_query($db, "select * from test where test_id={$id} order by test_id desc;");
    
    //  データ取得と同時にhtmlに変換
    $html = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\" /><title>{$id}</title></head><body><table><tbody>";
    $found = false;
    for ($i=0; ($row=mysqli_fetch_assoc($result)) != null; $i++) {   //  一致したレコード分だけ繰り返す
        $found = true;
    
        //  ヘッダの出力
        if ($i == 0) {
            $html .= '<tr>';
            foreach ($row as $name => $value) {
                $html .= '<th>' . htmlspecialchars($name) . '</th>';
            }
            $html .= '</tr>';
        }
    
        //  値の出力
        $html .= '<tr>';
        foreach ($row as $name => $value) {
            $html .= '<td>' . htmlspecialchars(str_replace("\n", "<br />", $value)) . '</td>';
        }
        $html .= '</tr>';
    }
    if (!$found) {
        $html .= '<tr><td>１つも一致するデータはありません。</td></tr>';
    }
    $html .= "</tbody></table></body></html>";
    
    //  ファイルに書き出し
    if (file_put_contents("/Applications/MAMP/htdocs/test/{$id}.html", $html) === false) {
        print 'write to file failed.';
    } else {
        print $html;
    }
    
[/code]

?>


CC BY-SA 3.0
2016-03-28T09:22:27.290
23542
2016-03-28T09:29:06.753
2016-03-28T09:29:06.753
10346
10346
23525
answer


ごちゃごちゃなりましたが、これは  
htmlの書き出しはできたけど、他のIDだとできないものがあるにたいしての回答です。

[code]

    echo "<td><form action='sync.php' method='post'><div class='form-group'>
                <input type='hidden' name='test_id' value='".$test_id."'>
                <input type='submit' class='btn' name='submit' value='書き出す'>
               </div></form></td>";
    
[/code]

試しに↓に書き換えてください。

[code]

    echo "<td><form action='sync.php' method='post'>
                <input type='hidden' name='test_id' value='{$test_id}'>
                <input type='submit' class='btn' name='submit' value='書き出す'>
               </form></td>";
    
[/code]

やっぱりこっちに書き換えて下さい  
inputを閉じていないのが原因…！？？？

[code]

    echo "<td><form action='sync.php' method='post'><div class='form-group'>
                <input type='hidden' name='test_id' value='{$test_id}' />
                <input type='submit' class='btn' name='submit' value='書き出す' />
               </div></form></td>";
    
[/code]


CC BY-SA 3.0
2016-03-28T11:15:13.583
23548
2016-03-28T11:15:13.583
10346
23525
answer