下面是SQL查询:
$simplelist = $wpdb->get_results("SELECT `Row1`, `Row2`
FROM `table`
WHERE `Row1` = " . $atts[text] . "
ORDER BY `Row1` ASC");
让我们假装我们是电脑,在脑海中运行它,首先发生的事情是:
$atts[text] // fatal error!
text
未定义,您缺少引号,但让我们修复它,我们会遇到一个新问题。如果此值为
test
结果是:
SELECT `Row1`, `Row2`
FROM `table`
WHERE `Row1` = test
ORDER BY `Row1` ASC
test
缺少引号,这就是您的查询无法工作的原因。
巨大的安全漏洞,你可能会想,“汤姆!让我们用引号括起来,一切都会好起来的!”,但我们有一个问题。不需要准备语句,所以我们所需要做的就是去掉引号并插入任意SQL语句。现在,呈现短代码的任何地方都可以用来转储任何表、删除表、修改数据等等。
要解决此问题并防止原始问题,请使用wpdb prepare,例如:
$table_name = "wp_myTable";
$myID = 12;
$wpdb->query( $wpdb->prepare( "UPDATE `$table_name` SET `your_column_1` = 1 WHERE `$table_name`.`your_column_id` = %d", $myID ) );
prepare
将确保以正确的格式和正确的数据类型将值安全插入到查询字符串中。
或者,您可以使用一个自定义的post类型,并通过免费的归档文件/URL/模板/UI/缓存/REST端点/等来避免所有痛苦