2012-03-31 2 views
0

私は私が持っているのPHPのSQLなステートメント

を入力して、間違った構文についてはsql声明

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; 
} 

のようなごめん男を返す一つの関数を記述しようとしていますこの機能に関する2つの懸念。

  1. これは適切なアプローチですか、そうではありませんか?
  2. 日付が01/03/2012形式で渡された場合、この関数は機能しますか?私は2つの日付の間で結果が欲しいと思っています。

これは、日付の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

+0

@ Cobin Ta、良好なスポット。投稿を編集しました。 – liquorvicar

1

1)いいえ。文字列を上書きしています。あなたは$ blah。= 'blah'を意味すると思います。

2)Nope。引用符で囲まれていないので、MySQLは数字またはエンティティ名として解析しようとします。その後、引用符で囲まれていれば、MySQLのフォーマットが無効になります。

date()はあなたの友人です。

また、SQLでは1 = 1ではなく、1 == 1ではありません。実際には、ここで使用する必要はありません。 (私はおそらく配列を作成し、それを内破が、それは、より遅い/より複雑になります。)

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() 機能を使用して作ります。あなたが以下のようにしなければならないので、あなたは、$ addqueryに追加条件を追加する必要があり

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

4)ご希望の時間に、すべての条件をチェックする場合は、その後のような適切なconcatenationを行う

$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; 
} 
関連する問題