未返回结果的有效SQL查询

时间:2016-12-20 作者:Craig

我试图从Wordpress数据库中检索一些主题的基本信息。但是,当查询运行时,它不会返回任何数据。如果我在Phpmyadmin上运行查询,它运行得很好。注意,wp\\u places\\u locator是由第三方插件使用的表。

function get_info($postid) {

global $wpdb;

$info = $wpdb->get_results($wpdb->prepare("SELECT post_id, address, phone, email FROM $wpdb->places_locator WHERE post_id = \'$postid\'"));

print_r($info);

}
谢谢!

2 个回复
最合适的回答,由SO网友:CodeMascot 整理而成

这里你做错了什么$wpdb->table_name. 它将只返回默认的WordPress表名。不是自定义表名称。当你打电话的时候$wpdb->prepare 然后将参数作为数组传递。因此,您的函数如下所示-

function get_info($postid) {

    global $wpdb;
    // Here I assumed that your table name is \'{$wpdb->prefix}places_locator\'
    $sql = $wpdb->prepare("SELECT post_id, address, phone, email 
                            FROM {$wpdb->prefix}places_locator 
                            WHERE post_id = \'%d\'", 
                            array( $postid )
                        );

    $info = $wpdb->get_results($sql);

    return $info;

}
现在如果你这样做了print_r 在…上get_info() 使用参数post ID,它将返回您的值。

使用方式如下-

print_r(get_info(1)); // Here I assumed your post ID is 1

SO网友:Cristiano Baptista

您不应该在SQL语句中直接放置变量,因为it is not safe

使用WPDB::prepare 您需要在SQL中放置无引号的占位符(如%s表示字符串或%d表示整数),然后在第一个参数(SQL语句)后按正确的顺序添加变量(以匹配占位符)。

以下是我上面链接的WordPress开发人员参考中的示例:

$wpdb->prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d", \'foo\', 1337 );
$wpdb->prepare( "SELECT DATE_FORMAT(`field`, \'%%c\') FROM `table` WHERE `column` = %s", \'foo\' );
要修复代码,类似这样的操作应该可以:

$info = $wpdb->get_results($wpdb->prepare("SELECT post_id, address, phone, email FROM $wpdb->places_locator WHERE post_id = %d", $postid));