gpt4 book ai didi

PHP PDO语句过滤记录

转载 作者:可可西里 更新时间:2023-11-01 07:35:01 24 4
gpt4 key购买 nike

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

应用发送带有参数的 URL,如下所示:

http://..hidden domain./myfile.php?dia_inicio=16&dia_final=15&mes_inicio=11&mes_final=12&ano_inicio=2014&ano_final=2015

这意味着我正在寻找从 16Nov2014 到 15Dec2015 的事件。

这是我的 PHP 代码:

 $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 年 16 月 16 日至 2014 年 12 月 5 日(同年不同月份)和 2014 年 11 月 16 日至 2015 年 5 月 2 日(不同年份)?

稍后添加:

iOS 日志显示发送到 PHP 文件的 URL:

recuperar_eventos_dia.php?dia_inicio=11&dia_final=26&mes_inicio=11&mes_final=11&ano_inicio=2014&ano_final=2014

PHP 部分:

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

现在是表 tbagenda 的屏幕截图: enter image description here

最佳答案

我很抱歉你被这个不幸的表结构困住了。

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

// 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 就不需要转换它们来进行比较。然后还可以将它们编入索引。

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

// 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.....';
}

关于PHP PDO语句过滤记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27073542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com