データベース

Ubuntu で最小の Apache、PHP、MySQL 構成を作る

概要

小規模なWebアプリ用の基本構成は、OS標準パッケージ、最小権限のDBユーザー、HTTPS、バックアップ、更新管理を前提にします。

実施例

sudo apt update
sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql
sudo systemctl enable --now apache2 mysql
sudo apachectl configtest

注意点

公開前にファイアウォール、DBの外部公開可否、管理画面のアクセス制限、復元テストまで確認します。

参考: 公式ドキュメント

続きを読む

Perl DBI で INSERT 後のIDを取得する

概要

PerlではDBIの同一ハンドルでINSERTを実行し、使用中のドライバーが提供するlast_insert_idを利用します。SQL文字列の連結は避けます。

実施例

my $sth = $dbh->prepare('INSERT INTO entries (title) VALUES (?)');
$sth->execute($title);
my $id = $dbh->last_insert_id(undef, undef, 'entries', 'id');

注意点

last_insert_idの対応範囲はDBドライバーに依存します。対象DBでテストし、トランザクションの接続を途中で切り替えないでください。

参考: 公式ドキュメント

続きを読む

PHP PDO で INSERT 後のIDを安全に取得する

概要

PDOのプリペアドステートメントで値を渡し、同じ接続でINSERT直後にIDを取得します。複数行INSERTでは返り値の意味をDBドライバーごとに確認します。

実施例

$pdo->beginTransaction();
$stmt = $pdo->prepare('INSERT INTO entries (title) VALUES (:title)');
$stmt->execute(['title' => $title]);
$id = $pdo->lastInsertId();
$pdo->commit();

注意点

例外時はrollbackし、IDをアプリケーション側で推測しないことが重要です。

参考: 公式ドキュメント

続きを読む

phpMyAdmin を安全に限定公開する

概要

phpMyAdminは管理用ツールです。インターネットへ無制限に公開せず、VPN、IP制限、多要素認証などで到達経路を限定します。

実施例

sudo apt update
sudo apt install phpmyadmin
sudo a2enconf phpmyadmin
sudo apachectl configtest
sudo systemctl reload apache2

注意点

rootでの直接ログインを避け、用途ごとに最小権限のDBユーザーを発行してください。

参考: 公式ドキュメント

続きを読む

MySQL で、テーブル名を変更する方法 (ALTER TABLE ... RENAME TO ...)

ALTER TABLE 既存のテーブル名 RENAME TO 新しいテーブル名;

でテーブル名は変更できるのだが、テーブルが1つにとどまらない場合、テキストファイルでまずは1行に1テーブル名のリストを作って、後は秀丸エディタを使って置換する。

たとえば、Drupal でテーブル名にプリフィックス yourname_ を使っていたとして、 本来のテーブル名はそのままで、myname_ のプリフィックスに変えたい場合、秀丸エディタを使って置換するときは、正規表現を有効にして、置換前の文字列を

続きを読む

Movable Type 3.35 で、データベースの文字コード latin1_swedish_ci を utf8_general_ci に変換する方法

MySQL で、latin1_swedish_ci を utf8_general_ci に変換する方法では、latin1_swedish_ci を utf8_general_ci に変換する方法を紹介した。 ここでは、実際に Movable Type 3.35 のデータベースが latin1_swedish_ci だった場合に、utf8_general_ci に変換する SQL 文を以下に挙げておく。データベース移行の際に役にたつこともあるかと思う。

注意点としては、この処理を実行したら、


<strong><font color="red">mt-config.cgi (場所はどの行でもかまわない)に SQLName 1</font>

と1行追加すること。

続きを読む

Linux に、phpMyAdmin 2.10.1 をインストールする方法

簡単にいうと、「scripts/setup.php 実行後、config/config.inc.php を ./ にコピーして、 .htaccess を設定」 すればよい。

※Fedora Core 6 で phpMyAdmin を Fedora Core OS 自体のインストール時、またはパッケージマネージャ(ソフトウェアの追加・削除)からインストールした人は、phpMyAdmin は /usr/share/phpMyAdmin にインストールされ、https://127.0.0.1/phpMyAdmin/ からアクセスできる。ここで、ブラウザから基本認証でユーザー名とパスワードを聞かれてくるから、ユーザー名 root、パスワードなしでアクセスする。

続きを読む

Fedora Core 6 で、パッケージマネージャで追加した phpMyAdmin を使う。

Fedora Core 6 のパッケージマネージャで phpMyAdmin を追加しても、localhost からしかアクセスできないので注意する。以下は必要情報。

  • phpMyAdmin がインストールされるディレクトリ: /usr/share/phpMyAdmin
  • アクセス URL: https://127.0.0.1/phpMyAdmin/
  • パスワード: MySQL のユーザー名とパスワード
  • localhost 以外からアクセスできるようにしたいときは、phpMyAdmin.conf の セクションを以下のように修正する。 order deny,allow # deny from all ←コメントアウト # allow from 127.0.0.1 ←コメントアウト allow from all # ←すべてのマシンからアクセス可能にしてしまえ!
続きを読む

Java で、JDBC を使って MySQL にアクセスする方法

Java で MySQL にアクセスするには、MySQL 用の JDBC のドライバが必要である。このドライバは MySQL のサイトから入手できる (MySQL Connector/J とあるので、安定版または最新バージョンをダウンロードする)。

ダウンロードしたものを解凍すると、mysql-connector-java-x.x.xx-bin.jar というファイルがあるはずなので、これを (Linux の場合は) $JAVA_HOME/jre/lib/ext にコピーする。ここに JAR ファイルを置いておく限り、このドライバ (JAR ファイル) に対する CLASSPATH は特に設定する必要はない。

以下はデータベース中の users テーブルから、name と password という 2つのフィールドを読み出す例である (MySQLJDBCTest.java という名前で保存)。

import java.sql.*; public class MySQLJDBCTest {
public static void main(String[] args) {

    try {
        // ドライバをロード
        Class.forName("org.gjt.mm.mysql.Driver");

        // データベースへ接続
        String url = "jdbc:mysql:///データベース名?&user=ユーザー名&password=パスワード&"
                   + "useUnicode=true&characterEncoding=UTF-8";
        Connection con = DriverManager.getConnection(url);

        // SQL 文を生成
        Statement s = con.createStatement();
        String sql = "SELECT * FROM `users`";

        // クエリーを実行して結果セットを取得
        ResultSet rs = s.executeQuery(sql);

        // 検索された行数分ループ
        while(rs.next()){
            String name     = rs.getString("name");  // ユーザー名
            String password = rs.getString("pass");  // パスワード

            // 表示
System.out.println(name + " / " + password);
        }

        // データベースから切断
        s.close();
        con.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

コンパイル

# javac MySQLJDBCTest.java

実行

# java MySQLJDBCTest
続きを読む
データベース を購読