chatGPT3.5を先行的に使っている。

2023.09.21

Logging

おはようございます、chatGPT3.5を先行的に使っている。みんなが使えるわけではないようだけど、恐らくヘビーユーザーなのでアルファ版の先行に選ばれました。便利ですよねぇとは言わないけど困ったときに多少なりとも助けになることは間違いないです。

そうそうMysqlに複数の値を比較してある値を抽出するというメソッド?があることを最近知りました。簡単に言えば三項演算子みたいなものかなぁ・・・違うなぁ。ここらへんをchatGPT3.5に解説してもらいます。

COALESCE 関数は、SQLで複数の値を比較し、最初に NULL 以外の値が見つかった場合にそれを返す関数です。以下は COALESCE 関数の使用例です

SELECT COALESCE(列1, 列2, 列3, 列4) AS 選択された列
FROM テーブル名;

このクエリは、列1から列4までの値を比較し、最初に NULL 以外の値が見つかった場合にそれを 選択された列 として返します。

例えば、価格を比較して最初に NULL 以外の価格を選択するSQLクエリは次のようになります:

SELECT COALESCE(price1, price2) AS 選択された価格
FROM products;

このクエリは、products テーブル内の各行に対して、price1price2 を比較し、最初に NULL 以外の価格を 選択された価格 として返します。

COALESCE 関数は、複数の値から最初の非 NULL 値を取得するために便利です。

タグ

as, COALESCE, FROM products, MYSQL, null, price1, price2, products, SELECT COALESCE, SQL, SQLクエリ, アルファ版, クエリ, ヘビーユーザー, メソッド, 先行, , 列 FROM, 多少なり, 関数,

1万件のCSVを読み込みテーブルに保存する雛形コード #PHPCode

2022.09.08

Logging

おはようございます、徐々に秋ぽっい日差しになってきましたね(まだ暑いけども😌)。

今日は、1万件のCSVを読み込みテーブルに保存する雛形コードを昨日、ちょちょっと書きましたので記載します。ファイルをダウンロードして使いたい方はGithubのリンクを下に貼っときますので、ご使用頂けたらと思います。尚、テーブルなどはCSVを参考にご自身で構えてください。

※動作環境はPHP8系です、なのでPHP7系では一部エラーが出ます。fgetcsv…nullを0へ変更。

Githubのリンクはこちら

Qiitaの方に記載しようかどうしようか、迷ったのですが第一弾目がアクセス数がそこそこ伸びたのでこれ以上、注目されるのは嫌なのでブログの方に記載しました。1万件のCSVを簡単に読み込ませる方法はPHPコードを書くのではなく、SQLのコマンドで実行した方が実は早いですけど・・・。

有言実行

早いですけど、その場合、CSVがちゃんとしたファイルではないと上手くテーブルに保存されない場合や、そもそもコマンドラインで操作出来ない場合もあったりしてPHPコードなどで制御しないと駄目な事もあります。そんな時に、このコードをサンプルとして使って頂ければ良いなと思い作りました。

1万件のCSVを読み込ませるPHPコード雛形。

そんなにコードを書かなくてもまぁ動くんですよ。ちなみにソースコードには、あまりコメントを書いていないですが、プログラマーなら大体の人が理解できるレベルかと思います。

<?php
//ini_set("display_errors","On");
session_start();
require "db_config.php";

//読み込みCSVファイル名セット
class csv
{
    /**
     * @param string $filename
     * @param int $cnt
     * @return Object
     */
    public function ini_csv($filename = "", $cnt = 0)
    {
        return new csv_read($filename, $cnt);
    }
}

//CSVデータを読み込ます
class csv_read
{
    var $max = 10000;
    var $cnt = 0;
    var $handle = null;
    /**
     * @param string $filename
     * @param int $cnt
     */
    public function __construct($filename = "", $cnt = 0)
    {
        $this->cnt = $cnt;
        $this->handle =  fopen($filename, "r");
        $_SESSION["offset"] ? fseek($this->handle, $_SESSION["offset"]) : $this->handle;
    }
    /**
     * @param int $header_skip
     * @return Object
     */
    public function reader($header_skip = 0)
    {
        if ($this->handle !== FALSE) {
            $response = null;
            $data = fgetcsv($this->handle, null, ",");
            if (!$header_skip || $_SESSION["offset"]) {
                if ($data !== FALSE) {
                    $_SESSION["offset"] = ftell($this->handle);
                    $response["data"] = $data;
                    $response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
                    $flag = true;
                } else {
                    $_SESSION["offset"] = null;
                    $flag = false;
                }
            } else {
                $_SESSION["offset"] = ftell($this->handle);
                $response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
                $flag = false;
            }
        } else {
            $_SESSION["offset"] = null;
            $flag = false;
        }
        return new table_save($flag, $response);
    }
}

