Autor | Zpráva | ||
---|---|---|---|
XOX Profil * |
#1 · Zasláno: 16. 12. 2015, 17:46:11
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 |
#2 · Zasláno: 16. 12. 2015, 18:18:45
XOX:
Použij or print(mysql_error()); or die ( "Couldn't execute query" ); |
||
XOX Profil * |
#3 · Zasláno: 16. 12. 2015, 18:23:33
Keeehi:
žádný error to nevypisuje |
||
nightfish Profil |
#4 · Zasláno: 16. 12. 2015, 19:13:34
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 |
#5 · Zasláno: 16. 12. 2015, 19:18:25
XOX:
„žádný error to nevypisuje“ A jak se tedy ta nefunkčnost projevuje? |
||
XOX Profil * |
#6 · Zasláno: 17. 12. 2015, 08:47:03
Keeehi:
Prostě mi to vypíše více jak 5 výsledků |
||
Keeehi Profil |
#7 · Zasláno: 17. 12. 2015, 09:59:03
$query .= " LIMIT $limit1" ; var_dump($query); |
||
XOX Profil * |
#8 · Zasláno: 18. 12. 2015, 19:02:05
Keeehi:
string 'SELECT * FROM clanky WHERE nadpis LIKE '%hghg%' OR text LIKE '%hghg%' ORDER BY id DESC LIMIT 5' (length=98) |
||
Lonanek Profil |
#9 · Zasláno: 18. 12. 2015, 20:09:59
XOX:
SQL dotaz korektně funguje. Kolik jich tedy je, když ne 5? Jak záznamy vypisujete? |
||
Alphard Profil |
#10 · Zasláno: 18. 12. 2015, 23:42:20
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 |
#11 · Zasláno: 19. 12. 2015, 00:25:51
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 |
#14 · Zasláno: 21. 12. 2015, 13:19:58
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 * |
#15 · Zasláno: 21. 12. 2015, 22:21:27
Díky všem problém je sice nevím jak ale vyřešen
|
||
Časová prodleva: 9 let
|
0