从定制表中获取随机行

时间:2017-03-02 作者:Greg Skala

我有一个自定义表,用于存储引号和作者:

function quote_install(){
global $wpdb;
global $quote_db_version;
$table_name = $wpdb->prefix . \'quote\'; 

// create sql your table             
$sql = "CREATE TABLE " . $table_name . " (
  ID int(11) NOT NULL AUTO_INCREMENT,
  time datetime DEFAULT \'0000-00-00 00:00:00\' NOT NULL,   
  quote text NOT NULL,
  author text NOT NULL,
  qtag ENUM(\'G\', \'W\', \'Z\', \'H\', \'M\') NOT NULL default \'G\',
  PRIMARY KEY  (ID)
);";

require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
dbDelta($sql); }
然后,我想获得要显示的带有引号和作者的单行。

function read_single_Quote( $id=NULL ) {
global $wpdb;

 $table_name = $wpdb->prefix . \'quotes\';
// random select
 if($id ==NULL){
    $sql = $wpdb->prepare( "
        SELECT *
        FROM {$wpdb->prefix}\'quotes\'
        ORDER BY RAND()
        LIMIT 1
    ");
 } //get the row id = $id
else {
    $sql = $wpdb->prepare( "
    SELECT *
    FROM {$wpdb->prefix}\'quotes\'
    WHERE ID = %d
    LIMIT 1
    ", $id );
 }

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

// databse error, return false
if ( ! $result ) { return false; }

// return first result
return $result[0];
}

怎么了?从自定义表中获取随机行的最有效方法是什么?

2 个回复
SO网友:Paul \'Sparrow Hawk\' Biron

[注:@marwyk87在我写这篇文章时发布了他的答案,这代表了解决问题的另一种方法]

由于引用表名的方式,SQL中出现了一个简单的语法错误。你应该说

$sql = $wpdb->prepare( "
    SELECT *
    FROM {$wpdb->prefix}quotes
    ORDER BY RAND()
    LIMIT 1
    ");
以及

$sql = $wpdb->prepare( "
    SELECT *
    FROM {$wpdb->prefix}quotes
    WHERE ID = %d
    LIMIT 1
    ", $id );

SO网友:marwyk87

我认为您的TSQL中可能存在语法问题。如果你这样做

$table_name = $wpdb->prefix . \'quotes\';
那你就可以

$sql = $wpdb->prepare( "
    SELECT *
    FROM ".$table_name."
    ORDER BY RAND()
    LIMIT 1
");

相关推荐

如何像使用wpdb一样使用MySQL?

根据标题,我需要使用LIKE操作符以编程方式使用$wpdb删除db上的一行。我想使用$wpdb->delete 消除发生的情况,但我不知道如何设置LIKE 操作员,因为在WHERE 它需要一个指定单个值或另一个数组的数组。我问你这个语法是否正确。$wpdb->delete(\'wp_posts\', array(\'post_type\' => \'flamingo_inbound\', \'post_content\' => \'%\'.$mail.\'%\'));提前感谢