web-dev-qa-db-ja.com

MySQLからWPDBへのクエリ変換に役立つ

私は問題があります。個々のファイルのダウンロードを追跡するPHPスクリプトがあります。個々の投稿にその番号を表示する方法を探しています。私は半分手っ取り早い解決策 - 普通のMySQL手動接続スクリプトを持っていますが、私はそれをWordpressプラグインとして使うために変換しようとしています(私はそれにWPDBを使いたいです)。 変換しようとしましたが、 'mysql_fetch_array'に代わるWordpressのバージョンがわかりません。とにかく、元のスクリプトを含めました。以下に、Wordpressにやさしいバージョンでの私の進歩と同様に。

プレーンバージョン:

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 { }
}

これまでのWordpress用のバージョン:

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

$wpdb->query()を使用する代わりに、$wpdb->get_results()を使用してください。このメソッドでは、クエリが連想配列として返されるように戻り型を指定できます。例えば ​​...

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

これは連想配列のインデックス付き配列を返します...そのため、結果を繰り返し処理できます。

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

動けなくなった場合は、 Codexのドキュメント を再確認してください。

1/13を編集

すべてのダウンロードを集計したい場合は、2つのことをする必要があります。

  1. 積算合計を維持する
  2. 変数を正しく数値としてキャストしてください。

foreachループを実行する前に、ダウンロードカウンタを宣言してください。

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

この変数はダウンロードの現在の合計を保持します。

次に、ダウンロード数をカウンターに追加する必要があります。

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

intval() 関数は混合変数を取り込んでその整数値を返します。そのため、文字列"0"は整数0になります。これにより、文字列を連結するのではなく、実際に結果を追加することができます(たとえば、"1" + "2" = "12"1 + 2 = 3)。

1
EAMann

単一の列から単一の値を取得したいだけなので、queryメソッドの代わりにget_varメソッドを使用できます。そうすれば、結果をループする必要はありません(結果を文字列として取得します)。だからあなたの場合は、次のようにします。

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

それからあなたはただ結果をエコーすることができます:

echo $downloads;

wpdb codexページ を参照してください。ここには、状況に応じて使用できるその他のwpdbメソッドの長いリストもあります。 insertメソッドのようなそれらのいくつかは、ストレートなSQLを書くよりはるかに使いやすいです。

ああ、また、prepareメソッドの使用に注意してください。これはインジェクションやジャンクを防ぐのに役立ちます。必須ではありませんが、それは良い習慣です。このテーブルはあなたのWordPressデータベースにある必要があることにも注意してください。

1
MathSmath