//tableにCSVデータを保存
class table_save
{
    var $flag = false;
    var $result = null;
    /**
     * @param boolean $flag
     * @param array  $response
     * @return void
     */
    public function __construct($flag, $response)
    {
        $this->flag = $flag;
        $this->result = $response;
        $this->column_name = "name,,...";
    }
    /**
     * @param string  $column_name
     * @return void
     */
    public function tbl_save($column_name = "")
    {
        if ($this->flag) {
            $column = $column_name ? $column_name : $this->column_name;
            $is_column = explode(",", $column);
            foreach ($is_column as $key => $val) {
                $is_value[$val] = $this->result["data"][$key];
            }
            try {
                $pdo = new PDO(DSN, USERNAME, PASSWORD);
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $sql = (function ($is_column) {
                    $INSERTFIRST = null;
                    $INSERTLAST = null;
                    foreach ($is_column as $key => $val) {
                        $INSERTFIRST[] = "$val";
                        $INSERTLAST[] = ":$val";
                    }
                    $INSERTSQL = "(" . implode(",", $INSERTFIRST) . ")values(" . implode(",", $INSERTLAST) . ")";
                    $UPDATESQL = null;
                    foreach ($is_column as $key => $val) {
                        $UPDATESQL[] = "$val = :$val";
                    }
                    return "INSERT INTO " . TABLENAME . $INSERTSQL . " ON DUPLICATE KEY UPDATE " . implode(",", $UPDATESQL) . ";";
                })($is_column);

                $stmt = $pdo->prepare($sql);
                foreach ($is_value as $key => &$value) {
                    $is_type = ($key === "test3" || $key === "test13") ? PDO::PARAM_INT : PDO::PARAM_STR;
                    $stmt->bindValue(":$key", $value, $is_type);
                }
                $this->result["sql"] = $stmt->execute();
            } catch (\Throwable $th) {
                //throw $th;
                $this->result = null;
                print $th->getMessage();
            }
        }
        print json_encode($this->result);
    }
}

//RUN...POST DATA
if (isset($_POST["csrf_token"])  && d_xss($_POST["csrf_token"]) === $_SESSION['csrf_token']) {

    $_SESSION["offset"] = (int)d_xss($_POST["reset_flag"]) === 1 ? null : d_xss($_SESSION["offset"]);
    $filename = d_xss($_POST["filename"]);
    $cnt = (int)d_xss($_POST["cnt"]);

    $column_name = "test1,test2,test3,test4,test5,test6,test7,test8,test9,test10,test11,test12,test13,test14,test15";
    $header_skip = 1;

    $csv = new csv();
    $csv->ini_csv($filename, $cnt)->reader($header_skip)->tbl_save($column_name);
    $csv = null;
} else {
    print "";
}
function d_xss($data){
    $data = strip_tags($data);
    $data = htmlspecialchars($data,ENT_QUOTES);
    return $data;
}
<?php
 // ログインした状態と同等にするためセッションを開始します
 session_start();
 // 暗号学的的に安全なランダムなバイナリを生成し、それを16進数に変換することでASCII文字列に変換します
  $toke_byte = openssl_random_pseudo_bytes(16);
  $csrf_token = bin2hex($toke_byte);
  // 生成したトークンをセッションに保存します
  $_SESSION['csrf_token'] = $csrf_token;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="Description" content="Enter your description here"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<title>CSV</title>
</head>
<body>
    <input type="hidden" name="csrf_token" value="<?=$csrf_token?>">
    <span class="h3" id="cnt"></span><br><br>
    <span class="h4" id="read_csv"></span><br><br>
    <span class="h4" id="debug"></span><br><br>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
