我已经创建了一个带有属性的简短代码函数,以检查是否正确处理了属性。就是这样,现在我想在SELECT语句中使用该属性。但是数据库没有提供任何值。在WHERE条件下没有变量的SQL语句是可以的。
为了测试短代码,我在Wordpress文本页面中添加了这三行代码,但它们都不起作用:
[simplelist text=Beatles]
[simplelist text='Beatles']
[simplelist text="Beatles"]
下面是我来自functions.php的代码:
'',
), $atts);
global $wpdb;
$simplelist = $wpdb->get_results("SELECT `Row1`, `Row2`
FROM `table`
WHERE `Row1` = " . $atts[text] . "
ORDER BY `Row1` ASC");
$Result = .... some stuff here ...
return $Result;
}
add_shortcode('simplelist', 'get_list' );
?>
当我移除WHERE条件时,我得到了完整的表结果。我需要在WHERE条件下使用属性值方面的一些帮助。
发布于 2018-03-09 16:18:07
下面是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准备,例如:
$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端点/等等。
发布于 2018-03-09 16:11:48
首先,您似乎收到了mysql错误。$attr[text]
是一个字符串,所以您需要用简单的引号包装它:
Row1 = '{$atts[text]}'
然后,默认情况下,$wpdb->get_results()
函数返回一个对象。
如果您希望结果是一个PHP数组:
使用
ARRAY_A
作为第二个参数,如:$wpdb->get_results( $query, ARRAY_A );
Complete函数
function get_list( $atts )
{
$atts = shortcode_atts( array(
'text' => '',
),
$atts );
global $wpdb;
$query = "SELECT Row1, Row2 FROM table WHERE Row1 = '{$atts[text]}' ORDER BY Row1 ASC ;";
$results = $wpdb->get_results( $query, ARRAY_A );
if( !empty( $results ) ){
if( count( $results === 1 ) ){
return $results[0];
}else{
return $results;
}
}else{
return false;
}
}
https://wordpress.stackexchange.com/questions/296366
复制相似问题