SQL 通过 if(!empty($_GET for Wordpress 查询

SQL query by if(!empty($_GET for Wordpress

我需要查询一个 wordpress 插件,但我自己搞不懂。我想通过类别 ID 限制 post,如果没有给出任何类别,则显示所有 post。我的 sql 是:

$sql = "
        SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.post_content, $wpdb->posts.post_excerpt, $wpdb->posts.post_name
        FROM $wpdb->posts
        LEFT JOIN $wpdb->term_relationships ON
        ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
        LEFT JOIN $wpdb->term_taxonomy ON
        ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
        WHERE $wpdb->posts.post_status = 'publish'
        AND $wpdb->posts.post_type = 'product'
        AND $wpdb->term_taxonomy.taxonomy = 'product_cat'".
        if(!empty($_GET["category"])) {
        "AND $wpdb->term_taxonomy.term_id = '".htmlspecialchars($_GET["category"])."'".
        }
        "ORDER BY post_date DESC";

如您所知,我正在尝试通过 url 获取类别 ID,例如 &category=12 但这给了我一个空白页面(没有错误或类似) 你们能帮我吗?

不能语句连接成表达式.您只能连接 表达式 ,因此您必须使用三元表达式:

"AND $wpdb->term_taxonomy.taxonomy = 'product_cat'".
(!empty($_GET['category']) ? 
    "AND $wpdb->term_taxonomy.term_id = '". htmlspecialchars($_GET["category"]) . "'" : '')
. "rest of query";

但实际上,这不是查询数据库的方式(它非常不安全......老实说)并且它很混乱,维护起来很糟糕, 你没有检查 isset $_GET 参数。

基本上,所有可以(并且可能应该)包含分号的内容都是一个语句:

$foo = "bar";//statement

这个简单的赋值语句由几个表达式组成,其中"bar"是一个。这个语句也恰好是一个表达式,但这不是重点。重点是:

if ($condition)
{
    //STATEMENT(S)
}

不是 一个表达式,所以它不能合并到一个语句中(就像你的情况一样,一个 assignmend查询字符串到名为 $sql).

的变量

警告

正如其他人指出的那样,您的查询是 vulnerable to injection. WP allows you to use prepared statements,您确实应该这样做:

$id = $_POST['some_value'];//check isset first, of course
$wpdb->query(
    $wpdb->prepare(
        'SELECT foo FROM bar WHERE id = %d',
        $id
    )
);

不能将 if 放在字符串中间。您可以使用连接赋值运算符添加到 $sql 变量。

$sql = "SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.post_content, $wpdb->posts.post_excerpt, $wpdb->posts.post_name
        FROM $wpdb->posts
        LEFT JOIN $wpdb->term_relationships ON
        ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
        LEFT JOIN $wpdb->term_taxonomy ON
        ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
        WHERE $wpdb->posts.post_status = 'publish'
        AND $wpdb->posts.post_type = 'product'
        AND $wpdb->term_taxonomy.taxonomy = 'product_cat'";

if(!empty($_GET["category"])) {
    $sql .= " AND $wpdb->term_taxonomy.term_id = '".htmlspecialchars($_GET["category"], ENT_QUOTES)."'";
}

$sql .= " ORDER BY post_date DESC";

我还在 htmlspecialchars() 中添加了 ENT_QUOTES 标志以将单引号转换为 '。这将增加对注入的保护,不允许人们输入单引号并注入他们自己的查询。

准备好的语句

查看 Elias 关于在 Wordpress 中使用准备好的语句的回答。准备好的语句比依赖任何就地函数来验证输入要安全得多。

感谢大家的付出。 @Devon 的代码运行良好。 顺便说一下,我正在为 Wordpress 的 Woocommerce 插件编辑 XML 导出脚本。

原始插件 link 是: https://wordpress.org/plugins/beslist-xml-feed-voor-woocommerce/

你可以在这里下载这个插件的编辑版本: https://github.com/eXspet/beslist-xml-edited

我改变了什么:

  • 您可以按类别获取 XML 个提要(显然,在您的帮助下)
  • 您可以在 XML 文件中查看 woocommerce 产品的图库图片。
  • 您可以看到每个产品的简短和完整描述
  • 您可以通过更改 <kur>USD</kur>
  • 来显示您的默认货币
  • 您可以通过 wordpress 管理面板查看所有 XML 个提要。

我不是编码员,所以我对安全性了解不多,如果您发现此插件中打开了任何安全性,请告诉我。再次感谢大家。