<script>
    window.onload = function(){
        read_csv(0,1);
    };
    function read_csv(cnt,reset_flag){
        try{
            $.ajax({
            type: "post",
            url: "./assets/php/class_csv.php",
            async: false,
            data: {csrf_token:document.getElementsByName("csrf_token")[0].value,reset_flag:reset_flag,filename:"dummy.csv",cnt:cnt},
            dataType: "json",
            success: function (response) {
                    if(response){
                        cnt = response.cnt;
                        document.getElementById("cnt").innerText = cnt;
                        if(response.data){
                            document.getElementById("read_csv").innerText = response.data[0] + response.sql;
                            document.getElementById("debug").innerText = cnt ===21?response.data:document.getElementById("debug").innerText;
                        }
                        setTimeout(function(){read_csv(cnt)},0);
                    }
                }
            });
        }catch(e){
            console.warn(e);
            read_csv(cnt);
        }
    }
</script>
</body>
</html>

タグ

0, , 7, 8, CSV, fgetcsv, github, null, php, PHPCODE, qiita, SQL, アクセス, エラー, コード, こちら, コマンド, これ, ご使用, ご自身, ダウンロード, ちょ, テーブル, ファイル, ブログ, リンク, , 一部, , , 今日, 保存, 動作, 参考, 変更, 実行, , 方法, 日差し, 昨日, 有言実行, 注目, 環境, , 簡単, 記載, 雛形,

phpでイマドキDB接続の仕方なの?

2019.07.20

Logging

実行していないので上手く動いているかは
未知数ですが、コードの書き方はイマドキの書き方に
しています。PHP公式ではこう書かれています。

プリペアドステートメントのパラメータに変数をバインドすると・・・。
i 対応する変数の型は integer です。
d 対応する変数の型は double です。
s 対応する変数の型は string です。
b 対応する変数の型は blob で、複数のパケットに分割して送信されます。

<?php
$servername = "hostname";
$dbname ="dbname";
$dbusername = "root";
$dbpassword = "pass";
if($conn = mysqli_connect($servername,$dbusername,$dbpassword,$dbname)){
    $sql = "select username from mastertbl where uid =? and password = ?";
    $stmt = mysqli_stmt_init($conn);
    if(mysqli_stmt_prepare($stmt,$sql)){
        mysqli_stmt_bind_param($stmt,"ss",$uid,password_hash($password,PASSWORD_DEFAULT));
        mysqli_stmt_execute($stmt);
        mysqli_stmt_store_result($stmt);
        if($cnt=mysqli_stmt_num_rows($stmt)){
            $result = mysqli_stmt_get_result($stmt);
            for($i=0;$i<$cnt;$i++){
                $row = mysqli_fetch_assoc($result);
            }
        }
    }
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}

タグ

blob, conn, connect, db, dbname, dbpassword, dbusername, double, hostname, if, Integer, lt, mysqli, pass, php, root, select, servername, SQL, string, user, イマドキ, コード, バインド, パケット, パラメータ, プリペアドステートメント, 仕方, 公式, 分割, , 変数, 実行, 対応, 接続, 書き方, 未知数, 複数, 送信,

SQLの無知さ加減。

2019.07.13

Logging

select id,namae,furigana
from passport
where id = ANY(select id from travellist where namae like "田中%");

自分のSQLに関しての無知さ加減は半端ないと思います。
メンターがいないので自分で調べないといけないのです、
こんな構文すら知らなかったのは痛い。
サブクエリの存在は前から知っていたのですが、ANYを前に
付けると、複数のHITにも対応できることを知った。
ちなみに更新作業や削除作業の際に
主キーを検索対象に入れていないと処理がもっさりします。
そう考えると一番最初に働いていたIT会社のSQLは
今思うと初歩的な構文が多かったのかもしれない。
何気ない事なのかもしれないけど
動いていた構文に追加対応とか行う際にもっとその構文を
解析すれば良かったなと思います。
やはりSQLで行ったほうが早いことって結構あります。
 

タグ

ANY, from, furigana, HIT, ID, IT, like, namae, passport, select, SQL, travellist, where, キー, クエリ, こと, サブ, はり, メンター, , , 会社, 作業, 処理, 削除, , 加減, 半端, 存在, 対応, 対象, 更新, 最初, 検索, 構文, 無知, 田中, 自分, 複数, 解析, 追加, ,

