2011-01-05 8 views
2

私はmysqlクエリを生成するために必要ないくつかのフィルタと検索機能を持っています。私が使用できるクラスやライブラリがあるかどうかは疑問です。MySQLクエリの生成?

たとえば、日付を入力してメールを入力すると、SQLクエリの途中にWHERE email='email' AND date` = 'date'を追加する必要があります。しかし、彼らも都市に入ると、それを追加する必要があります。

私は配列で検索し、次にそれをANDで埋め込む必要があると思っていましたか?誰にも良い提案はありますか?

+0

これはうまくいく可能性があります。 key => valueを使用して、field => searchcriteriaにすることができます。長期的にはどれくらいのメリットがあるのか​​は分かりませんが...(LIKEや比較のように)より複雑なニーズが生まれても維持するのは面倒かもしれません。誰かが指し示すことができるライブラリがあるかもしれません。 – clifgriffin

+0

[SQL Builder for PHP、JOINサポートは可能ですか?](http://stackoverflow.com/questions/216138/sql-builder-for -php-with-join-support) – Gordon

答えて

1

私はZend_Dbを使用しています。クイックたとえば、Zend_Db_Selectを使用して:

$select = $db->select()->from("users"); 
if($email) { 
    $select->where('email = ?', $email); 
} 
if($date) { 
    $select->where('date = ?', $date); 
} 
// etc 

// show query 
// will output something like SELECT * from `users` WHERE email = 'email' AND date = 'date' 
print_r($select->__toString()); 

// execute 
$results = $db->fetchAll($select); 
print_r($results); 
+1

+1 Zend_Dbの場合、Zend_Db_Selectは完全なZend Frameworkなしで使用でき、優れたクエリビルダーです。 – regilero

0

私はそれがクエリ条件文

$a[] = "email = 'email'"; 
$a[] = "firstname LIKE '%firstname%'"; 
$a[] = "date BETWEEN 'date_a' AND 'date_d'"; 
$a[] = "id > 123"; 

$query = ... " WHERE " implode(' AND ', $a); 
0

ための最も柔軟なソリューションであるように私のような配列に与えられている全てのデータを付加するために行くだろうと非常に多くの場合、配列のソリューションを使用しますこの:

$args = array(
    'email' => '[email protected]', 
    'date' => '2011-01-05', 
    'city' => 'MyTown' 
); 

は、それからちょうど、検索のキーと値を追加することによってforeachの

$SQL = "WHERE "; 
foreach($args as $key => $val) { 
    $SQL .= $key."='".$val."'"; 
    //And add the AND or OR where needed 
} 
0

一般的なアプローチは、異なるクエリ部分を含む配列を作成し、フィルタリングする必要がある要素に応じて要素を追加することです。例:

<?php 

$sql_parts = array(
    'select' => array(), 
    'from' => array(), 
    'where' => array() 
); 

if ($filter_by_name != ''){ 
    $sql_parts['select'][] = 'u.*'; 
    $sql_parts['from'][] = 'users AS u'; 
    $sql_parts['where'][] = "u.name = '".mysql_real_escape_string($filter_by_name)."'"; 
} 

if ($filter_by_surname != ''){ 
    $sql_parts['select'][] = 'u.*'; 
    $sql_parts['from'][] = 'users AS u'; 
    $sql_parts['where'][] = "u.surname = '".mysql_real_escape_string($filter_by_surname)."'"; 
} 

//filter by data from another table 
if ($filter_by_city_name != ''){ 
    $sql_parts['select'][] = 'u.*, c.*'; 
    $sql_parts['from'][] = 'cities AS c'; 
    $sql_parts['from'][] = 'users AS u'; 
    $sql_parts['where'][] = "c.cityname = '".mysql_real_escape_string($filter_by_city_name)."'"; 
    $sql_parts['where'][] = "c.id = u.cityid"; 
} 

$sql_parts['select'] = array_unique($sql_parts['select']); 
$sql_parts['from'] = array_unique($sql_parts['from']); 
$sql_parts['where'] = array_unique($sql_parts['where']); 

$sql_query = "SELECT ".implode(", ", $sql_parts['select']). 
       "FROM ".implode(", ", $sql_parts['from']). 
       "WHERE ".implode(" AND ", $sql_parts['where']); 
?> 
関連する問題