MySQL初心者の私の備忘録です

 

 

Q.長いSQL文の書き方は?

A.諸先輩方のやり方をそのまま拝借させて頂きます。謝辞。

PHP – phpの中での読みやすいSQLの書き方|teratail

$w_sql = <<<SQL;

SELECT

a.id,

a.post_title

FROM

テーブル名

条件

ORDER BY a.id;

SQL;

———

いわゆるヒアドキュメントのやり方だそうで改行が可能です。そしてSQL文として認識させるためには適宜、空白を入れた方が良いでしょう。

 

 

Q.データを追加した後、「NULLは許可できない」といったエラーメッセージが表示された

A.phpMyadminのテーブル定義で、その項目の「NULL」にチェックを入れて、NULLを許可する。

 

Q.phpMyadminでエラーメッセージが表示されて「AUTO_INCREMENT(自動採番、自動番号付け)の設定ができない」

A.考えられる解決方法として

α NULLを許可しない、「いいえ」にする

β αで対応できなければ、その項目を「主キー」とする

他にも方法はありそうです。

 

Q.WHERE句に複数の条件を指定したい

A.下の例は「公表日が開始日(key)~終了日(a)の範囲」かつ「コードが変数(b)」のデータのみ抽出

$w_sql = "SELECT * FROM corona_nnu WHERE (kou_day BETWEEN :key AND :a) AND (cd=:b) ORDER BY kou_day";

 

 

Q.エラーメッセージ「Fatal error: Uncaught Error: Cannot pass parameter 2 by reference」

A. 「パラメータをとらえられない」と訳せたので

修正前

$stmt->bindParam(':b',   330001, PDO::PARAM_STR);

コードを直接セットせずに変数に変更して修正

修正

$key = 330001;

$stmt->bindParam(':b',   $key, PDO::PARAM_STR);

で解決。

 

Q.トリガーって何?

A.オラクル社の解説によると

データベース内で動くプログラム。たとえば

カップ麺A3個、売れた場合

売上テーブルに「カップ麺A 3個」計上されるとする

トリガーを作成していたら

トリガーによって、在庫テーブルのカップ麺Aから3個マイナスする

のように

1つのテーブルを操作すると、他方のテーブルも更新するのがトリガー。

 

しかし、これはデータベース内で「トリガーが勝手に行う処理」。

通常なら

プログラム内で「売上テーブル」と「在庫テーブル」の両方の個数を更新すれば済む話で、トリガーでする必要があるのかどうかは、人それぞれ。

 

 

MySQL+PHP(PDOクラス)での部分検索のサンプル

部分一致検索なので検索キーワードの前後に他の文字があっても検索結果となります。

例えば「マリオ」で検索すると、スーパーマリオやマリオワールドが検索結果となります。

$stmt = $dbh->prepare("SELECT * FROM nintendo_taikn WHERE title LIKE :key ORDER BY title");

$w_key ='%'.$key.'%';
$stmt->bindParam(':key', $w_key, PDO::PARAM_STR);

このサイト様を参考にさせて頂きました(謝辞)。ポイントは、パラメータに渡す前に部分検索の特殊文字である %(ワイルドカード) を付加している点です。SQL文やbindParamの中で % を使っても機能しませんでした。

 

PHP内でSQLで日付を使うサンプル(PDOクラスを使用)

  $w_sql = "SELECT * FROM corona_kyo WHERE kday BETWEEN :key AND :a ORDER BY kday";
  $stmt = $dbh->prepare($w_sql);

  $stmt->bindParam(':key', date('Y-m-d', $str_day), PDO::PARAM_STR);
  $stmt->bindParam(':a',   date('Y-m-d', $end_day), PDO::PARAM_STR);

  $count = $stmt->execute();

ポイントは、日付(int型のUnix タイムスタンプ、例 $str_day)をdate関数で、SQLに対応した文字列に変換してからパラメータ(例 :key)に渡すところです。

 

 

テーブル名に-(ハイフン)は使わない

テーブル名にハイフンを使うとSQL文で失敗しました。ネットの情報では”で囲む方法があるようですが、私の場合、_(アンダースコア)で代用するか、どちらも使わないかの方法を取りました。

テーブル名の事例

エラーになる確率が高い:corona-kyo

代用方法:corona_kyo、coronakyo

 

 



ȥåץڡ