web-dev-qa-db-ja.com

SQLクエリで独自のモジュールブロックを作成する際の問題

ビュー2モジュールでは実行できなかったものを表示するためのブロックを実装するカスタムモジュールを作成しようとしています。
いくつかのガイドとチュートリアルを確認しようとしましたが、まだ結果が出ていません。

最初の行の最初のSELECT属性を出力できます。最初の行はループしないので意味がありますが、それでも残りの方法について混乱しています。

function sn_most_contributed_block($op='list', $delta=0) {
  if ($op == "list") {
    // Generate listing of blocks from this module, for the admin/block page
    $block = array();
    $block[0]["info"] = t('Most Contribution this week (custom module');
    return $block;
  } 
  elseif ($op == 'view') {    
    $mce = db_result(
      db_query("SELECT node.uid, COUNT(nid), users.picture AS users_picture, users.uid AS users_uid, users.name AS users_name, users.mail AS users_mail FROM node node INNER JOIN users users ON node.uid = users.uid WHERE (node.type IN ('leads',  'qa',  'qa_comments',  'til_salg',  'tips_tricks')) AND node.created >= UNIX_TIMESTAMP( CURDATE( ) - INTERVAL 1 WEEK ) AND node.created <= UNIX_TIMESTAMP( CURDATE( ) + INTERVAL 1 DAY ) GROUP BY uid ORDER BY COUNT(nid) DESC LIMIT 0 , 5")
    );

    $block_content .= "Most contributed members are: " . $mce';
    $block_content .= "<div class='author picture profile_image'>In here should be the user image</div>";
    $block_content .= "<div id='username'>In here should be the username</div>";

    if ($block_content == '') {   
      $block['subject'] = 'contribution test';
      $block['content'] = 'yay';
      return $block;
    }
    else {
      // set up the block  
      $block = array();
      $block['subject'] = 'Most contribution this week';  
      $block['content'] = $block_content;
      return $block;
    }
  }
}

I’ve tested my query in the database environment for my Drupal site and it works and print everything it should out correctly.

For looping the query, I tried this code with no result.

while ($contriUser = db_fetch_object($mce)) {
  $contriUser [] = $contriUser->uid;
}

I have also tried the following code.

while ($contriUser = db_fetch_object($mce)) {
  var_dump($contriUser);
}

これを解決する方法、または最も貢献度の高いメンバーを過去7日間獲得するための代替ソリューションがある場合は、ご協力いただければ幸いです。

2
Mestika

ほとんどの貢献メンバーは ser pointsmodules を見たいと思うかもしれませんが、非常に素晴らしい機能がたくさんあります。

あなたが尋ねているようにあなたのコードでいくつかのクイックポインタ。

クエリはパラメーターを使用し、drupal コーディング標準 に従ってフォーマットする必要があります。これは、セキュリティと移植性の向上に役立ちます。コーダーモジュールは、これを支援します。

結果を取得するには、おそらくループで db_fetch_array のようなものが必要になります

 $result_set = db_query("SELECT ...");
 while ($result = db_fetch_array($result_set)) {
   $block_content .= ...;
 }

これが少しお役に立てば幸いです。

2
Jeremy French

興味深い部分にいくつか変更を加えました。このテストされていないコードをチェックしてください:

$block_content = "";
$result_set = db_query("SELECT node.uid, 
  COUNT(nid), 
  users.picture AS users_picture, 
  users.uid AS users_uid, 
  users.name AS users_name, 
  users.mail AS users_mail 
  FROM {node} 
  INNER JOIN {users} ON node.uid = users.uid 
  WHERE (node.type IN ('leads',  'qa',  'qa_comments',  'til_salg',  'tips_tricks')) 
  AND node.created >= UNIX_TIMESTAMP( CURDATE( ) - INTERVAL 1 WEEK ) 
  AND node.created <= UNIX_TIMESTAMP( CURDATE( ) + INTERVAL 1 DAY ) 
  GROUP BY uid 
  ORDER BY COUNT( nid ) DESC 
  LIMIT 0 , 5"
);

$block_content .= t("Most contributed members are: ");
while ($result = db_fetch_array($result_set)) {
  $block_content .= '<div class="author picture profile_image"><img src="'.$result['users_picture'].'"/></div>';      
  $block_content .= '<div id="username">'.$result['users_name'].'</div>';
}
1
nonsenz