web-dev-qa-db-fra.com

$ wpdb ne semble pas fonctionner sur la page d'un plugin

J'ai un dossier de plugin foobar.

A l'intérieur de ce plugin, j'ai une page appelée foobar.php. Dans cette page j'ai

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

Cette requête fonctionne dans ma page foobar.php. Cependant, dans le même dossier j'ai une autre page appelée process.php, et quand j'inclus le code identique :

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

Je reçois le message d'erreur:

Fatal error: Call to a member function get_results() on a non-object in...

Pourquoi la $ wpdb globale ne semble-t-elle pas fonctionner dans l'autre page? (process.php)?

1
redconservatory

L'objet $wpdb fait partie de WordPress. Par conséquent, il ne serait pas chargé dans une page autonome PHP telle quelle dans un modèle WordPress.

Vous voudrez peut-être examiner la création de vos propres modèles de page , puis vous pourrez exécuter votre requête de base de données dans le cadre de ce modèle de page.

Remarque: vous faites actuellement confiance à l’utilisateur ($_REQUEST), qui est un Bad Thing ™, car cela pourrait vous rendre vulnérable aux attaques par injection SQL. L'exemple de code que vous donnez pourrait être adapté comme ci-dessous pour être moins vulnérable:

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

Je n'ai pas testé le code ci-dessus, mais l'essentiel est de vérifier si la valeur de $orderby est sûre avant de l'insérer dans la requête de base de données.

4
Simon Wheatley