gpt4 book ai didi

php - Wordpress wpdb->从表单准备 sql 字符串

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

我目前正在使用自定义 wordpress 表来存储外部 xml 提要,并且需要通过具有多个选项的基本 html 表单来过滤此信息。

解决此问题并使用 wpdb->prepare 构建字符串的最佳方法是什么?我正在使用下面的分页,$user_query 当前设置为 $user_query .= "ANDquery1LIKE $query1 "; 等。

但是我觉得这可能会导致问题,因为我没有通过第二个参数来完成它,例如 %d$variable 等。

//Get Results
$results = $wpdb->get_results(
$wpdb->prepare("SELECT * FROM `feed` WHERE `price` != 0 $user_query LIMIT %d,
%d", $offset, $items_per_page, OBJECT)
);

我希望以上是有道理的。我只是尝试从 $_GET 值的形式构建 SQL 查询,没有 SQL 注入(inject)问题。

非常感谢

最佳答案

您可以在部分查询上调用$wpdb->prepare:

$user_query = $wpdb->prepare('AND query1 LIKE %s', $query1);

您还可以直接在用户输入上调用 esc_sql 来清理它。

此外,LIKE 表达式需要单独转义:

https://codex.wordpress.org/Class_Reference/wpdb/esc_like

$wpdb->e​​sc_like 转义特定于 like 表达式的字符 (%,\, _),但不进行任何额外的转义。在转义 like 表达式后,您仍然需要调用 prepareesc_sql

更新:使用评论中的这个例子:

$user_query = $_GET['query1']; 
$user_query2 = $_GET['query2'];

$user = $wpdb->prepare('AND query1 = %s ', $user_query);
$user2 = $wpdb->prepare('AND query2 = %s ', $user_query2);

$results = $wpdb->get_results( $wpdb->prepare('SELECT * FROM test WHERE price != 0' . $user . $user2 . 'LIMIT 20') );

在这里,分段构建查询没有任何意义,您可以像这样构建查询:

$query = 'SELECT * FROM test 
WHERE price != 0
AND query1 = %s
AND query1 = %s
LIMIT 20';
$results = $wpdb->get_results( $wpdb->prepare($query, $user_query, $user_query2) );

为了举例,我假设用户查询是可选的。如果是这种情况,那么只有在提供参数的情况下,您才需要单独准备 WHERE 条件:

$query = 'SELECT * FROM test 
WHERE price != 0';

if($user_query) {
$cond = $wpdb->prepare(' AND query1 = %s', $user_query);
$query .= $cond;
}

if($user_query2) {
$cond = $wpdb->prepare(' AND query2 = %s', $user_query2);
$query .= $cond;
}

$query .= ' LIMIT 20';
$results = $wpdb->get_results( $query );

请注意,将查询传递给 get_results 时无需调用 prepare,因为所有用户输入均已清理。

关于php - Wordpress wpdb->从表单准备 sql 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29497291/

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