MySQLでデータがなければINSERT、データがあったらUPDATE(複数行もOK!)

例えば myfavorite というテーブルがありまして。(nameはUNIQUE)

name rank
豆大福 5
シナモンロール 4


これにチョコレート(ランク4)を追加したいとします。
ただ、すでにチョコレートが登録されていたら、そのランクだけを変更したいという場合、ON DUPLICATE KEY UPDATEが便利です。

INSERT INTO myfavorite
(name, rank) VALUES ('チョコレート', '4')
ON DUPLICATE KEY UPDATE rank = VALUES(rank);

結果)

name rank
豆大福 5
シナモンロール 4
チョコレート 4


チョコレートのランクを5に変更して、一緒にオールドファッション(ランク4)も追加しておきたい場合はこんな感じです。

INSERT INTO myfavorite
(name, rank) VALUES ('チョコレート', '5'), ('オールドファッション', '4')
ON DUPLICATE KEY UPDATE rank = VALUES(rank);

結果)

name rank
豆大福 5
シナモンロール 4
チョコレート 5
オールドファッション 4


お腹すきました。

MDB2 Error: not found が出た時に確認したい事項まとめ

1. ドライバのインストールが済んでいるかどうか

簡単な select * from table とかを試してみてもこのエラーが出る場合は、使用するDBのドライバが入っていない可能性が高いのでインストール。
mysqlなら pear install MDB2_Driver_mysql を実行。

2. プレースホルダのパラメータと値の数があっているかどうか

プレースホルダを使ったときにこのエラーがでた場合、パラメータ「?」の数とセットする値の数が違っていないかチェック。
例えば↓こんなことになっていないかなど。
ダメな例)

$row = array(1, 2); #=>セットしてる値は2つ
$sth = $mdb2->prepare('INSERT INTO table VALUES (?, ?, ?)'); #=>パラメータは3つ
$sth->execute($row);

OKな例)

$row = array(1, 2, 3);
$sth = $mdb2->prepare('INSERT INTO table VALUES (?, ?, ?)');
$sth->execute($row);
3. プレースホルダのパラメータをシングルクォートで囲ってたりしないか

今しがたしたミスだったのでメモ…。シングルクォートはいらないです。
ダメな例)

$sth = $mdb2->prepare("INSERT INTO table VALUES ('?', '?', '?')"); #=>「?」は囲まないで!!

OKな例)

$sth = $mdb2->prepare("INSERT INTO table VALUES (?, ?, ?)");

Foundation 5をIE8に対応させるためのTIPS

2015/05/25 追記しました。

 

CSSフレームワークといえばBootstrapとFoudationが有名ドコロでしょうか。
私はBootstrapしか使ったことがないのですが、Bootstrapのclass指定の冗長さが気になってきまして、今回はFoundationを使って構築してみることにしました。

FoudationはBootstrapよりもクラスがスッキリしているのはいいですが、問題はIE8に対応していないということ…。
IE8のサポートは2016年1月12日まで。無理に対応させなくてもいいじゃないのと思うのですが、まだまだ使っている人が多いのも事実…。そこで無理やりIE8に対応させる方法をメモしておきます。

元ネタはここ↓です。


Foundation 5 and IE8 | Foundation Forum from ZURB

IE開発者ツールのエミュレーションだと、この方法だけだとうまくいきませんでした。私なりに試行錯誤した方法を記述しておきます。

ヘッダに追加
<!--[if lt IE 9]>
	<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
	<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.2/html5shiv.js"></script>
	<script src="//s3.amazonaws.com/nwapi/nwmatcher/nwmatcher-1.2.5-min.js"></script>
	<script src="//html5base.googlecode.com/svn-history/r38/trunk/js/selectivizr-1.0.3b.js"></script>
	<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.1.0/respond.min.js"></script>
	<script src="js/ie8/rem.min.js"></script>
	<link rel="stylesheet" href="css/ie8.css">
<![endif]-->

まずIE8のためにjquery1系を読み込ませています。

そのあと、レスポンシブやhtml5に対応させるためのjsファイルを読み込ませます。元ネタにはremをどうにかするjsがなかったので、rem.js(chuckcarpenter/REM-unit-polyfill)も追加。

さらに、それでも調整ができなかったパーツのために微調整するためのcssを追加しました。

BODY書き換え
<!--[if gte IE 9]><!-->
    <script src="js/vendor/jquery.js"></script>
<!--<![endif]-->
<script src="js/foundation.min.js"></script>
<script>
    $(document).foundation();
</script>

最後に、BODYの最後の方にあったjquery2系について、IE9以降のみ読み込むよう変更しました。

