我有一个插件文件夹foobar。
在这个插件中,我有一个名为foobar的页面。php。在这页里我有
global $wpdb;
$orderby = (!empty($_REQUEST[\'orderby\'])) ? $_REQUEST[\'orderby\'] : \'name\'; //If no sort, default to title
$sql = "SELECT * FROM wp_nc_location ORDER BY " . $orderby;
$data = $wpdb->get_results($sql);
此查询在我的foobar中工作。php页面。然而,在同一个文件夹中,我有另一个名为process的页面。php,当我包含相同的代码时:
global $wpdb;
$orderby = (!empty($_REQUEST[\'orderby\'])) ? $_REQUEST[\'orderby\'] : \'name\'; //If no sort, default to title
$sql = "SELECT * FROM wp_nc_location ORDER BY " . $orderby;
$data = $wpdb->get_results($sql);
我收到错误消息:
Fatal error: Call to a member function get_results() on a non-object in...
为什么全局$wpdb在另一个页面中似乎不起作用?(process.php)?
最合适的回答,由SO网友:Simon Wheatley 整理而成
这个$wpdb
对象是WordPress的一部分,所以不会像加载到WordPress模板那样加载到独立的PHP页面中。
你可能想调查一下creating your own page templates, 然后可以将数据库查询作为该页面模板的一部分运行。
附带说明:您当前信任用户的输入($_REQUEST
) 这是件坏事™, 因为它可能使您容易受到SQL注入攻击。您给出的代码示例可以进行如下调整,以减少易受攻击性:
global $wpdb;
$orderby = $_REQUEST[\'orderby\'];
// Limit the values of orderby to ones we know to be safe
$acceptable_orderbys = array( \'name\', \'age\', \'height\' );
if ( in_array( $orderby, $acceptable_orderbys ) )
$clean_orderby = $orderby;
else
$clean_orderby = \'name\';
$sql = "SELECT * FROM wp_nc_location ORDER BY $clean_orderby";
$data = $wpdb->get_results($sql);
我没有测试上述代码,但关键是检查
$orderby
在将其放入DB查询之前,它是安全的。