2010年9月30日木曜日

SQLite2系と3系

SQLiteは2系と3系でけっこうSQL文で使えるものが違うようですね。

3系ではalter tableが出来るようになったとか。
やっと知りました。

参考になったのはこちら。
http://seclan.dll.jp/dtdiary/2007/dt20070228.htm

2010年9月28日火曜日

undefined function mysql_set_charset()で悩んだ。

とあるWebアプリを、新しいサーバ環境で動かそうとしたら、画面が真っ白。

デフォルトがエラー非表示設定だったので、php.iniを編集できるから、error_logをとることに。

log_errors =On
error_log=/home/hoge/public_html/php.log(みたいな絶対パスで指定)

として、書き込み権限を加えて準備。(エラーログが取れるかちょっとドキドキしました(笑)嗚呼、初心者)

エラーログを見てみると、 ちゃんとログが取れている。嬉しい。

そこで、undefined function mysql_set_charset() と書いてあって、「おや?」となりました。
なんで定義されてないんだろう。と、こんなときはグーグル先生。

どうもPHPのバージョンによって使える環境と使えない環境があるのですね。
mysqliが導入されていれば良い様子。
http://nonn-et-twk.net/twk/why-set-names-in-php-is-bad

結局、自分の場合は、DBの文字コードが整合性があったようで、この関数部分を削除したらすんなり通りました。
エラーログってありがたいなあ、と改めて思ったものでした。

2010年9月26日日曜日

「127」という数字ととTinyintの関係

SQL文を発行して、本来はid値が245となるところが、
「127」という数値になっていて少々悩んだ。

127は245のほぼ半数だから、どこかで割り算をしてしまっているかとソースを見るも、そんな箇所はなし。

弱ってDBのテーブル構造を見たら、該当idのフィールド型が「tinyint」になっていた。。

tinyintだったから127という数値で止まってしまっていたんですね。
245の半数ではなくて。

たまたま245なんて数値だったから,余計な悩みを抱えました(笑)。

理由が分かって良かった!!
127はtinyintの最大値。学習しました。。。。

2010年9月20日月曜日

sql文を発行してもうんともすんとも言わないときは。。

insert文やupdate文を発行しても、うんともすんとも言わないときは、
指定したカラムが存在するかどうかを確認するのもいいかもしれません。

xampp等のローカル環境と、サーバ上の本番環境・実験環境などとの間で、
もしかしてローカルだけに新しいカラムをつくり、
リモートサーバ上に作り忘れていた、なんていうことを、自分は何度かやらかしました。

ローカルではうまくいくコードが、
リモートではinsert等されない場合、
エラーも出ず、謎です。

そんなときは、カラムがちゃんとローカルとリモートで同一か、
書かれたsql文と整合性があるか、
しっかり確認するのは無駄ではないかもしれません。

自戒を込めて、メモしました。

column追加はALTER TABLE

sqlでカラムを追加するには、
ALTER TABLE tbl1 ADD column ~

checkboxにて複数の配列を渡す[]

Warning : Invalid argument supplied for foreach() in
という警告が出たので、メモです。

foreachに対して、配列を渡していない、と怒られたようなので、考えてみると、
postでcheckboxから値を複数渡したつもりで、複数渡していないことに気づき。

name='hoge'としていたので、
name='hoge[]'
としてみたら、無事解決でした。

checkboxの値を複数得るためには、[]が重要なり。

備忘録です。

2010年9月17日金曜日

予約語、ほんとに要注意

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in..

というエラーが出て、しばし悩みました。

いろいろやってみて、あるカラム名に「group」という名前を付けていたことが原因と判明。
また「予約語」命名、やっちゃいました。
(前回は、こちら。http://learnaboutphpmysql.blogspot.com/2010/09/blog-post.html

「group」とか、フィールド名にしたくなっちゃいますよね。
初心者には痛いところです。

以後、「予約語要注意!」を更に徹底せねば、とまた思った次第でした。。

追記:groupというテーブルも作っちゃっていたので、変更。
alter table group rename to groups
ではまたまたエラーが出たので、
alter table `group` rename to `groups`
としたらOKでした。

予約語対策(フィールド、テーブル命名)、肝に銘ずべし。。

2010年9月11日土曜日

SQLiteをエクセル形式エクスポート

https://www.eonet.ne.jp/~pup/software.html

SQLiteをエクセル形式でエクスポート使用と思い、
「SQLite入門」に載っていたツールを思い出し、インストール。

とても簡単にエクスポートできました。
感謝。

[PupSQLite]

https://www.eonet.ne.jp/~pup/software.html

 

2010年9月9日木曜日

SQLiteではダミーのautoincrement値は要らない様子

SQLiteで
AUTOINCREMENTのidカラムには、
0などのダミーの値は必要無い様子。

0を入れると,すでに0があった場合、データがinsertできなかった。

メモです。

予約語使用、という痛い学習…

ちょっとしたDBをSQLiteで作成してみたら、
やたらと
Call to a member function bindParam() on a non-object in
というエラーに見舞われ、原因が分かりませんでした。

いろいろやってみて、「from」という名前のカラムへの登録をなくすと通ることが判明。
はっと思って「予約語表」を見てみたら、当然ですが「from」がありました。

っていうか、普通のSQL文でばりばり使われる言葉をカラム名にしちゃいけませんね。。。

痛い学習でした。2時間は悩んだ。。。修行が足りません。

「今後は気をつけましょう」と自戒を込めてココに書き残します。

SQLite,bindParamメモ

SQLiteでのPDO、bindParamの書き方が、
に載っていて、とても簡単だったので、引用メモです。

<?php
$stmt $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name'$name);
$stmt->bindParam(':value'$value);

// 行を挿入します
$name 'one';
$value 1;
$stmt->execute();

// パラメータを変更し、別の行を挿入します
$name 'two';
$value 2;
$stmt->execute();
?>

2010年9月8日水曜日

UPDATE文のメモ

UPDATEのメモです。

UPDATE table_name SET columnA=:valueA where id=:id

といった感じ。

「SET」をお忘れ無きよう!自分。

2010年9月2日木曜日

SQLiteで書き込みが機能しない時は、まずpermissionを疑うのが吉

前にもやりましたが、またやりました。。orz

SQLiteは、DBサーバが要らない分、サーバに上げた時の書き込み権限に注意する必要がありますね。
それをまた忘れて、書き込み権限を付与せず、
「insert intoが機能しない!」
としばし困り果てていました。。。

で、諦めて休憩したらふと、「あ、書き込み権限の問題かも」と思いつき、
権限を付与したら、あっさりOKに。。

SQLiteで書き込みが機能しない時は、まずpermissionを疑うのが吉ですね。
コードに問題が無く、エラーも出ないのにDBが空、なんて時は特に。

 自分に言い聞かせるためにも、またここに書いておきます。
きっと同じことで引っかかる方もおられるかな、とも思いつつ。