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 个提要。
我不是编码员,所以我对安全性了解不多,如果您发现此插件中打开了任何安全性,请告诉我。再次感谢大家。
我需要查询一个 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 个提要。
我不是编码员,所以我对安全性了解不多,如果您发现此插件中打开了任何安全性,请告诉我。再次感谢大家。