エグゼクティブサマリ PHP 5.5.21、PHP 5.6.5 以降、PHPにPDO::MYSQL_ATTR_MULTI_STATEMENTSというオプションが追加され、PDO+MySQLの組み合わせで、SQLの複文を禁止できるようになった。この設定はSQLインジェクションの緩和策として有効である。 はじめに 2013年12月に公開した PHP+PDO+MySQLの組み合わせではSQLインジェクション攻撃で複文呼び出しが可能 にて、PDOとMySQLの組み合わせで、SQLインジェクションの文脈で複文呼び出しが可能であることを報告していましたが、その後のPHPのバージョンアップで、複文実行を禁止するオプションが追加されていましたので報告します。 対象のバージョンは以下の通りです。 PHP 5.5.21 以降 PHP 5.6.5 以降 全ての PHP 7.0、7.1 前述の記事を書いた後、3大
問題 こんなテーブル a があります。 create table a (id int, flag int); こんなふうにデータを入れて、 insert into a (id, flag) values (1, 1), (2, 1), (3, 0), (4, 0), (5, 1); こんなふうになっているとします。 select * from a; +----+------+ | id | flag | +----+------+ | 1 | 1 | | 2 | 1 | | 3 | 0 | | 4 | 0 | | 5 | 1 | +----+------+ なるべく単純な1つのSQLで、すべてのレコード数と、flag=1のレコード数と、flag=0のレコード数を取得せよ。 なお、サブクエリは使わないこと。 ヒント 集計を3つしたいので、こうなる? select count(????), c
この記事ははてなデベロッパーアドベントカレンダー2015の12月24日の記事です。 昨日は id:stefafafan さんのエンジニアと英語でした。 こんにちは、こんばんは。 クリスマス・イヴですね、皆さんはどのような一日を過ごされる(た)のでしょうか。 僕は一人です。 改めまして、先日初めての合コンを経験/失敗して二度と行かないと誓った はてなの id:ichirin2501 です。今回は小ネタとしてMySQL(InnoDB)のBULK INSERTにおけるデッドロックの話をしようと思います。ただ、外部キー制約が絡むと複雑になるので今回は触れません。それについてはこちらを参照ください。 あ、タイトルはオマージュです*1。 Topic 検証環境 INSERTのデッドロック 避けられないケース もしくはロックする リトライ処理に注意 初期データ Duplicateの場合 Deadlockの
MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。 PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。
少し前のことですが、「IDの一覧出したくてgroup_concatしたのだけど、結果がおかしいです」と聞かれまして、たぶんみんな一回は経験することのような気がするので書いておきます。 MySQLのgroup_concatというのは集約関数の一つで、複数のレコードの値を、区切り文字を入れながら文字列結合するというものです。 group_concatの結果が短い気がする こんなクエリ書く人いないかもしれませんが、「全ユーザーIDをランダムな順番でコンマ区切りで取得したい」という狙いで以下のクエリを実行しました。 mysql> select group_concat(id order by rand()) as user_ids from user\G *************************** 1. row *************************** user_ids:
以下のようなテーブルがあるとします。 Aテーブル Bテーブル 以下のようなSQLを流すと、 SELECT A.id, GROUP_CONCAT(B.bname) as namae FROM A, B WHERE A.id = B.aid GROUP BY A.id こんな風に、まとめてくれました。 そのほか、以下のようなこともできます。 昇順・降順に並べてくれる GROUP_CONCAT(B.bname order by B.id) 重複する名前をまとめてくれる GROUP_CONCAT(distinct(B.bname)) 区切り文字指定もできる GROUP_CONCAT(B.bname separator '/') 参考 ・ MySQLの独自の関数なので、他のデータベースを使う場合は要検討(Oracleだとwmsys.wm_concatがあるなど)。 ・ NULLを含む場合注意。 この
SELECT GROUP_CONCAT(id SEPARATOR ', ') FROM examples; +-------------------------------------------------------------------------------------+ | GROUP_CONCAT( id SEPARATOR ', ') | +-------------------------------------------------------------------------------------+ | 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146 | +--------------------------------------------
トランザクションとは 1つの作業単位として扱われるSQLクエリの集まりです。 複数のUPDATEやINSERTをひとつの集まりとして、 それらのクエリがすべて適用できた場合のみデータベースに反映します。 ひとつでも適用に失敗したクエリがあった場合は、そのまとまりすべてのクエリの結果は反映しません。 ACID特性 トランザクション処理に求められる4つの特性です。 原子性 (Atomicity) トランザクションに含まれる手順が「すべて実行されるか」「すべてされないか」のどちらかになる性質。 一貫性 (Consistency) どんな状況でもトランザクション前後でデータの整合性が矛盾なく保たれる性質。 分離性 (Isolation) トランザクション実行中は、処理途中のデータは外部から隠蔽されて他の処理に影響を与えない性質。 永続性 (Durability) トランザクションが完了したら、シス
MySQLでデータをINSERTする方法と複数のレコードを1つのSQLで追加する方法をメモします。 ■ INSERT文の書式 INSERT INTO テーブル (フィールド, フィールド) VALUES (データ, データ); ■ INSERT文の使用例 「user_table」テーブルに1行データを追加する場合は、 下記のように記載します。 INSERT INTO user_table (id, name, memo, status) VALUES (1, 'test1', 'メモ', 1); また、フィールドの値を全て指定する場合は、 フィールド名を省略することが可能です。 INSERT INTO user_table VALUES (1, 'test1', 'メモ', 1); 複数行データを追加する場合は下記のように記載します。 INSERT INTO user_table (id,
CSVに外部テキストファイルを列として追加する方法 こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,ti
PHPには、MySQLに接続する関数が3種類あります。 http://www.php.net/manual/ja/mysqlinfo.api.choosing.php このうち、MySQL関数がPHP5.5.0から非推奨になりました。 修正する場合のサンプルです。(エラー処理はしていません) 修正前 <?php $con = mysql_connect("hostname", "user", "pass"); mysql_select_db("dbname"); $rec = mysql_query("SELECT 'Hello, World.' AS msg FROM DUAL", $con); $row = mysql_fetch_array($rec); echo htmlentities($row["msg"]); mysql_free_result($rec); mysql_cl
数GBのダンプファイルをインポートしたくても共用サーバーの場合ですと数十MBに制限されていることが多くて入れられません。VPS や専有サーバーの場合は設定を変更してアップロードできる最大サイズを変更する方法もありますが、ファイルサイズが増えるたびに変更するのは大変です。 しかし BigDump を使えば巨大な SQL ファイルをサーバーに合わせて分割インポートしてくれるので、ファイルサイズが大きくなってもサーバーの設定を変更しなくても良いですし、共用サーバーでも巨大なファイルをインポートすることができます。 ここでは BigDump を使った SQL ファイルのインポートを説明します。説明にあたって以下のページが参考になりましたのでこちらも御覧ください。 WikiCookRecipe日記: MySQLインポートファイルがでかすぎる時には BigDump を使ってみよう! MySQL のデー
会員登録数などを調べるときに、月別、日別、時間、曜日別の登録者数を調べたいってよくありますよね。 そこで今回は、MySQLでdatetime型のカラム(今回は「regist_time」としています)を使って月毎、日毎、時間、曜日毎にレコード数を集計をするSQLの紹介です。 ■月毎 SELECT DATE_FORMAT(regist_time, '%Y-%m') as regist_time, COUNT(*) as count FROM users GROUP BY DATE_FORMAT(regist_time, '%Y%m'); ■日毎 SELECT DATE_FORMAT(regist_time, '%Y-%m-%d') as regist_time, COUNT(*) as count FROM users GROUP BY DATE_FORMAT(regist_time, '%Y
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く