質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

649閲覧

SELECT文を構築する関数

UpaZiro

総合スコア17

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2021/07/06 22:45

前提・実現したいこと

PHPでSQLのselect文を作成する関数を作成しようと思っているのですが、引数を以下のように設定しました。

●入力値
第一引数:カラム名を格納した1次元配列
第二引数:テーブル名
第三引数:条件に関する(WHERE句で用いる)情報を格納した配列。以下のような情報を1要素としている。
[カラム名,演算子,比較値]:例)['id','=',12]、['age','>',20],['word','NOT LIKE','%やま%']

●返却値
与える引数に誤りがなければSQL文、誤りがあればfalse(bool値)を返す。

発生している問題・エラーメッセージ

困っているのはWHERE句の「AND」「OR」などの論理演算子をどのように実現するかです。
(条件① AND 条件②) AND 条件③であることもあれば、
(条件① OR 条件②) AND 条件③であることもあります。

条件句WHERE以降を構築するために引数の設定をどのように実装すべきか…とか、
どのように処理を行えばいい…などのアドバイスがあればいただきたいです。

また、不可能ではないかという場合、不可能であると教えていただきたいです。

エラーメッセージはありません

該当のソースコード

「SELECT .... FROM ... WHERE」までを作成するコードを念のため張り付けておきます。
(注)以下のコードはWHERE句以下の作成未実装の不完全なコードです。

function create_select_sql($select = ['*'],$table,$conditions){ $sql = 'SELECT'; foreach($select as $key => $value){ if($key > 0){ $sql .= ', '.$select.' '; } else{ $sql .= ' '.$select.' '; } } $sql .= ' '.$table.' WHERE'; }

試したこと

配列の深さでAND、ORを分けられないか?→不可能でした

補足情報(FW/ツールのバージョンなど)

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2021/07/06 23:22

関数を作成する意図は何でしょうか。 何かのデータ一覧から絞り込み検索するのか、またどのような検索も可能な汎用的な関数を目指しているのか等。
退会済みユーザー

退会済みユーザー

2021/07/07 00:19

フレームワークのクエリビルダのソースコードでも調べれば、どうやって実装しているかわかるんだろうけれど。
UpaZiro

2021/07/07 01:36

返信ありがとうございます! 絞り込み検索を行う際のSELECT文を作成するのが目的です。 今回は、上記が目的ですが、以降も汎用的に使えるものになればいいなと思っています。 例えば、「ユーザー名に『au』を含み、年齢が『10〜20歳』又は血液型が『A型』であるユーザーを絞り込み検索する」と言ったようなことをしたいです。
m.ts10806

2021/07/07 03:43

質問は編集できます
guest

回答2

0

ベストアンサー

論理式は基本はすべてANDです

  • A AND B AND C

かりに(A OR B) AND Cは
X AND CでXがA OR Bになっているだけです
AND関数の中でOR関数を実行すれば単純な実装になります
むしろ調整が必要なのはカラム以外の条件もあることです
演算子もそのまま使うとインジェクションの対象になりますので
関数化しないといけないかもしれません

sample

実際にはprepareなどで処理しなくてはいけませんが

PHP

1function whereAnd(){ 2 $a=func_get_args(); 3 return implode(" AND ",array_map(function($x){return "(".$x.")";},$a)); 4} 5function whereOr(){ 6 $a=func_get_args(); 7 return implode(" OR ",$a); 8} 9 10print_r(whereAnd(whereOr(whereAnd("A","B"),"C"),"D","E")); 11print_r(whereAnd(whereOr("A","B"),whereOr("C","D"),"E")); 12

投稿2021/07/07 00:20

編集2021/07/07 01:32
yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UpaZiro

2021/07/07 01:16

回答ありがとうございます! {(A AND B)OR C} AND D AND Eのような場合、 X={(A AND B)OR C}とすると、 確かにX AND D AND Eとなりますが、Xの中身はORだけではなく ANDも出てきます汗 このような場合、どのように処理すればよいのでしょうか?
yambejp

2021/07/07 01:33

そのまま使えませんがイメージがわかるようにsample上げておきました
guest

0

第三引数:条件に関する(WHERE句で用いる)情報を格納した配列。以下のような情報を1要素としている。

[カラム名,演算子,比較値]:例)['id','=',12]、['age','>',20],['word','NOT LIKE','%やま%']

pythonあんまり得意じゃないので、実現できるかどうかわかりませんが。

  1. ANDで連結する条件のList型のAndListを用意する
  2. ORで連結する条件のList型をOrList用意する
  3. AndListの要素は、[カラム名,演算子,比較値], AndList, OrListのいずれかとする
  4. OrListの要素は、AndListの要素と同様

{(A AND B)OR C} AND D AND Eのような場合

第三引数 = AndList(OrList(AndList(A, B), C), D, E)

  1. AndListの各要素はANDで連結
  2. OrListの各要素をORで連結
  3. それぞれのListは括弧で括る

とすれば、(((A AND B) OR C) AND D AND E)を生成できる。

投稿2021/07/07 04:51

shiketa

総合スコア4061

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiketa

2021/07/07 04:54

yambejpさんの回答と同じでした...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問