php sql语句适用于多种条件的正确方法

时间:2012-03-31 08:35:14

标签: php mysql

我正在尝试编写一个返回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;
}
  

对不起家伙错误的语法输入

我对这个功能有两个担忧。

  1. 这是否是正确的做法?
  2. 当日期以01/03/2012格式传递时,此功能是否有效,因为如果两个日期都被选中,并且在第一个日期之后或结束日期之前,我会想要两个日期之间的结果?
  3. 我的意思是这是从日期中的sql获取数据的最佳方法吗?

    感谢您的帮助

5 个答案:

答案 0 :(得分:2)

你可能最好使用implode

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提供日期。

答案 1 :(得分:1)

1)不。你要覆盖字符串。我认为你的意思是$ blah。='blah';

2)不。它不会在引号中,因此MySQL会尝试将其解析为数字或实体名称。然后,如果它在引号中,那将是MySQL的无效格式化日期。

date()是你的朋友。

哦,而且,在SQL中它是1 = 1,而不是1 == 1.而且真的没有必要在这里使用,虽然我猜它有点使字符串构建更容易。 (我可能会构建一个数组并将其内爆,但这会更慢/更复杂。)

答案 2 :(得分:1)

1)使用“=”而不是“==”

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

2)如果它们是字符串或字符类型,则正确引用值:

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

答案 3 :(得分:0)

您需要在$ addquery中添加其他条件,因此您必须执行以下操作:

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

答案 4 :(得分: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;
}