返回

WordPress 中 $wpdb->get_results() 返回空数组的难题与解决之道

php

解决 $wpdb->get_results 在 WordPress 中返回空数组的难题

引言

对于 WordPress 开发者来说,$wpdb->get_results 是一个必不可少的函数,用于从数据库中检索数据。然而,当涉及到处理日期参数时,它可能会导致一个棘手的难题:返回一个令人困惑的空数组,即使数据库中有匹配的记录。

问题

根源在于日期值未正确转义,导致 SQL 查询无效。当从函数外部传递日期参数时,会忽略引号,让日期值以裸露形式出现在查询中。

解决方案

解决之道在于使用 $wpdb->prepare() 函数,它可以自动转义日期值,确保 SQL 查询的正确性。通过将日期值作为 %s 占位符传递,$wpdb->prepare() 会对其进行适当的转义。

修改后的代码

$events_list = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table WHERE date = %s", $day ), ARRAY_A );

注意事项

  • 确保日期值传递为字符串(例如:'2017-03-30')。
  • 检查潜在的 SQL 注入漏洞。
  • 有关更多信息,请参阅 WordPress Codex 中的 $wpdb->prepare() 文档

额外提示

  • 使用 Prepared Statements 可以防止 SQL 注入攻击。
  • 考虑使用 WordPress Date API 来处理日期值。
  • 对于复杂的日期查询,可以使用 WHERE BETWEEN 子句。

常见问题解答

1. 为什么我无法使用 $wpdb->query() 函数?

$wpdb->get_results() 返回查询结果,而 $wpdb->query() 仅返回受影响的行数。

2. 我可以将日期值作为参数直接传递吗?

不,建议使用 $wpdb->prepare() 来避免 SQL 注入漏洞。

3. 我如何在查询中使用范围日期?

使用 WHERE BETWEEN 子句,如下所示:

$events_list = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $table WHERE date BETWEEN %s AND %s", $start_date, $end_date ), ARRAY_A );

4. 如何检查 SQL 查询是否有问题?

使用 echo $wpdb->last_query; 查看实际执行的 SQL 查询。

5. 我还可以使用其他方法来转义日期值吗?

是的,您可以使用 mysql_real_escape_string() 函数或 addslashes() 函数。但是,建议使用 $wpdb->prepare() 因为它是最安全的。

结论

通过理解 $wpdb->get_results() 函数在处理日期参数时的细微差别,您可以避免返回空数组的烦恼,并有效地从 WordPress 数据库中检索数据。通过遵循这些最佳实践,您可以确保您的代码健壮可靠,为您的用户提供最佳体验。