まず、set sql_mode = 'PIPES_AS_CONCAT' を同一セッション内で実行しておく事によって、Oracle と同様に文字列連結に || を使用できるようになります。 そこで、CSV としての 文字列の仕様を SELECT 構文上でほぼ完成させておいて、クライアントでは一つの列を取得して、改行コードの処理のみを加えてファイルに出力するようにしています。ファイルの出力も、ここでは file_put_contents を使っている為、効率は良くありません。大量のデータを処理したい場合ならば、ファイルへの出力は一行単位で行うべきです。 この方法は十数年前の Oracle でレスポンスが顕著で、天と地ほどの処理時間の差が出ていました。現在では、クライアントの処理能力も上がったので差は無いかもしれませんが、一つのテクニックとして利用可能だと思います。 出来上がった SQL
select ID||','||post_author||','||'"'||replace(post_date,'"','""')||'"'||','||'"'||replace(post_date_gmt,'"','""')||'"'||','||'"'||replace(post_content,'"','""')||'"'||','||'"'||replace(post_title,'"','""')||'"'||','||'"'||replace(post_excerpt,'"','""')||'"'||','||'"'||replace(post_status,'"','""')||'"'||','||'"'||replace(comment_status,'"','""')||'"'||','||'"'||replace(ping_status,'"','""')||'"'||','||'"'||replace(post_password,'"','""')||'"'||','||'"'||replace(post_name,'"','""')||'"'||','||'"'||replace(to_ping,'"','""')||'"'||','||'"'||replace(pinged,'"','""')||'"'||','||'"'||replace(post_modified,'"','""')||'"'||','||'"'||replace(post_modified_gmt,'"','""')||'"'||','||'"'||replace(post_content_filtered,'"','""')||'"'||','||post_parent||','||'"'||replace(guid,'"','""')||'"'||','||menu_order||','||'"'||replace(post_type,'"','""')||'"'||','||'"'||replace(post_mime_type,'"','""')||'"'||','||comment_count from wp_posts
<?php // ************************************** // MIME と キャラクタセットを設定 // ************************************** header( "Content-Type: text/html; Charset=utf-8" ); // ************************************** // キャッシュを無効にするヘッダ // ************************************** header( "pragma: no-cache" ); header( "Expires: Wed, 31 May 2000 14:59:58 GMT" ); header( "Cache-control: no-cache" ); // ************************************** // グローバル変数 // ************************************** $server = 'データベースサーバー'; $db_name = 'データーベース'; $user = 'ユーザー'; $password = 'パスワード'; print "処理開始<br>"; // ************************************** // データベース接続 // ************************************** $connect = @ new mysqli($server, $user, $password, $db_name); if ($connect->connect_error) { die('Connect Error (' . $connect->connect_errno . ') ' . $connect->connect_error); } // ************************************** // クライアントのキャラクタセット // ************************************** $connect->set_charset("cp932"); // セッション(接続)中有効 $query = "set sql_mode = 'PIPES_AS_CONCAT'"; // クエリ $result = $connect->query($query); if ( !$result ) { die('クエリーに誤りがあります : ' . $connect->error ); } // ************************************** // WordPress の投稿データ // ************************************** $query = "select * from wp_posts"; // クエリ $result = $connect->query($query); if ( !$result ) { die('クエリーに誤りがあります : ' . $connect->error ); } // ************************************** // 列名とデータ型を取得 // ************************************** $finfo = $result->fetch_fields(); $name = array(); $type = array(); foreach ($finfo as $val) { $name[] = $val->name; $type[] = $val->type; } // ************************************** // フィールド数 // ************************************** $field_count = $connect->field_count; $csv = ""; for( $i = 0; $i < $field_count; $i++ ) { if ( $i != 0 ) { $csv .= "||','||"; } // 数値型 // TIMESTAMP型(7) を使用している場合は変更が必要です if ( $type[$i] < 10 || $type[$i] == 246 || $type[$i] == 16 ) { $csv .= $name[$i]; } else { $csv .= "'\"'||replace({$name[$i]},'\"','\"\"')||'\"'"; } } $query = "select {$csv} from wp_posts"; // クエリ $result = $connect->query($query); if ( !$result ) { die('クエリーに誤りがあります : ' . $connect->error ); } file_put_contents("query.txt", $query); $file = ""; while ($row = $result->fetch_array(MYSQLI_BOTH)) { // データ内の改行コード $row[0] = str_replace("\r\n", "\\r\\n", $row[0]); $row[0] = str_replace("\r", "\\r", $row[0]); $row[0] = str_replace("\n", "\\n", $row[0]); // insert としての一行を追加 $file .= "{$row[0]}\r\n"; } // ************************************** // ファイルに出力 // ************************************** file_put_contents("easy.csv", $file); ?>
|
【PHP + データベースの最新記事】
- PDO MySQL のバインドを使用した標準的な記述( ロリポップ )
- PHP で MySQLをテストする為のソースコード
- PHP で ODBC 関数を使って MS Access( データベース )にアクセスして結果を JSON 文字列として出力する
- Windows 環境の MySQL + PHP で、ODBC ドライバを使用してデータを取得する場合の3パターン
- PHP : SQLインジェクション対策付きの、MySQL のデータを JSON で返す自家製 API テスト用のテンプレート3パターン
- PHP で 自家製 API を作成して jQuery の簡単なコードで更新処理を行うサンプル
- PHP : WrodPress のデータを insert SQL で保存する処理
- PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP で MySQLi 使用時の データ型定数( MYSQLI_TYPE_ ) の詳細 ( バックアップ用 insert 文を作る為 )
- PHP から MySQL の簡易的なバックアップを取得する( 但し、DBサーバがディスクへの書き込み権限を持っている必要があります )
- PHP : JSON 文字列で定義されたフォーマットを元に、そのフォーマットにセットされた配列を使って insert と update の SQL 文を自動作成。
- PHP : PDO のエラー処理
- PHPのマニュアルにある、SQLインジェクション攻撃の例
- PHP : SQLite3 を PDO の ODBC 経由で読み込み
- PHP : 5.3 / 5.2.11 用共用 sqlite3(日本語テーブル) 読み込み
- PHP : Oracle を処理する COM を使ったクラス