首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP语句过滤记录

PHP语句过滤记录
EN

Stack Overflow用户
提问于 2014-11-22 02:54:42
回答 1查看 1.5K关注 0票数 4

我使用PDO通过JSON将对象检索到iOS应用程序。有一个带有事件对象的数据库表。它有三个字段来存储日、月和年。数据库的所有者不希望将日期存储在日期字段中,这意味着我必须处理它。

该应用程序发送一个带有params的URL,如下所示:

代码语言:javascript
复制
http://..hidden domain./myfile.php?dia_inicio=16&dia_final=15&mes_inicio=11&mes_final=12&ano_inicio=2014&ano_final=2015

这意味着我期待从2014年11月16日到2015年12月15日的活动。

这是我的PHP代码:

代码语言:javascript
复制
 $sql = 'SELECT * FROM tbagenda  WHERE  (dia_evento => :di AND mes_evento = :mi AND ano_evento = :ai) OR (dia_evento <= :df AND mes_evento = :mf AND ano_evento = :af) ';

    // use prepared statements, even if not strictly required is good practice
    $stmt = $dbh->prepare( $sql );
    $stmt->bindParam(':di', $dia_inicio, PDO::PARAM_INT);
    $stmt->bindParam(':df', $dia_final, PDO::PARAM_INT);
    $stmt->bindParam(':mi', $mes_inicio, PDO::PARAM_INT);
    $stmt->bindParam(':mf', $mes_final, PDO::PARAM_INT);
    $stmt->bindParam(':ai', $ano_inicio, PDO::PARAM_INT); 
    $stmt->bindParam(':af', $ano_final, PDO::PARAM_INT);
    // execute the query
    $stmt->execute();

    // fetch the results into an array
    $result = $stmt->fetchAll( PDO::FETCH_ASSOC );

    // convert to json
    $json = json_encode( $result );

    // echo the json string
    echo $json

我应该如何改变我的声明,使之适用于这样的日期:2014年11月16日至2014年11月28日(同月)、2014年11月16日至2014年12月5日(不同月份、同年)和2014年11月16日至2015年5月2日(不同年份)?

后加:

iOS日志以显示发送到的URL:

代码语言:javascript
复制
recuperar_eventos_dia.php?dia_inicio=11&dia_final=26&mes_inicio=11&mes_final=11&ano_inicio=2014&ano_final=2014

PHP部件:

代码语言:javascript
复制
$start = "$ano_inicio-$mes_inicio-$dia_inicio";
$end = "$ano_final-$mes_final-$dia_final";

// In the SQL, concatenate the columns to make a YYYY-MM-DD date string
// and cast it to a MySQL DATE type.
// That makes it possible to use BETWEEN
$sql = 'SELECT 
  *
FROM tbagenda  
WHERE STR_TO_DATE(CONCAT_WS('-', ano_evento, mes_evento, dia_evento), "%Y-%m-%d") 
     BETWEEN :start AND :end';

// Bind and execute the statement with 2 parameters:
$stmt = $dbh->prepare( $sql );
$stmt->bindParam(':start', $start, PDO::PARAM_STR);
$stmt->bindParam(':end', $end, PDO::PARAM_STR);
$stmt->execute();

// fetch, etc...
$result = $stmt->fetchAll( PDO::FETCH_ASSOC );

        // convert to json
        $json = json_encode( $result );

        // echo the json string
        echo $json;

现在有张桌上的截图:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-22 03:07:48

很抱歉你被这个糟糕的桌子结构困住了。

我建议将表的列连接起来,形成可用的日期字符串,并通过MySQL内置的函数STR_TO_DATE()将它们转换为日期值。对查询字符串输入值进行同样的操作,以便与BETWEEN运算符进行适当的日期比较。

代码语言:javascript
复制
// Begin by concatenating the input values into single date strings YYYY-MM-DD
$start = "$ano_inicio-$mes_inicio-$dia_inicio";
$end = "$ano_final-$mes_final-$dia_final";

// In the SQL, concatenate the columns to make a YYYY-MM-DD date string
// and cast it to a MySQL DATE type.
// That makes it possible to use BETWEEN
$sql = "SELECT * 
        FROM tbagenda  
        WHERE STR_TO_DATE(CONCAT_WS('-', ano_evento, mes_evento, dia_evento), '%Y-%m-%d') 
          BETWEEN :start AND :end";

// Bind and execute the statement with 2 parameters:
$stmt = $dbh->prepare( $sql );
$stmt->bindParam(':start', $start, PDO::PARAM_STR);
$stmt->bindParam(':end', $end, PDO::PARAM_STR);
$stmt->execute();

// fetch, etc...
$result = $stmt->fetchAll( PDO::FETCH_ASSOC );

字符串操作将影响此查询的性能。如您所知,如果将日期存储为适当的DATE,这样MySQL就不需要将它们转换为比较,这会更好。然后,它们也可以被编入索引。

还请注意,我没有包括日期字符串的验证。您可以考虑检查它们,以确保它们在执行查询之前确定了有效日期。

代码语言:javascript
复制
// strtotime() would return false for invalid date strings...
if (strtotime($start) && strtotime($end)) {
  // The dates are valid, and so you can proceed with the query
  $sql = 'SELECT.....';
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27073542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档