2012-03-31 59 views
0

我試圖寫一個函數返回sql聲明PHP SQL statment正確計算策略

function get_sql($name=0,$date_start=0,$date_end=0) 
{ 

$addQuery=" where 1=1";   
      if($name>0) 
     { 
      $addQuery .=" and name=".$name; 
     } 


       if($date_start>0) 
     { 

      $addQuery.=" and date >=".$date_start; 
     } 

       if($date_end >0) 
     { 

      $addQuery.=" and date<=".$date_end; 
     } 

      $query="select * from TABLE_ARTICLE".$addQuery; 

return $query; 
} 

對不起你們了錯誤的語法鍵入

我有關於這個功能的兩個問題。

  1. 這是正確的方法嗎?
  2. 當日期將以01/03/2012的格式傳遞時,這個函數是否可以正常工作,您可以看到我希望兩個日期之間的結果(如果兩個日期都被選中並且在第一次日期之後或結束日期之前?

我的意思是這是從日期的SQL獲取數據的最佳方式?

感謝您的幫助

回答

2

你可能使用爆

function get_sql($name=0,$date_start=0,$date_end=0) 
{ 

    $whereClauses = array();   
    if($name>0) 
    { 
     $whereClauses[] = "name='$name'"; 
    } 

    if($date_start>0) 
    { 
     $whereClauses[] = "date >='$date_start'"; 
    } 

    if($date_end >0) 
    { 
     $whereClauses[] = "date<='$date_end'"; 
    } 

    $query="select * from TABLE_ARTICLE"; 
    if(!empty($whereClauses)) 
    { 
     $query.= ' WHERE ' . implode(' AND ', $whereClauses); 
    } 

    return $query; 
} 

還請注意,我有現狀會更好因爲它們中沒有一個看起來是整數值。

至於日期格式,MySQL將不會識別您所指定的格式。您需要將YYYY-MM-DD(或可能的unix時間戳)格式的日期提供給MySQL。

+0

錯過了[]在$ whereClauses。 – Corbin 2012-03-31 08:52:55

+0

@Corbin Ta,很好的地方。已編輯帖子。 – liquorvicar 2012-03-31 08:53:54

1

1)否。您正在覆蓋字符串。我想你是指$ blah。='blah'; 2)不可以。它不會被引用,因此MySQL會嘗試將其解析爲數字或實體名稱。然後,如果它是在引號中,它將是MySQL的無效格式日期。

date()是你的朋友。

哦,還有,在SQL中它是1 = 1,而不是1 == 1.真的沒有必要在這裏使用,儘管我猜它有點讓字符串構建更容易。 (I可能會建立一個數組,內爆它,但是這將是慢/更加複雜。)

1

1)使用 「=」,而不是 「==」

$addQuery=" where 1==1"; => $addQuery=" where 1=1"; 

2)引用的值正確,如果他們是字符串或char類型:

$addQuery=" and name=".$name; => $addQuery=" and name='".$name."'"; 

3)數據庫中的表和PHP變量確認日甲讓他們使用相同或date_format()date() 功能。

4)如果你想在同一時間檢查所有條件,那麼做適當concatenation,如:

if($name>0) { $addQuery.=" and name=".$name; } 
    if($date_start>0){ $addQuery.=" and date >=".$date_start; } 
    ...... 
0

您需要添加附加條件,以$的AddQuery,所以你必須如下操作:

$addQuery .=" and name=".$name; 
    $addQuery .=" and date >=".$date_start; 
    $addQuery .=" and date<=".$date_end; 
0

這是我會怎麼做它:

function get_sql($name = null, $date_start = null, $date_end = null) 
{   
    $where = array(); 

    if($name !== null) 
    { 
     $where[] = "name='".mysql_real_escape_string($name)."'"; 
    } 


    if($date_start !== null) 
    { 
     $where[] = "date >= STR_TO_DATE('".$date_start."', '%d/%m/%Y')"; 
    } 

    if($date_end !== null) 
    { 
     $where[] = "date <= STR_TO_DATE('".$date_end."', '%d/%m/%Y')"; 
    } 

    $query = "select * from TABLE_ARTICLE"; 

    if(count($where) > 0) { 
     $query .= " WHERE ".implode(' AND ', $where); 
    } 

    return $query; 
}