今のところこれで大丈夫そうですが、javascriptの処理が絡んでくる部分についてはまだ未テストということと、IEの開発ツールがいまいち不安定で挙動がおかしいことが多々あるので、何か不具合があったら追記します。

追記:

rem.jsについて、「Error: アクセスが拒否されました。」という表示になって読み込みに失敗するようになってしまいました。
XDomainRequestのセキュリティまわりの問題のようなのですが、jQuery-ajaxTransport-XDomainRequestを導入してみても変わらず…。しかもたまに成功することもあるので、さすがie悩ませてくれるじゃないといったところでしょうか。
仕方ないのでrem.jsは外して、ie8-grid-foundation.cssというスタイルシートを読み込んで対応することにしました。細かい調整が必要にはなってきますが、グリッド部分についてはこれで大丈夫そうです。

指定の要素以外の場所をクリック(タップ)したら閉じるjQuery

とても参考になったのでメモ。
キモは $.contains( container, contained )です。

$(document).click(function(event) { // (1)
    if (!$.contains($("#popup")[0], event.target)) { // (2)
        $("#popup").hide();
    }
});
[参考] ポップアップの外側をクリックしたら閉じるためのjQuery Tips | milestoner

引用元サイトにとてもわかりやすい解説がついていますので、なぜそうなるの?という方はぜひ元サイトで確認を。

私はiPadにも対応させたかったので、

$(document).click(function(event) { // (1)

この部分を

 $(document).on('click touchend', function(event) {

こうしてtouchendイベントにも使うようにしました。

SSLエラー ssl_error_rx_record_too_long (ERR_SSL_PROTOCOL_ERROR)

SSLの設定完了後、エラー発生。

Firefox

f:id:crosawassant:20140626115301p:plain

安全な接続ができませんでした
www.ezample.jpへの接続中にエラーが発生しました。
SSL received a record that exceeded the maximum permissible length. 

(エラーコード: ssl_error_rx_record_too_long)

Chrome

f:id:crosawassant:20140626115428p:plain

SSL接続エラー
サーバーとの安全な接続を確立できません。サーバー側に問題があるか、サーバーが必要とするクライアント認証証明書を所持していない可能性があります。

エラーコード:ERR_SSL_PROTOCOL_ERROR

apacheのエラーログ
Invalid method in request \x16\x03\x01

原因は<IfDefine SSL>~</IfDefine>

httpd を起動するとき -D でパラメータが指定されていれば、<IfDefine> と </IfDefine> で囲まれたディレクティブを有効にする。

次の例では、httpd 起動時に -D でパラメータ SSL が 指定されていれば、囲まれたディレクティブを有効にする。

<IfDefine SSL>
  ....
</IfDefine>

httpd を起動するためのスクリプト apachectl を見ると、sslstart するときに -D でパラメータ SSL を指定している。

HTTPD='/usr/local/apache2/bin/httpd'

startssl|sslstart|start-SSL)
    $HTTPD -k start -DSSL
    ERROR=$?
    ;;
httpdの設定(ssl.conf)より引用

シラナカッターーーorz

 

 

今回はDオプションをつけて起動しなくてもよいようにしたかったので、<IfDefine SSL>と</IfDefine>はさっくり削除して対応しました。

その他にも、別な原因で同様のエラーが出ることがあるようです。
↓のサイトでまとめてあってとても助かりました。

参考:

SSLでエラー ssl_error_rx_record_too_long (-12263) - くろまほうさいきょうでんせつ

個人的によく使う記号の文字参照一覧

文字実体参照数値実体参照備考
" &quot; " &#34; ダブルクォート
' &apos; ' &#39; アポストロフィー(シングルクォート)※
& &amp; & &#38; アンド
< &lt; < &#60; 小なり
> &gt; > &amp#62; 大なり
&lsaquo; &#8249; 山括弧(開始)
&rsaquo; &#8250; 山括弧(終了)
» &raquo; » &#187; 二重山括弧(終了)
« &laquo; « &#171; 二重山括弧(開始)
© &copy; © &#169; コピーライトマーク
&#xFF5E; &#65374; 全角チルダ
&#x301C; &#12316; 波ダッシュ

アポストロフィーは「can't」など単体で使う場合、シングルクォートは括弧のように2つでセットとして使った場合の呼び方らしい。

postgreSQLの初期パスワード

bitnamiでpostgreSQLをインストール後、phpPgAdminでログインするのに困ったのでメモ。

初期状態だと

ユーザー名:postgres
パスワード:bitnami

[参考] 

What's the the postgres user's password? - BitNami Forums