MYSQLのif文みたいなものを使用する機会が物凄く少ない気がする。

2019.05.18

Logging

### mysql case = if文みたいなもの
```sql
select namae,tensu
case when (tensu >= 75 and tensu <= 80)  then '可'
when (tensu >= 25 and tensu < 75)  then '否' else '???' end as kahi
from tbl;
table name tbl
|namae|tensu|
|---|---|
|hirose|77|
|non|76|
|arimura|78|
|aragaki|80|

mysql case = if文みたいなものを使用する機会が物凄く少ない気がする。
プログラム言語って使用しなければ抜け落ちるです。
自分の場合、たぶん長期的な記憶に障害があって抜け落ちるですw🙄。
メモしたことすら忘れてしまう…これは痛い老害?。

でも、好きな事は大体覚えていますね、概念的な事を覚えていたら大丈夫です😌。
 
 

タグ

```, 25, 39, 75, 76, 77, 78, 80, and, aragaki, arimura, as, case, else, end, from, gt, hirose, if, kahi, lt, MYSQL, namae, name, non, select, SQL, TABLE, tbl, tensu, then, when, こと, プログラム, メモ, もの, 使用, , , 場合, , 機会, , 自分, 言語, 記憶, 障害,

MYSQL8以降ウィンドウ関数対応=>ランキング。

2019.05.06

Logging

MYSQLでもランキング機能(rank())が使えるようになったとさ。日本国内のレンタルサーバーは最新の技術というより
一歩遅れた技術で運営している理由はリスクを取らないためにそうしているのだろうなとヒシヒシと感じます。

### support mysql>8.0.2 ウィンドウ関数
```sql
select id,namae, rank() over(order by code_total asc)as code_rank from code_data;
```
### code_data
|id|namae|code_total|
|---|---|---|
|1|kaonashi|15|
|2|mononoke|75|
|3|asitaka|52|
|4|san|87|
|5|theta|99|

タグ

