web-dev-qa-db-fra.com

Aide pour la conversion de requêtes MySQL en WPDB

J'ai un problème. J'ai un script PHP qui enregistre les téléchargements de fichiers individuels et je cherche un moyen d'afficher ce nombre dans des messages individuels. J'ai une solution à moitié cuite - un script de connexion manuelle MySQL classique, mais j'essaie de le convertir pour l'utiliser comme plugin Wordpress (je veux qu'il utilise WPDB). J'ai essayé de le convertir, mais je ne sais pas quelle est l'alternative Wordpress à 'mysql_fetch_array.' Quoi qu'il en soit, j'ai inclus le script original ci-dessous, ainsi que mes progrès sur une version compatible Wordpress.

Version simple:

function mb_download_count() {
    global $post;
    if (get_post_meta($post->ID, 'zipname', TRUE)) {
        $namemeta = get_post_meta($post->ID, 'zipname', TRUE);

        require $_SERVER['DOCUMENT_ROOT'].'/downloader-connect.php';
        $result = mysql_query("SELECT * FROM mb_download_manager
                                    WHERE filename='".$namemeta.".Zip'");  

            // get the first (and hopefully only) entry from the result
        $row = mysql_fetch_array( $result );
            // Print out the contents of each row into a table 
        if ($row['downloads'] == '') { echo ('0'); } else {
        echo $row['downloads']; }
        } else { }
}

Version Wordpress conviviale jusqu'à présent:

function mb_download_count() {
    global $wpdb;
    global $post;
    if (get_post_meta($post->ID, 'zipname', TRUE)) {
        $namemeta = get_post_meta($post->ID, 'zipname', TRUE);

        $result = $wpdb->query("SELECT * FROM mb_download_manager
                                    WHERE filename='".$namemeta.".Zip'");  

        $row = mysql_fetch_array( $result );
        if ($row['downloads'] == '') { echo ('0'); } else {
        echo $row['downloads']; }
        } else { }
}
1
Matt

Au lieu d'utiliser $wpdb->query(), utilisez $wpdb->get_results(). Cette méthode vous permet de spécifier un type de retour afin que la requête soit renvoyée sous forme de tableau associatif. Par exemple ...

$results = $wpdb->get_results(
    "SELECT * FROM mb_download_manager
     WHERE filename='" . $namemeta . ".Zip'",
    ARRAY_A
);

Cela vous retournera un tableau indexé de tableaux associatifs ... afin que vous puissiez parcourir les résultats:

foreach( $results as $row ) {
    if ( $row['downloads'] == '') // ... and so on

Si vous êtes bloqué, revérifiez la documentation du Codex .

Modifier 1/13

Si vous voulez ajouter tous les téléchargements, vous devez faire deux choses:

  1. Garder un total cumulé
  2. Convertissez correctement votre variable sous forme de nombre.

Donc, avant de faire votre boucle foreach, déclarez un compteur de téléchargements:

$counter = 0;
foreach( $results as $row ) {
    // etc ...

Cette variable tiendra un total cumulé de vos téléchargements.

Ensuite, vous devez ajouter le nombre de téléchargements à votre compteur:

$counter = 0;
foreach( $results as $row ) {
    $counter += intval( $row['downloads'] );
    // etc ...

La fonction intval() prendra une variable mixte et renverra sa valeur entière. Donc, la chaîne "0" devient l'entier 0. Cela vous permet réellement d'ajouter les résultats plutôt que de concaténer les chaînes (par exemple, "1" + "2" = "12" mais 1 + 2 = 3).

1
EAMann

Étant donné que vous ne voulez qu'une seule valeur d'une seule colonne, vous pouvez utiliser la méthode get_var à la place de la méthode de requête. Ainsi, vous n'avez pas besoin de boucler les résultats (vous obtenez le résultat sous forme de chaîne). Donc, dans votre cas, vous feriez quelque chose comme:

$downloads = $wpdb->get_var($wpdb->prepare("SELECT downloads FROM mb_download_manager WHERE filename=%s", $namemeta.".Zip"));

Ensuite, vous pouvez simplement faire écho au résultat:

echo $downloads;

Voir la page du codex wpdb , qui contient également une longue liste de méthodes wpdb supplémentaires pouvant être utilisées, en fonction de votre situation. Certaines d'entre elles, comme la méthode insert, sont beaucoup plus faciles à utiliser que l'écriture directe de code SQL.

Oh, notez également l'utilisation de la méthode de préparation, qui aide à prévenir les injections et les déchets indésirables. Ce n'est pas obligatoire, mais c'est une bonne pratique. Notez également que cette table doit figurer dans votre base de données WordPress.

1
MathSmath