SQLクエリー(SQL文)を直接実行する方法
SQL文を直接実行する方法
SQL文でパラメーターをエスケープする方法
SQL言語によって切り替える方法
SQL文を直接実行する方法
SQL文を直接実行する場合、以前はモデルクラスのqueryメソッドでしたがCakePHP4ではConnectionManagerクラスのexecuteまたはqueryで実行します。
use Cake\Datasource\ConnectionManager;
……
…
……
$connection = ConnectionManager::get('default');
$connection->execute("【SQL文】")->fetchAll('assoc');
または
$connection = ConnectionManager::get('default');
$connection->query("【SQL文】")->fetchAll('assoc');
executeは次の項のプリペアードステートメントが使えますが、queryは使えません。
SQL文でパラメーターをエスケープする方法
パラメーターを渡すには、プリペアードステートメントを使います。
$results = $connection
    ->execute('SELECT * FROM articles WHERE id = :id', ['id' => 1])
    ->fetchAll('assoc');
プリペアードステートメントを使わずにパラメータを直接記述するとSQLインジェクション攻撃の危険性が出てきます。
このためqueryではなくexecuteを使うのが正しい記法です。
またqueryを使わざる得ないときやプリペアードステートメントでエスケープできない場合は、PHPの文字置き換えなどを使用せずCakePHPのクエリビルダーでエスケープするのが正しいです。
SQL言語によって切り替える方法
SQL言語によってSQLの記法は異なり、ORMを使用すればその差異は吸収されます。
しかしSQL文を直接記述する場合はそのSQL言語のみで実行させるようなケースが起こりえます。
config/app.phpに記載されている設定値は次のようにして得られます。
$connection = ConnectionManager::get('default');
debug($connection->config());
このうちドライバは$connection->config()['driver']です。
| 'driver' => Mysql::class, | → | 'Cake\Database\Driver\Mysql' | 
| 'driver' => Postgres::class, | → | 'Cake\Database\Driver\Postgres' | 
| 'driver' => Sqlite::class, | → | 'Cake\Database\Driver\Sqlite' | 
| 'driver' => Sqlserver::class, | → | 'Cake\Database\Driver\Sqlserver' | 
例えばPostgreSQLは次のようにして分岐できます。
PostgreSQLではシーケンスによりプライマリキーの自動採番を行うため、用途によってはPostgreSQLだけで使用するSQLの実行は多いです。
$connection = ConnectionManager::get('default');
if (strpos(strtolower($connection->config()['driver']), 'postgres') !== false) {
    $connection->execute("【PostgreSQLのみで実行されるSQL文】")->fetchAll('assoc');
}
関連記事
- カラム一覧を取得する方法
- テンプレート(template)側でログイン情報を取得する方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 標準のHelperを拡張してカスタマイズする方法
- 国際化i18n(多言語化)
- URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
- CakePHP4系の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation
- Seedを実行した後にシーケンスを更新する方法(duplicate key valueエラー)
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
スポンサーリンク







