web-dev-qa-db-fra.com

Obtenir une ligne aléatoire de la table personnalisée

J'ai un tableau personnalisé où je stocke les citations et l'auteur:

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); }

Ensuite, je veux obtenir une seule ligne avec citation et auteur à afficher.

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];

}

Qu'est-ce qui ne va pas? Quel est le moyen le plus efficace d’obtenir des lignes aléatoires à partir d’une table personnalisée?

1
Greg Skala

[Note: @ marwyk87 a posté sa réponse pendant que je composais ceci, ce qui représente un autre moyen de résoudre le problème]

Vous avez une simple erreur de syntaxe dans votre code SQL, à cause de la façon dont vous faites référence au nom de la table. Tu devrais juste dire

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

et

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

Je pense que vous pourriez avoir un problème de syntaxe dans votre TSQL. Si tu fais

$table_name = $wpdb->prefix . 'quotes';

alors vous pouvez avoir

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