ぷろめし|プログラミングよりも飯が好きHomeHomePHPMySQLPHPとPDOを使ったMySQLコード・クエリ役立つまとめDB操作でよく使うPDOやクエリは、殆ど決まりきったものが殆どなので、よく使うコードをまとめておこうと思います。ERROR/'.$PDO_ERROR->getMessage());}●●●には、それぞれ適宜、値を入力。これでMySQLデータベースに接続、もしエラーがあればエラーを出力することができます。クエリなど実行コードはtryの中に記述します。execute();設定したテーブル名が存在しなければ新規でテーブルを作成します。ソースコードはサンプルで、id,name,ageのテーブルを組んでいます。クエリ文を組んで、実行しているだけの基本的なものです。PDO::PARAM_INT);$query->execute();INSERTする値を変数で指定する場合は、bindValueして関連付けます。クエリ文の変数は$が「:」になります。数値の場合は、int指定します。quote)とバッククォート(backquote)phpMyAdminを使ってクエリをイジっていると、実行されたSQL文にシングルクォート「’」に似た記号「`」が付加されます。これは「バッククォート(backquote)」と呼ばれる記号です。'値'";テーブル名やフィールド名はバッククォーテーション値や文字列はシングルクォーテーションかんたんに説明すると「予約語をエスケープ」するためです。'値'";例えば更新日を記録するカラム名を「update」とた場合、updateは予約語なのでエラーになります。エラーにしないためにはバッククォートで囲むとカラム名としてに認識して正常に稼働します。`日付カラム名`;一旦、日付カラムを取得して、取得したデータを再度並び替えるという流れです。as句を使わないと、テーブル全体から見た日付カラムの古い順で取得されるため日付を考慮しません。降順(DESC/デスク):新しい順ASCは昇順で昇るから、小さい値から大きい値へ(1,2,3,4,5...)DESCは降順で降りるから、大きい値から小さい値へ(5,4,3,2,1)ASC、DESCを覚えられないなら、ちょっと工夫。それぞれの文字の頭と尻尾に注目して、それをアルファベットの順番(ABCDEFG)で当てはめて考える。unserialize($array_serialize);arrayをそのままDBに挿入すると「Array」となり意味をなさなくなるため、シリアライズしてから挿入すれば良い。出力するときもアンシリアライズしなければならない。格納するときBLOB型のカラムに入れること。取得するときstringだけど実はバイナリ文字列なので、text型に格納すると配列が壊れる可能性があるよ。serializeのphpマニアルにも書いてあるよ!prepareとqueryの違いクエリを実行するときに、prepareとqueryが存在します。columnsとかWHERE)prepare()の場合は、クエリでアップデートする情報・変数をバインドするステップが必要になります。バインドするとは?バインド(bind)ってなんやねん!PDOで最初にポカーンしたのは、「バインドする」でした。翻訳ツールでbindを調べると「翻訳結果:バインド」と出てきてムキーしたことは記憶に新しいです。結論から言えば、バインド(bind)は結びつけるという意味です。PDOでは、基本的に変数を直接、扱えません。そこで、変数を「:」で始まるものに結びつけ(関連付け)ているのです。PDO::PARAM_STR);後ろについてるやつは、文字列なら「PDO::PARAM_STR」数字なら「PDO::PARAM_INT」を指定しているやつです。PDOマニュアルは理解が深まると役に立ちますのでブックマークしておきましょう。"名前2";bindValue:値をバイントするbindParam:変数をバイントするバインドにも2つの記述があります。大きな違いは、変数を評価(確認)するタイミングです。bindParamはexecute()(実行)した時点で評価するのので、結果は「名前2」になります。bindValueは、即時評価されるため、結果は「名前1」となります。bindValueは値を直接入力してもエラーは出ませんが、bindParamは変数で設定しておかないとエラーを出します。/>";}中身を出力するために、queryで取得して、whileで回して出力します。queryの場合は「execute」は必要ありません。$row;」で全てのデータを分かりやすく配列で取得できます。PDO::PARAM_STR);$INSERT_query->execute();このINSERT文はめちゃめちゃ効率がいいです!重複がなければINSERTして、重複があれば指定のカラムをUPDATEする。これはほんとに便利!でも注意点が1つ。KEY」の設定が必要です。この設定が無いと重複していても新規で行が増えていきます。NULLでテーブルを設定すると、INSERTされた際、何も値がなければNullが入ります。0ではなく、Nullは何も無いという意味なので、計算するときなどに困ります。この場合、デフォルト値を「0」にしてあげれば、何も値がない場合は0が挿入されるというわけ。execute();インデックスは後からでもつけられますが、テーブルを作るときに先につけておくこともできます。TableしたとにINDEXと名前を指定してインデックスするカラムを指定すればOK!カラム1つ1つにインデックスを付けるのもありですが、1つのクエリを実行するとき、1つのテーブルにつき1つのインデックスしか使用できない特徴があるので、まとめて付けておくと便利です。(カラム1,カラム2,カラム3,カラム4)テーブル設定で重複したら困るカラムにユニークを設定しておく。(:kara1,:kara2,:kara3,:kara4)INSERTの際にIGNOREと入れておくと、ユニークで指定したカラムが重複していなければ通常通りINSERTされ、重複しているとスルー(INSERTしない)されます。IGNOREを入れていないとエラーが出ます。テーブルにあるカラムを一覧表示したいクエリ文は単純。カラムを見せろと指示を送るだけ。`テーブル名`;取得したカラムは配列に直して使用します。/>";}キー名は配列を表示して確認して下さい。バイナリ(BLOB型)をlike検索したいBLOB型だとlike検索できないので、LOCATEを使います。検索したいキーワードをutf8にcovertして出現するカラム位置を特定する流れです。`検索対象カラム名`)";複数のキーワードで絞り込みたい場合は下記。`検索対象カラム名`)";単純にORかANDで繋いでやれば絞り込みも出来ます。カラム名」と表記して空とし列数を揃える。テーブル内のレコード数を返してくれます。ほにゃららとすると取得したデータに名前を付けられます。複数のテーブルのレコード数(行数)をカウントして取得したい場合は、少しいじります。fetch(PDO::FETCH_ASSOC);$result_arrayに配列として取得したデータが入れられます(最初の1つのみ)。複数のデータがある場合は、fetchの部分を変えます。fetchAll();上記同様に$result_arrayに配列として取得したデータが入れられます。取得した配列を表示する場合は、配列内容を一旦確認してカラム名を調べて下さい。/>";}全ての取得したデータを配列で返すので、データが膨大にある場合は処理の負担が増大します。DB側のクエリ文で検索条件を絞ってから使うようにしたいです。表示したい場合はwhileを使います。/>";}取得したレコードが順番に表示されます。カラム名の指定が必要です。$rowだけで表示させるとArrayと表示されるだけになります。shitei_column指定したカラムに保存されている同じ値の数をカウントすること出来ます。性別カラムを指定すれば、男性・女性それぞれの数がカウントされることになります。fetchALL()で配列取得、またはwhileで表示してデータを取り出します。真性のお家大好きフリーランスです。プログラムよりご飯の方が断然好き!博多出身のデブデザイナー。Cloudがそんなに良いのか?CCとCSの違い。迷っているなら買ってよし!フォトショップのドロップレットが通信できない。