2009-03-23 13 views
16

私はSELECT文がLIMIT句なしで返される行数を得るために、Mysql SELECT文でSQL_CALC_FOUND_ROWSを使用します。PHPでSQL_CALC_FOUND_ROWS/FOUND_ROWS()が機能しません

$sql = new mysqli('localhost', 'root', ''); 
$sql->select_db('mysql'); 
$s1 = $sql->query('select SQL_CALC_FOUND_ROWS * from db limit 0, 3'); 
$s2 = $sql->query('select FOUND_ROWS()'); 
if($row = $s2->fetch_row()) printf('%d/%d', $s1->num_rows, $row[0]); 

私のWinXPデベロッパーステーションでは、3週間ごとに3週間返されます。私の駅から別のMySQLサーバを使用すると3/0も返されます。 別のPCでは、同じコードが正常に実行され、正しい数(たとえば、mysql.dbテーブルに17個のレコードがある場合は3/17)が返されます。すべてのXP PCには同じPHP/Mysqlバージョンがあり、過去には自分のPC上で正常に動作しました 同じSQLクエリでMysql Query Browserを使用すると、正しい番号が得られます。

誰でも私に解決策を教えてもらえますか?

申し訳ありませんが、私の以前のリクエストは非常に不明でした。

+1

にしている場合は、あなたのPHPコードを含めることができます

$wpdb->get_var('select FOUND_ROWS()'); 

をしたいですか?クエリに使用されているものと同じデータベース接続リソースを使用してカウントを求めているのは間違いありませんか? –

+0

あなたの質問には、生成されたエラーと使用しているコードがありません。 – TravisO

+0

@ PaulDixonありがとうポール!私たちの.netコードでは、私たちはあなたのコメントを読むとすぐに新しい接続を作成しています。私はそれが私の問題でなければならないことを知っていました。 –

答えて

14

ありがとうございます。

mysqlコマンドラインであなたの例に類似した何かを実行したときに動作します。 PHPから実行すると、失敗しました。 2番目のクエリは最初のものを「知って」いる必要があるので、2つのクエリをリンクする永続性/メモリがPHPによって混乱していたように思います。

(WordPressがこのタイプのクエリを使用してページングを行うことが判明したので、大きな問題はWordPressのページングが突然PHP 5.2.6に移行したときに動作を停止したことでした。 FOUND_ROWS()へ)。

今後これに遭遇するかもしれない人のためだけに...私にとっては "mysql.trace_mode"を設定していた - これはデフォルトで "off"の代わりに5.2.6に "on"何らかの理由でFOUND_ROWS()が動作しないようにします。

「修正」として、我々は(実際には、共通して「含める」)すべてのPHPページでこれを置くことができ、次のいずれか

ini_set("mysql.trace_mode", "0"); 

かにこれを追加します。htaccessファイル:SQL_CALC_FOUND_ROWSとセミコロン

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM db limit 0, 3;"; 
$query .= "SELECT FOUND_ROWS()"; 

/* execute multi query */ 
if ($mysqli->multi_query($query)) { 
    do { 
     /* store first result set */ 
     if ($result = $mysqli->store_result()) { 
      while ($row = $result->fetch_row()) { 
       printf("%s\n", $row[0]); 
      } 
      $result->free(); 
     } 
     /* print divider */ 
     if ($mysqli->more_results()) { 
      printf("-----------------\n"); 
     } 
    } while ($mysqli->next_result()); 
} 

/* close connection */ 
$mysqli->close(); 
?> 
+0

Good !!ありがとう、それは正しい解決策です –

8

複数のクエリが可能なMySQLクエリメソッドを使用していますか。

MySQLのドキュメント。この行数を取得するには

、SELECT文でSQL_CALC_FOUND_ROWSオプションが含まれ、その後、その後

FOUND_ROWS()呼び出す:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name 
    -> WHERE id > 100 LIMIT 10; 
mysql> SELECT FOUND_ROWS(); 

がまた楽しみのためだけに、大きな議論がありますがFOUND_ROWS()の使い方here.

+0

競合状態が予想されますが、このような操作ではそれほど重要ではないと思われます。それでも、気づいてよかったです。 – Oddman

0

Wの競合状態についてそれはPHP 5.2.6にバンドルされているmysql PHP拡張機能の問題でした。 Mysqliは正常に動作し、別のPHPバージョンも実行されます。 騒音や不明な質問をおかけして申し訳ありません。

同じ問題が発生した場合は、PHPを再インストールするかバージョンを変更することをおすすめします。

2

もう一つの方法は、mysqli_multi_queryを使用することです最も簡単な解決策は、実際のクエリを次のようにサブクエリすることです。

SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT whatever FROM whatever WHERE whatever LIMIT whatever) ax; 
select FOUND_ROWS(); 

これで正しい結果が得られます。主な理由は、SQL_CALC_FOUND_ROWSは、主に行が見つからない(つまり、LIMITSなし)行が返されないということです。

+1

私はそれが選択FOUND_ROWS()だと思う –

+0

ありがとうJames F、私は訂正をしました。 –

0

で区切っFOUND_ROWSを含む両方のクエリを渡すことで、PHPマニュアルに記載されているように

php_value mysql.trace_mode "0" 

おかげで再び、 ジェリー

0

私は同じ問題がありました。解決策は愚かで、$wpdb->get_varの代わりに$wpdb->queryを使用していました。だから、あなたはWordPressの

関連する問題