SQL_CALC_FOUND_ROWS / FOUND_ROWS () PHP çalışmıyor

4 Cevap php

Benim SEÇME SINIRI koşulu olmadan dönecekti hatlarının sayısını elde etmek için, SQL_CALC_FOUND_ROWS Mysql SELECT deyiminde kullanın.

$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]);

On my WinXP dev station it return 3/0 everytime for several weeks. When I use another MySQL server from my station it return 3/0 too. On anothers PC the same code runs fine, and return the correct number (3/17 for example, if I have 17 records in mysql.db table). Every XP PC have the same PHP/Mysql version, and it ran fine in the past on my PC Using Mysql Query Browser with the same SQL queries I get the right number.

Herkes yeniden yüklemek tüm olmadan, bana çözümün bir fikir verebilir misiniz?

Üzgünüm, benim önceki isteği çok belli oldu.

4 Cevap

Ben mysql komut satırında örneğe benzer bir şey koştu, bu işe; ama php onu çalıştıran, bu başarısız. İkinci sorgu ilki "hakkında bilmek" vardır, bu yüzden iki sorguları bağlayan o sebat / bellek php tarafından berbat başlamıştı nasılsa rakam.

(Bu Wordpress kendi sayfalama yapmak için bu sorgu türünü kullanır çıkıyor - yani bizim büyük bir sorun, bir wordpress içinde sayfalama (biz 5.2.6 php taşındı aniden sonunda FOUND_ROWS aşağı izlenir ... çalışmayı durdurdu yüklemek oldu )).

Sadece php ayarı "mysql.trace_mode" benim için ... Gelecekte bu çalıştırmak olabilir insanlar için gönderme uğruna - bu daha önce böyle yerine "off" 5.2.6 in "on" varsayılan ve nedense çalışan () FOUND_ROWS önler.

Bir "düzeltme" olarak, ("include" bir ortak, aslında) her php sayfasında bu koymak olabilir ya da:

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

. veya htaccess bunu ekleyin:

php_value mysql.trace_mode "0"

Thanks again, Jerry

Eğer birden fazla sorgu için izin veren bir MySQL sorgu yöntemi kullanıyor.

MySQL belgelere.

Bu satır sayısını elde etmek için, bir SELECT deyiminde SQL_CALC_FOUND_ROWS seçeneğini ve ardından FOUND_ROWS() sonra çağırmak dahil

Örnek:

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

Ayrıca sadece eğlence için, FOUND_ROWS() 'nin kullanımına here. ve yarış durumu hakkında büyük bir tartışma var

Başka bir yol, bir noktalı virgül ile ayrılır SQL_CALC_FOUND_ROWS ve FOUND_ROWS içeren hem sorguları geçirerek PHP kılavuzunda belirtildiği gibi mysqli_multi_query kullanmak olacaktır

<?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();
?>

Well, it was a problem with mysql php extension bundled with php 5.2.6. Mysqli run fine, and another php version too. Sorry for noise and unclear question.

Eğer aynı sorun varsa, benim tavsiyem yeniden yüklemeniz PHP veya değiştirmek sürümü olduğunu.