SQL查询if(!empty($ _ GET for Wordpress)

时间:2015-01-23 15:47:39

标签: php mysql wordpress

我需要对wordpress插件进行查询,但我无法通过自己解决这个问题。我希望按类别ID限制帖子,如果没有给出任何类别,则显示所有帖子。我的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";

正如您所理解的那样,我正在尝试通过网址获取类别ID,例如& category = 12 ,但那会给我一个空白页面(没有错误或类似内容)你们可以帮助我吗?是什么?

3 个答案:

答案 0 :(得分:3)

无法语句连接到 表达式 。您只能连接表达式,因此您必须使用三元组:

"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)
}

表达式,因此无法将其合并到单个语句中(就像您的情况一样,将查询字符串赋值给a变量名为$sql)。

<强> 警告

正如其他人所指出的那样,您的查询是vulnerable to injection。 WP允许你使用prepared statements,你真的应该这样做:

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

答案 1 :(得分:1)

你不能把一个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标志,将单引号转换为&#039;。这样可以增加对注入的保护,不允许人们输入单引号并注入自己的查询。

准备好的陈述

看看Elias&#39;回答使用Wordpress准备好的语句。准备好的陈述比依靠任何就地功能验证输入更安全。

答案 2 :(得分:0)

感谢所有人提供的帮助。 @Devon的代码非常好用。 顺便说一下,我正在为Wordpress的Woocommerce插件编辑XML Export脚本。

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

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

我改变了什么:

  • 您可以按类别获取XML Feed(显然可以使用您的帮助)
  • 您可以在XML文件中查看woocommerce产品的图库图片。
  • 你可以看到短片&amp;每种产品的完整描述
  • 您可以通过更改<kur>USD</kur>
  • 来显示您的默认货币
  • 您可以通过wordpress管理面板查看所有XML Feed。

我不是编码员,所以我对安全性了解不多,如果你发现这个插件有任何安全性,请告诉我。再次感谢大家。