21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
XOX
Profil *
Ahoj nevíte proč mi nefunguje limit v tomto skriptu?

    $limit1 = 5;
        
    $query = "SELECT * FROM clanky WHERE nadpis LIKE '%$trimm%' OR text LIKE '%$trimm%' ORDER BY id DESC";
    $numresults=mysql_query ($query)or print(mysql_error());
    $row_num_links_main1 =mysql_num_rows ($numresults)or print(mysql_error());
    
  $query .= " LIMIT $limit1" ;
   $numresults = mysql_query ($query) or die ( "Couldn't execute query" );
  $row= mysql_fetch_array ($numresults);
Keeehi
Profil
XOX:
Použij
or print(mysql_error());
místo
or die ( "Couldn't execute query" );
a možná se dozvíš proč.
XOX
Profil *
Keeehi:
žádný error to nevypisuje
nightfish
Profil
XOX:
Ahoj nevíte proč mi nefunguje limit v tomto skriptu?
Na základě čeho usuzuješ, že ten limit nefunguje? V uvedeném kódu pracuješ jen s prvním řádkem LIMITovaného výsledku...

P.S.: funkce mysql_* funkce jsou od PHP 5.5 označené jako deprecated a od PHP 7 jsou odstraněné, takže není vhodné je používat - více informací nalezneš v článku Proč nepoužívat funkce mysql_*
Keeehi
Profil
XOX:
žádný error to nevypisuje
A jak se tedy ta nefunkčnost projevuje?
XOX
Profil *
Keeehi:
Prostě mi to vypíše více jak 5 výsledků
Keeehi
Profil
  $query .= " LIMIT $limit1" ;
var_dump($query);
Vypíše co?
XOX
Profil *
Keeehi:
string 'SELECT * FROM clanky WHERE nadpis LIKE '%hghg%' OR text LIKE '%hghg%' ORDER BY id DESC LIMIT 5' (length=98)
Lonanek
Profil
XOX:
SQL dotaz korektně funguje.

Kolik jich tedy je, když ne 5?
Jak záznamy vypisujete?
Alphard
Profil
Ten kód je z pohledu efektivity téměř odstrašující příklad. Uvědomte si, co se tam přesně děje: První dotaz vybere všechny záznamy z databáze jen kvůli jejich spočítání a druhý dotaz vybere limitovanou podmnožinu toho prvního. Tipuji, že v tomto copy&paste stylu programování se do výpisu dostávají záznamy z prvního dotazu bez limitu.

Jak to udělat lépe?
$where = "WHERE nadpis LIKE '%$trimm%' OR text LIKE '%$trimm%'";
$row_num_links_main1 = mysql_result(mysql_query("select count(id) from clanky $where"), 0, 0);
$all_lines = mysql_query("select * from clanky $where order by id limit $limit1");
Lonanek
Profil
Dva dotazy nahradit dvěma dotazy je efektivní?
Co to řešit jen jedním dotazem a v cyklu vypsat pouze požadovaný počet záznamů?
Alphard
Profil
Lonanek:
Dva dotazy nahradit dvěma dotazy je efektivní?
Pro větší množství záznamů ano. Nutnost předávat velké množství dat převáží nad režií pro 2 dotazy (ta je v podstatě konstantní). To ani neřeším, že by se v buffered módu větší SQL tabulka nemusela vůbec vejít do paměti (pro články je to spíš hypotetické, ale např. pro rozsáhlé logy by to už mohl být reálný problém).

Co to řešit jen jedním dotazem a v cyklu vypsat pouze požadovaný počet záznamů?
To by bylo lepší pro nízký počet záznamů. Na konkrétním stroji a pro konkrétní tabulku by šlo přibližně určit, od jakého počtu záznamů budou vhodnější 2 dotazy.
CZechBoY
Profil
$mysqli = new MySQLi('host', 'user', 'password', 'database');
$mysqli->set_charset('utf8');


$limit1 = 5;

$sql = "SELECT %s FROM clanky WHERE nadpis LIKE '%" . $mysqli->real_escape_string($trimm) . "%' OR text LIKE '%" . $mysqli->real_escape_string($trimm). "%' ORDER BY id DESC";


/* zjištění počtu řádků pro stránkování */
$sqlNumRows = sprintf($sql, 'COUNT(*) cnt'); // chci vybrat pouze COUNT(*) cnt
$queryNumRows = $mysqli->query($sqlNumRows) or print ('Error: ' . $mysqli->errno . ' ' . $mysqli->error);
$rowNumRows = $queryNumRows->fetch_assoc() or print ('Error: ' . $mysqli->errno . ' ' . $mysqli->error);
$numRows = (int)$rowNumRows['cnt'];
$queryNumRows->free();

/* zjištění konkrétních vyhledaných řádků */
$sqlRows .= sprintf($sql, '*') . " LIMIT " . $limit1; // chci vybrat všechny sloupce
$queryRows = $mysqli->query ($sqlRows) or die ('Error: ' . $mysqli->errno . ' ' . $mysqli->error);

/* vypsání konkrétních řádků */
while ($row = $queryRows->fetch_assoc())
{

}
$queryRows->free();

Samozřejmě lepší by bylo použít prepared statements nebo ještě lepší by bylo použít PDO.
Kajman
Profil
Mysql má možnost použít limit a přesto stejným dotazem vrátit počet nalezených řádků (např. pro mysql_num_rows) bez vlivu limitu.


SELECT SQL_CALC_FOUND_ROWS sloupce FROM tabulka WHERE ... LIMIT 5
XOX
Profil *
Díky všem problém je sice nevím jak ale vyřešen

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0