```, ---, , 15, 2, , 4, 5, 52, 75, 8, 8.0.2, 87, 99, as, asc, asitaka, BY, Code, data, from, gt, ID, kaonashi, mononoke, MYSQL, namae, order, over, rank, san, select, SQL, support, theta, total, ウィンドウ, サーバー, ため, ランキング, リスク, レンタル, , 国内, 対応, 技術, 日本, 最新, 機能, 理由, 運営, 関数,

大量データをDBに高速にインストールする方法。

2019.04.13

Logging

LOAD DATA INFILE 'data.csv' INTO TABLE tblname FIELDS TERMINATED BY ',' LINES TERMINATED BY 'rn';

この一行の命令で…かなり高速にインストールできます。
インストールする前に、ファイルのチェックを行い整合性などが
正しければ一括にインストールするという具合がよろしいかと思われます。
 
https://www.youtube.com/watch?v=rrvL2-jqZ-4
ドロップシッピングの大量データを入れ込むときに役立ちそうだ・・・。
自分あまりSQLの事を知らないですね。そろそろSQLの知識も増やそうと
思っています。
 

タグ

-jqZ-, 2, 4, BY, com, CSV, data, db, FIELDS, INFILE, INTO, LINES, load, , nbsp, rrvL, SQL, TABLE, tblname, TERMINATED, youtube, インストール, かなり, シッピング, チェック, データ, とき, ドロップ, ファイル, 一括, 一行, , 具合, , 命令, 大量, 整合性, 方法, 知識, 自分, 高速,

PHPでバインドするこれでSQLの脆弱性が!?

2019.02.23

Logging

上記の画像では脆弱性がある。
PHPでバインドするこれでSQLの脆弱性が解決してくれる?
こういう記述すると良さげ。
おまけでSQLデバッグ方法を書いとります

<?php
$sql =<<<SQL
select * from demo where id = :id and namae = :hoge;
SQL;
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$id = 123;
$hoge = "hoge";
$sth = $dbh->prepare($sql);
$sth->bindValue(':id', $id, PDO::PARAM_INT);
$sth->bindValue(':hoge', $hoge, PDO::PARAM_STR);
$sth->execute();

タグ

$dbh-&gt, dbh, dbname, execute, hoge, host, localhost, lt, MYSQL, PARAM_INT, PARAM_STR, PDO, php, prepare, SQL, SQL select, sth, test,

文字の置き換えはコマンドラインから

2017.09.19

Logging


文字の置き換えは「sed」というコマンドを使うことで
文字の置き換えは可能ですが、文字の置き換えを行なった後、
ファイルの保存もしくは上書き保存を行わないと意味が無いので
注意が必要になります。
例えばリナックス系のサーバで文字を置きたい場合、このような感じに
記述すると文字の置き換えが可能となります。

sed -i -e "s/utf8mb4/utf8/g" mysql.sql

結構、大きめサイズのテキスト形式のファイルも難なく
置き換えが可能です、ちなみにWindowsでも同じようにコマンドから
文字の置き換えすることは可能ですが少々面倒なので、リナックスでの
置き換えを自分は推奨します。
ちなみに文字コードがUTF8ではない場合は
文字コードをiconvでUTF8に置き換え後、文字列の置き換えを
すれば良いのでとても楽です。


ちなみにこちらの動画は悪い例↑
?

タグ

-i, 4, 8, e-, iconv, mb, MYSQL, quot, sed, SQL, UTF-, Windows, コード, こちら, こと, コマンド, サーバ, サイズ, テキスト, ファイル, ライン, リナックス, 上書き, , 保存, 動画, 可能, 場合, 大きめ, 形式, , 必要, 意味, 推奨, 文字, 文字列, 注意, 自分, 記述, 面倒,

ビックデータと機械学習仲良しこよし・・・か!!

2016.12.13

Logging


機械学習の精度を上げるには大量のデータを瞬時に捌ける
サーバが必要になるという事を気付いた・・・。
そういやそうだ。学習すればするほど過去のデータも
見直さないといけなくなる。
Gさんは良い商売しているなと機械学習やビックデータを処理する
環境を無料で与えているけど、よくよく見ると制限があり
それ以降は有料になっている。
有料だけど月々の費用はかなり安いところが
ほんと、凄いところです。
でっ!!
ビッククエリーのPHPバージョンの使い方ですけど
Gさんのライブラリを読み込んでSQLを発行して返却値を
もらうだけ・・・凄く簡単。
詳しくはこちら
まずはライブラリ読み込みしてオブジェクトをインスタンスする。

次にSQLを発行する。

最後に発行した情報の返却値を抽出する。

じゃ機械学習はどうしたら良いのか・・・。
勉強中です、GさんがAPI系版出しているだけど、お高いです?。
https://cloud.google.com/prediction/docs?hl=ja
そちらは比較的に優しい、優しいと言っても難しいですけど・・・。
Gさんがオープンソースで提供されているサービスに比べたら優しいという事です。
https://www.tensorflow.org/
機械学習をちょちょいと使えるようになればカッコイイですけどね。
自分には程遠い感じがします、千里の道も一歩からというけれど・・・
今のところ、簡単な機械学習ならっていう感じでニュートラルな機械学習は
難しいですね_(:3」∠)_。
http://qiita.com/tags/TensorFlow

タグ

API系版, Gさん, PHPバージョン, SQL, インスタンス, オブジェクト, サーバ, ビッククエリー, ビックデータ, ライブラリ, 使い方, 千里, 月々, 有料, 機械学習, 機械学習仲良しこよし, 瞬時, 程遠い感じ, 精度, 返却値,

CSVのデータ数万行とかをVBAでデータを加工するよりも

2016.05.30

Logging


CSVのデータ数万行とかをVBAでデータを加工するよりもPowerShellから加工するべし、、
まず、いま勤めてる会社、WEB会社なんですが
WEBシステムに使うデータの加工をする機会が結構あったりします。
時には数万行とかのデータを取り込んで
加工することがあるですね。
今まで数万行のデータは分割して
処理をしていたのですが、PowerShellで取り込んで処理する
方法があるみたいなので、これからはソチラで
加工しようかなとか思っています。
ちなみにExcelやPHPだとMバイトのデータを
扱うと処理が落ちる場合が結構あります。
とくにPHPだとファイルをアップロードする場合や
扱えるメモリの設定により処理落ちする事は
多々あります。
なので、PHP側でどうしても
処理を行いたい場合は事前にファイルを分割するか、
処理する時点でshellなどを使いコマンドラインで
ファイルを分割するかなどの方法を
取らないといけないのです。
ファイルをアップロードする時点で
処理を行うか前もって処理を行なったデータを
SQLで読み込むかなど、いろいろな方法があります。
 

タグ

CSV, Excel, Mバイト, php, powershell, SQL, VBA, WEBシステム, コマンドライン, ソチラ, データ, データ数万行, ファイル, メモリ, 事前, 処理, 処理落ちする事, 加工, 方法, 時点,

SQL実践入門って本がある。

2016.03.28

Logging

SQL実践入門って本がある。ちょっと値段が高いので立ち読みで済ましたけど、今後お金があるときに購入しようと思っている本です。ちなみに自分はSQLの事は全然って言ってほど無知なのです。この本をとって見てみて「あ?こんな事が出来るだ」って思ってしまったわけです。
おそらく知っている人のレベルでは触り程度の話かもしれませんが、知らない人には勉強になる本です。おそらく入門書をみて、こんなのインターネット上でググればあるなと思う方は、こちらのSQL実践入門がオススメです。この頃、大体の事はググればあるという時代になってきているのですが、ガリガリコードが書けるようになっていると何かと困ることはないですねって、、、、思うわけですね。
もっと実力がほしい今日このごろ。

Learn SQL In 60 Minutes

タグ

SQL, インターネット, おすすめ, お金, コード, こちら, こと, とき, レベル, わけ, , , 今後, 今日このごろ, , 値段, 入門, 入門書, 勉強, 大体, 実力, 実践, , 時代, , 無知, 立ち読み, 自分, , 購入, ,

phpにはstdclassってものが有るだってさ。おそらくjavaにはないよ。

2015.08.25

Logging


phpにはstdclassってものが有る。使い方は下記の通り

$hoge = new stdclass();
$hoge->name = "(~.~)";
echo $hoge->name;

このstdclassってのは普通ならクラスの記述を書かないといけないのだけど、これはPHPの依存のクラスを使用して記述することが出来るらしい。スタンドクラス・・・、ジョジョかよと思いたくなるPHP記述ですね(((((;゚Д゚)))))。スコープとかなら、PHP以外の言語でも有ると思うけど、stdclass(スタンドクラス)は、最近、はじめて知りました。他にもつい最近、知ったPHPの記述方法とかもあります、他の言語でも同じような記述ができるか試してみたいです。この頃、全然 Javaとか触っていないしC系の言語も触っていないのが現状ですと言ってもそちらの言語ができるのかと言えば、う?んと言う回答ですけどね。あとSQLも勉強しなくちゃなと思うこの頃です。

タグ

, AM, echo, hoge, java, name, new stdclass, php, PHP以外, SQL, stdclass, ジョジョ, スコープ, スタンドクラス, 下記, 使い方, 依存, 現状, 言語, 記述, 記述方法, 通り,

WinSCPというソフトが有るのだけど。

2015.07.16

Logging


WinSCPというソフトが有るのだけど自分はこのソフト、FTPのソフトだと思い込んでいたけど・・。SCPという名前の通りSCP(転送プロトコル)機能がついてたりする。面倒くさい事をさらっとやってくれるフリーソフトなわけです。そうとは知らず今までインストールすることが無かったんですけど、この度、インストールしました。ちなみに何が良いかというとFTPサービスをサーバ環境へインストールしなくてもファイルのアップロードが可能だということです。FTPがインストールされていない環境だととても重宝しそうな気がします。
ダウンロードはこちらから、WinSCP
メモがてらにもう一つ、大量のsqlデータを一括でインポートしなくてはならなくなり、昨日、調べていたらこのようなコマンドで解決することがわかりました。まず、Linuxサーバでかつポート22番が開いている事が前提です。windowsですとTera Termでサーバにログインし下記のコマンドを入力します。

mysql -u ユーザー名 -D データベース名 -p
//エンター後、Passwordの入力を行ってください。
次にMYSQLに切り替わったら、下記のコマンド入力してインポートを行います。この時の注意点ですがエラーなどが出る場合はエクスポートしたsqlファイルの最終行あたりに記入されているデータベース名やユーザー名が移行する側の名前になっているかが大事になります。なっていない場合、修正をかけ再処理を行うとインポートが行えるはずです。
尚、サーバ上に事前にsqlファイルをアップロードして置いてから処理を行ってください。
USE データベース名(インポートしたい)
SOURCE 階層を含むファイル名(/xxxx/xxxx.sql)

            

タグ

22, FTP, Linux, My, SCP, SQL, Tera, Term, Windows, WinSCP, アップロード, インストール, インポート, こちら, こと, コマンド, サーバ, サービス, ソフト, ダウンロード, データ, ファイル, フリー, プロトコル, ポート, メモ, もう一つ, ログイン, 一括, 下記, , , 入力, 前提, 可能, 名前, 大量, , 昨日, 機能, , 環境, 自分, 解決, 転送, 通り, 重宝,

Accessのさんぷるコードができましたので(´Д`)貼っときます。

