2010-08-12 4 views
7

मुझे कुछ शर्तों के आधार पर एक प्रश्न बनाना है। क्या मैंने नीचे किए गए तरीके से ऐसा करने का बेहतर तरीका है? यह ठीक काम करता है लेकिन अगर मैं एक नई जांच करता हूं तो क्या मैं पिछली बार स्थिति से बाहर निकल सकता हूं क्योंकि मैं जांच करता हूं कि क्या कोई पिछली स्थितियों को पूरा किया गया था।एक लंबी क्वेरी बनाना और यदि बयान में बहुत कुछ है - क्या कोई और शानदार तरीका है?

$sql = "SELECT DISTINCT fkRespondentID FROM tblRespondentDayTime"; 

    if (!empty($day) || !empty($time) || !empty($sportID)) { 

     $sql .= " WHERE"; 

     if (!empty($day)) { 
      $sql .= " fldDay='$day'"; 
     } 

     if (!empty($time)) { 
      if (!empty($day)) { 
       $sql .= " AND"; 
      } 
      $sql .= " fldTime='$time'"; 
     } 

     if (!empty($sportID)) { 
      if (!empty($day) || !empty($time)) { 
       $sql .= " AND"; 
      } 
      $sql .= " fkRespondentID IN (SELECT fkRespondentID FROM tblRespondentSport WHERE fkSportID='$sportID')"; 
     } 

    } 
+0

यह एक अच्छा सवाल है :) – dmp

उत्तर

6

मैं पुरानी "WHERE 1=1" चाल का उपयोग करूंगा; इसे पहली शर्त के रूप में जोड़ें, और फिर आप निम्न कथन पर "AND" स्थिति मान सकते हैं।

$sql = "SELECT * FROM table"; 
$conditions = array(
    'fldDay' => $day, 
    'fldTime' => $time, 
); 

if (count(array_filter($conditions))) { 
    $sql .= ' WHERE '; 
    $sql .= implode(' AND ', array_map(function($field, $value) { 
    return $field . '=\'' . pg_escape_string($value) . '\''; 
    }, array_keys($conditions), $conditions)); 
} 

कृपया ध्यान दें कि क्योंकि बंद, इस पीएचपी 5.3 नीचे काम नहीं करेगा:

+0

@Palpie ने अपने उत्तर में इस विधि का व्यावहारिक उपयोग प्रदर्शित किया है। – DanP

0

आप अपने चर को एक सरणी में डालने का प्रयास कर सकते हैं और एक बुलियन है जो बताता है कि आपको अपने अगले वाक्यांश से पहले "AND" जोड़ने की आवश्यकता है या नहीं। यह आपके नियंत्रण कथन को एक foreach और एक घोंसला के लिए छोटा कर देगा।

0

यहाँ मेरी समाधान है। यदि आप पुराने PHP का उपयोग कर रहे हैं, तो बंद करें को एक अलग फ़ंक्शन के रूप में बंद करें, या foreach के साथ इसे प्रतिस्थापित करें।

+0

यह कोड पढ़ने के लिए मुश्किल है। –

1

शर्तों की एक सूची/सरणी बनाएं, जहां प्रत्येक सशर्त वैकल्पिक है (यानी यदि स्थिति मान्य है, तो इसे सूची में दबाएं)।

यदि यह सूची> 0 है, तो "कहां" जोड़ें और फिर "और" द्वारा शामिल की गई सूची जोड़ें।

0

दुर्भाग्यवश, गतिशील एसक्यूएल बनाना एक कठिन अनुभव है और भले ही आप अपने तर्क में कुछ चीजें बदल सकते हैं (जो वास्तव में अपेक्षाकृत साफ दिखता है), यह अभी भी बदसूरत होने जा रहा है।

सौभाग्य से, Object-relational mapping मौजूद है। मैं PHP से बहुत परिचित नहीं हूं, लेकिन पर्ल में कई सीपीएएन मॉड्यूल हैं जैसे SQL :: सार, जो आपको बुनियादी डेटा संरचनाओं का उपयोग करके काफी जटिल SQL कथन बनाने की अनुमति देगा।

+0

हम सिस्टम बिरडेरिक बनाने के आकार के बारे में नहीं जानते हैं। ओआरएम और एसक्यूएल कन्स्ट्रक्टर शामिल हो सकते हैं यहां इष्टतम नहीं है। –

1

बल्कि if (!empty($day) || !empty($time)) तरह के चेक कर की तुलना में आप एक $whereClause चर बना सकते हैं और इस तरह से यह जांच कर सकते हैं:

$sql = "SELECT DISTINCT fkRespondentID 
     FROM tblRespondentDayTime"; 

$whereClause = ''; 

// fldDay 
if (!empty($day)) { 
    $whereClause .= " fldDay='$day'"; 
} 

// fldTime 
if (!empty($time)) { 
    if (!empty($whereClause)) { 
     $whereClause .= ' AND '; 
    } 
    $whereClause .= " fldTime='$time'"; 
} 

// fkRespondentID 
if (!empty($sportID)) { 
    if (!empty($whereClause)) { 
     $whereClause .= ' AND '; 
    } 
    $whereClause .= " fkRespondentID IN (SELECT fkRespondentID 
             FROM tblRespondentSport 
             WHERE fkSportID='$sportID')"; 
} 

if (!empty($whereClause)) { 
    $whereClause = ' WHERE '.$whereClause; 
} 

$sql .= $whereClause; 

यह भी अगर आप के लिए, कहते हैं, एक OR (1 = 1 चाल के लिए कुछ बदलने की जरूरत है काम करेंगे उस मामले में काम नहीं करेगा और यह भी काफी खतरनाक साबित हो सकता है)।

4
$sql = "SELECT DISTINCT fkRespondentID FROM tblRespondentDayTime WHERE 1=1"; 

if (!empty($day)) 
    $sql .= "AND fldDay='$day'"; 

if (!empty($time)) { 
    $sql .= "AND fldTime='$time'"; 

if (!empty($sportID)) 
    $sql .= "AND fkRespondentID IN (SELECT fkRespondentID FROM tblRespondentSport WHERE fkSportID='$sportID')"; 
+0

उदाहरण कार्यान्वयन के लिए धन्यवाद + 1 – DanP

0

आप संग्रहित प्रक्रियाओं का उपयोग करते हैं, तो आप कुछ इस तरह कर सकते हैं:

CREATE PROCEDURE `FindRespondents` (
    IN `_day` varchar(255), 
    ... 
) 
BEGIN 
    SELECT DISTINCT fkRespondentID 
    FROM tblRespondentDayTime 
    WHERE (_day Is Null OR fldDay = _day) 
     AND ... 
END; 
| 

_day के लिए null में पासिंग का मतलब है किसी भी fldDay ठीक है। _day के लिए कोई अन्य मूल्य, और यह मेल खाना चाहिए। मुझे लगता है कि fldDay टेक्स्ट है, लेकिन निश्चित रूप से आप यहां सब कुछ ठीक से टाइप कर सकते हैं।

मुझे पता है कि कुछ लोग संग्रहीत प्रक्रियाओं के प्रशंसकों नहीं हैं, लेकिन यह इस तरह से क्वेरी तर्क को आसान तरीके से समाहित कर सकता है।

+0

मुझे लगता है कि यह तैयार कथन के साथ भी काम करेगा, अगर आप इस तरह से क्लॉज लिखते हैं, और उन पैरामीटर को '? 'S में बाध्य करते हैं। – grossvogel