2012-04-08 10 views
0

私は達成しようとしているものと同様の(しかし同じではない)多くのフォーラムや質問をしてきました。私は古いmysqlクエリをPDOに更新しています。私は、PDOでCOUNT(*)を使用することに問題がある人や、fetch()の代わりにquery()を使用する方法、またはrowCount()を使用する方法やfetchColumn()を使用する方法について説明しています。PDOを使用してMySQLデータベースの列にある項目のインスタンス数を取得する

ただし、問合せが問合せ内の行のいずれか(ゼロ)を戻すかどうかを確認するためのものです。たぶん、クエリが有効かどうかをテストしたり、単一のクエリが返す行の数をリストした単一の行を返すことがありますか?それは私がやろうとしていることではない(あるいは私は間違っていると思っている)。

私が達成したいのは、各ユニークなアイテムが特定の列に何回出現するかのリストを取得することです。私はペイントボールのウェブサイトを持っています。そこでは、各カテゴリーにいくつのアイテムがあるかをリストしたいと思います。 (簡略化のために切り取ら)古いMySQLのコードは次のようなものだ:

$query = "SELECT Category, COUNT(*) FROM table WHERE Notes NOT LIKE 'Discontinued' GROUP BY Category"; 
    $result = mysql_query($query); 
    $num_results = $result->num_rows; 

    while($row=mysql_fetch_array($result, MYSQL_NUM)) { 
    echo "$row[0]: $row[1]<br />"; 
    } 

私の結果は次のようになります。

航空:312
マーカー:627の
マスク:124
ペイント:97

今私はPDOで同じ結果を達成しようとしており、他の質問から引き出した約12の異なる提案を試みました尋ねた私は通常、自分自身でこれらの問題をハックするのが好きです。これは、タオルを投げて、実際にPHPフォーラムで自分の問題を投稿しなければならないのは初めてです。私は自分自身をとても混乱させてしまったので、もうどちらの方法がいいのかわからない。

新鮮な視点からのガイダンスは、大変に感謝しています。私は見ていない、または誤解していない方法がなければなりません。前もって感謝します!

+0

PDOで同じクエリを使用し、他のクエリと同様に結果をフェッチするだけです。 'アイテムのインスタンス数'を取得することは特別なことではありません。mysqlとPDOのすべての結果です。 (PDO :: FETCH_OBJ) - >カウント; ' –

+0

クイック・コメントのおかげで、マイク。' $ pdo->クエリ( 'SELECT COUNT()myTableからのカウントとして') - > execute() - >フェッチ(PDO :: FETCH_OBJ)私はfetch()を使用しないと言っているいくつかのページを見てきました。なぜなら、単一の行しか返さないからです。彼らはwhileループに入れたり、fetchAll()を使ったりする傾向があります。一部の人は、それらをまったく使用しないと言います。代わりにquery()を使用します。したがって、異なる視点のすべてで私の混乱の一部。私は方向を探求し続けており、昨日どのように進むべきかについてのヒントを見つけたかもしれない。私はそれを試して、コードがあればそれをポストバックして、他の人が必要に応じて見ることができるようにします。 – Tam

+0

私のクエリはたった1つの行しか返さないためです。あなたのクエリ( 'SELECT category、count(*)as count ...')は、一意的なカテゴリごとに2つのフィールドと行を返します。 –

答えて

1

このコンセプトに苦しんでいる可能性のある人は、これまでのところ私が思いついたことがあります。私はこれを行うためのよりクリーンな方法があると確信していますが、今はうまくいくようです。私はさらにオブジェクト指向のコーディングを自分の袋に組み込もうとしているので、ソリューションのビジネス上の終わりを機能に入れました。私が自分のサイトを再構築するときに私がもう少し累積すると、おそらく自分自身のためのPDOラッパークラス、またはそのような性質のものにグループ分けされるでしょう。ここで

は私の関数である。database.iniファイルは、このような単純なものに見えるかもしれません

function fieldCount($field,$condition,$table) 
{ 
//This is just a file that holds the database info and can be whatever name you want 
require('database.ini'); 
try{ 
    $dbh = new PDO("mysql:host=$db_hostname;dbname=$db_database", $db_username, $db_password); 

    //This turns on the error mode so you get warnings returned, if any 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $stmt = $dbh->prepare("SELECT $field, COUNT(*) AS count FROM $table $condition GROUP BY $field"); 

// I tried to bind my $field variable but for some reason it didn't work so I 
// commented it out below until I can look deeper into it. If anyone sees any 
// glaring errors, please point them out. It looks right to me, but as I said, 
// it's not working. 

// $stmt = $dbh->prepare("SELECT :field, COUNT(*) AS count FROM $table $condition GROUP BY :field"); 
// $stmt->bindParam(':field', $field); 

    $stmt->execute(); 

    $results=$stmt->fetchAll(PDO::FETCH_ASSOC); 
    // Creates an array similar as the following: 
    // $results[0][$field] $results[0]['count'] 
    // $results[1][$field] $results[1]['count'] 
    // $results[2][$field] $results[2]['count'] 
    // with each row as an array of values within a numeric array of all rows 

    $dbh = null; 
} 
catch(PDOException $e) 
{ 
echo $e->getMessage(); 
} 

return $results; 
} 

:ここ

<?php 
    //database.ini 

    $db_hostname = 'myHostname'; 
    $db_database = 'databaseNameHere'; 
    $db_username = 'YourUserNameHere'; 
    $db_password = 'YourPasswordHere'; 
?> 

は、関数を呼び出す方法です:

<?php 
// First you have to "require" your file where the function is located, 
// whatever you name it. 
require('FieldCountFunction.php'); 

// Determine what column in your database you want to get a count of. 
// In my case I want to count how many items there are in each individual 
// category, so the $field is Category here. 
$field = 'Category'; 

// If there is a condition to your query, you would state it here. 
// In my case I wanted to exclude any items in my Inventory table that 
// are marked "Discontinued" in the Notes column of my database. 
$condition = "WHERE Notes NOT LIKE 'Discontinued'"; 

$DB_Table = 'Inventory'; 

// Now you call the function and enter the $field you want to get a count of, 
// any conditions to the query, and the database table name you are querying. 
// The results you collected in the function (it was called $results above), 
// will be dumped into a new array now called "$fieldArray" below. 
$fieldArray = fieldCount($field, $condition, $DB_Table); 

// To get the data out again you can do the following to cycle through the 
// numeric array of rows (that's what the "$i" is for) and from each numbered 
// row you can retrieve the "$field" and "count" that you need. Then display 
// them however you want. I'll just echo them out here. 
$i=0; 
while($i<count($fieldArray)) 
{ 
    echo $fieldArray[$i]["$field"].' : '.$fieldArray[$i]['count'].'<br />'; 
    $totalCount = $totalCount + $fieldArray[$i]['count']; 
    $i++; 
} 
echo $totalCount.' items total'; 
?> 

これにより、次のような結果が得られます。

付属品:638個の
マーカー:432
マスク:146
パック:93
ペイント:47の
1356のアイテムは、私は、これはそこに誰かに役立ちます願ってい

合計します。なぜ誰かが私の縛りがうまくいかなかったという理由で誰かに光を当てれば、私はそれを感謝します。そうでなければ、私は最終的にそれを理解するだろうと確信しています。

関連する問題