2014.08.21

Logging

突貫工事で作ったのでバグは多少あると思いますが{例えばsql インジェクション対策とか。}、Accessのsampleコードができましたので貼っときます。なお、これで何が出来るかって言えばDBの修正、追加、削除といった基本的な動きをします{挙動不審ぎみ嘘!?}。若干、ソースコードを弄くれば使い回しが出来るようにしております。飯くったり他のことをしながらもガリガリとコードを書きました。ちなみにAccessのViewerをマイクロソフトからダウンロードすると動作すると思います。ファイルは下記からダウンロードください。 追記:暇な時に改良していきますので( ゚д゚)ノ ヨロシクとコメントも暇があれば書いときます。そして無駄なコードがありますが、それも軽量していくつもりです(`・ω・´)。ちなみにいまはDBを空にすると落ちますので・・・・(直しました。)。?samplezip358.zip?[https://zip358.com/tool/samplezip358.zip][08/21 11:26]

Option Compare Database
Public db_x As Long
Public max As Variant
Function sel_all(tablename As Variant, tal_valname As Variant) As Variant
    Dim x As Long
    Dim y As Long
    Dim sql As String
    Dim RS As DAO.Recordset
    Dim db As DAO.Database
    Dim hoge(999, 999) As Variant
    Dim val_n As Variant
    Dim val As Variant
    Set db = CurrentDb
    sql = "SELECT * FROM " & tablename & " ORDER BY ID ASC;"
    MsgBox sql
    Set RS = db.OpenRecordset(sql)
    Do Until RS.EOF
        For y = 0 To UBound(tal_valname)
            hoge(x, y) = RS.Fields(tal_valname(y))
        Next y
        RS.MoveNext
        x = x + 1
    Loop
    Set db = CurrentDb
    sql = "SELECT MAX(ID) as maxs  FROM " & tablename & ";"
    MsgBox sql
    Set RS = db.OpenRecordset(sql)
    max = RS.Fields("maxs")
    db_x = x - 1
    Set db = Nothing
    sel_all = hoge
End Function
Function up_in(chk As Boolean, tablename As Variant, tal_valname As Variant, tal_val As Variant, ID As Long) As Variant
    Dim sql As String
    Dim RS As DAO.Recordset
    Dim db As DAO.Database
    Dim hoge_valname As String
    Dim hoge_val As String
    Dim hoge As Variant
    If chk = True Then
        For i = 0 To UBound(tal_valname)
            hoge_valname = hoge_valname & tal_valname(i) & ", "
        Next i
        hoge_val = sql_str(tal_val, "", "", True)
        sql = "INSERT INTO " & tablename & " (" & Left(hoge_valname, Len(hoge_valname) - 2) & ")VALUES (" & hoge_val & ");"
    Else
        hoge_valn_val = sql_str("", tal_valname, tal_val, False)
        sql = "Update " & tablename & " Set " & hoge_valn_val & " WHERE ID = " & ID & ";"
    End If
    MsgBox sql
    Set db = CurrentDb
    db.Execute (sql)
    Set db = Nothing
    up_in = True
End Function
Function del(tablename As Variant, tal_valname As Variant, tal_val As Variant) As Variant
    Dim sql As String
    Dim RS As DAO.Recordset
    Dim db As DAO.Database
    Dim hoge As Variant
    sql = "DELETE FROM " & tablename & " WHERE " & tal_valname & " = " & tal_val & ";"
    MsgBox sql
    Set db = CurrentDb
    db.Execute (sql)
    Set db = Nothing
    del = True
End Function
Function sql_str(hoge As Variant, tal_valname As Variant, tal_val As Variant, chk As Boolean) As Variant
    Dim i As Long
    Dim hoge_str As Variant
    If chk = True Then
        For i = 0 To UBound(hoge)
            If IsNumeric(hoge(i)) Then
                hoge_str = hoge_str & hoge(i) & ", "
            Else
                hoge_str = hoge_str & "'" & hoge(i) & "', "
            End If
        Next i
    Else
        For i = 0 To UBound(tal_valname)
            If IsNumeric(tal_val(i)) Then
                hoge_str = hoge_str & tal_valname(i) & " = " & tal_val(i) & ", "
            Else
                hoge_str = hoge_str & tal_valname(i) & " = '" & tal_val(i) & "', "
            End If
        Next i
    End If
    sql_str = Left(hoge_str, Len(hoge_str) - 2)
End Function

↑クラスdbソースコード

Option Compare Database
Dim max As Long
Dim ID As Long
Dim val_val As Variant
Private Sub Form_Load()
lod
End Sub
Sub lod()
    Dim db As db_db
    Dim val_name As Variant
    Dim x As Long
    Set db = New db_db
    val_name = Array("ID", "表題", "数値", "文字")
    val_val = db.sel_all("tableone", val_name)
    max = db.max + 1
    If cmb.ListCount > 0 Then
        For x = 0 To cmb.ListCount - 1
            cmb.RemoveItem 0
        Next
    End If
    For x = 0 To db.db_x
        cmb.AddItem val_val(x, 1)
    Next
    Set db = Nothing
End Sub
Private Sub cmb_Click()
    If cmb.ListIndex >= 0 Then
        Viw cmb.ListIndex
    End If
End Sub
Private Sub del_btn_Click()
    Dim db As db_db
    Dim hoge As Variant
    Set db = New db_db
    val_name = Array("ID", "表題", "数値", "文字")
    If ID > 0 And max > 1 Then
        hoge = db.del("tableone", "ID", ID)
    End If
    Set db = Nothing
    lod
End Sub
Private Sub in_btn_Click()
    Dim db As db_db
    Dim val_name As Variant
    Dim val As Variant
    Dim hoge As Variant
    chkchk
    val_name = Array("ID", "表題", "数値", "文字")
    val = Array(max, cmb, suuzi, moji)
    Set db = New db_db
    hoge = db.up_in(True, "tableone", val_name, val, max)
    Set db = Nothing
    lod
End Sub
Private Sub upd_btn_Click()
    Dim db As db_db
    Dim val_name As Variant
    Dim val As Variant
    Dim hoge As Variant
    chkchk
    val_name = Array("表題", "数値", "文字")
    val = Array(cmb, suuzi, moji)
    Set db = New db_db
    If ID > 0 And max > 1 Then
        hoge = db.up_in(False, "tableone", val_name, val, ID)
    End If
    Set db = Nothing
    lod
End Sub
Sub Viw(i As Long)
    ID = val_val(i, 0)
    suuzi = val_val(i, 2)
    moji = val_val(i, 3)
End Sub
Sub chkchk()
    If IsNumeric(suuzi) Then
        If suuzi > 9999 Then
            suuzi = 9999
        End If
    Else
        suuzi = 0
    End If
    If IsNumeric(moji) Then
        moji = "文字が不正>" & moji
    End If
    If IsNumeric(cmb) Then
        cmb = "文字が不正>" & cmb
    End If
End Sub

↑formソースコード

タグ

35, 358, access, db, https, sample, samplezip, SQL, Viewer, www, zip, いま, インジェクション, コード, こと, コメント, これ, サンプル, ソース, それ, ダウンロード, つもり, バグ, ファイル, マイクロソフト, ヨロシク, 下記, , , 修正, 削除, 動作, , 対策, 工事, 改良, , , 無駄, , 突貫, 若干, 軽量, 追加, 追記, ,