Bezradný a zoufalý - mysqli a php – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Bezradný a zoufalý - mysqli a php – PHP – Fórum – Programujte.comBezradný a zoufalý - mysqli a php – PHP – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
mb20
Duch
1. 3. 2016   #1
-
0
-

Ahoj,

google nepomáhá, hlava už mi to nebere... :) za každou radu budu velmi vděčný.

Mám SQL dotaz:

$dotazsearchpage = $pdo->prepare("SELECT * FROM restaurace WHERE typ = ?");
$dotazsearchpage->bind_param("s", $_GET['searchpage']);
$dotazsearchpage->execute();
                    
// Výpis výsledků do proměnné result
$resultsearch = $dotazsearchpage->get_result();


To není problém, vše funguje, jak má. Přes cyklus si následně vypisuji výsledky. Následně mám ale použité stránkování a v tomto stránkování používám úpravu hodnoty LIMIT následujícím způsobem:

$vysledek=($resultsearch." limit ".($od-1).", ".ROWS);


A to samozřejmě nefunguje, bylo to navržené pro obyč mysql dotaz bez prepared statements.. A otázkou je, jak upravit hodnotu LIMIT, když používám dotaz přes prepared statements?

Pro pořádek celé stránkování zde: 

// ************ Stránkování záznamů. 
                          
define ("ROWS", 30);
                      if (!isset($_GET["celkem"])) //pokud nevíme, kolik bude záznamů tak to zjistíme... 
                            {
                              $vysledek=$dotazsearchpage->get_result();
                              $celkem=$pocet_zaznamu;
                            }
                          else
                            {
                              $celkem=$_GET["celkem"];
                            }
                          if ($celkem>ROWS) 
                            {
                            echo "<div class='strankovani-wrap'>";
                            if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; 
                            $vysledek=($resultsearch." limit ".($od-1).", ".ROWS);
                            echo "<div class='strankovani-text'>Výpis: ".$od."-";
                            echo (($od+ROWS-1)<=$celkem)?($od+ROWS-1):$celkem;
                            echo " z celkem $celkem položek</div>";
      
                            //začátek - vytvoř odkaz pouze pokud nejsme na začátku
                            if ($od==1) echo "<div class='strankovani-zacatek'> </div>"; 
                            else echo "<a rel="nofollow" href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=1\" title='První stránka'><div class='strankovani-zacatek-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_zacatek_on.jpg'></a></div>";
                            
                            //zpět - vytvoř odkaz pouze pokud nejsme v prvních ROWS
                            if ($od<ROWS) echo "<div class='strankovani-predchozi'> </div>"; 
                            else echo "<a rel="nofollow" href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=".($od-ROWS)."\" title='Předchozí stránka'><div class='strankovani-predchozi-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_predchozi_on.jpg'></a></div>";
    
                            //další - vytvoř, pouze pokud nejsme v posledních ROWS
                            if ($od+ROWS>$celkem) echo "<div class='strankovani-nasledujici'> </div>"; 
                            else echo "<a rel="nofollow" href=\"".$_SESSION['adresa_stranky']."&celkem=$celkem&amp;od=".($od+ROWS)."\" title='Další stránka'><div class='strankovani-nasledujici-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_nasledujici_on.jpg'></a></div>";
    
                            //poslední - to je posledních (zbytek po dělení ROWS) záznamů
                            if ($od>$celkem-ROWS) echo "<div class='strankovani-konec'> </div>"; 
                            else echo "<a rel="nofollow" href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."\" title='Poslední stránka'><div class='strankovani-konec-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_konec_on.jpg'></a></div>";
                            echo "</div>";
                            }
  
                            // ************ Konec Stránkování záznamů.
Nahlásit jako SPAM
IP: 89.176.61.–
Reklama
Reklama
Kit+11
Guru
1. 3. 2016   #2
-
0
-

#1 mb2
Jsi bezradný a zoufalý z toho, že matláš dohromady 3 neslučitelné databázové ovladače: mysql (zastaralý), mysqli (novější) a PDO (nejnovější). Musíš si vybrat pouze jeden z nich (doporučuji PDO) a používat výhradně jeho metody.

V PDO však metoda get_result() není. Vůbec by ti to nemělo fungovat - přesto tvrdíš, že ti to funguje. Co tedy máš v proměnné $pdo?

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
mb20
Duch
1. 3. 2016   #3
-
0
-

#2 Kit
Potřeboval bych to nějak konkrétně napsat. Proměnná PDO se jen tak jmenuje, pardon, je v ní objekt new mysqli("localhost", "user", "heslo", "databáze");

Dokázal bys mi nějak pomoci se stránkováním?

Nahlásit jako SPAM
IP: 89.176.61.–
Kit+11
Guru
1. 3. 2016   #4
-
0
-

#3 mb2
Stránkování dělám přímo SQL dotazem v databázi klauzulí LIMIT.

Ovladač mysqli nepoužívám a v zájmu zachování tělesného a duševního zdraví doporučuji pro něj nepoužívat název proměnné $pdo - někdo by tě za to mohl i fyzicky napadnout.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
mb20
Duch
1. 3. 2016   #5
-
0
-

#4 Kit
Tak jsem to nakonec rozchodil. Díky moc za reakce, jen pro formu - dávám zde kompletní a plně funkční řešení - doufám, že ten zdroják není tak strašnej :D pokud ano, omlouvám se, jsem amatér

// Vytvoření dotazu a stránkování pro výběr
                  if($_GET['searchpage']!="") {
                    // Dotaz na SQL kvůli počtu nalezených výsledků pro stránkování
                    $dotazsearchpage_pager = $connectsqli->prepare("SELECT * FROM restaurace WHERE mesto LIKE CONCAT('%', ?, '%')");
                    $dotazsearchpage_pager->bind_param("s", $_GET['searchpage']);
                    $dotazsearchpage_pager->execute();
                    $resultsearch_pager = $dotazsearchpage_pager->get_result();
  
                    // Zjištění počtu nalezených záznamů
                    $pocet_zaznamu = $resultsearch_pager->num_rows;
                    
                    // Uložení výsledků hledání
                    $dotazsearchpage_pager->store_result();
                    
                    // Dotaz na SQL pro výpis hledaného obsahu
                    $dotazsearchpage = $connectsqli->prepare("SELECT * FROM restaurace WHERE mesto LIKE CONCAT('%', ?, '%') LIMIT ?,? ");
                    $dotazsearchpage->bind_param("sss", $_GET['searchpage'], $limit1, $limit2);
  
                    // Výpis nadpisu s počtem nalezených výrazů
                    echo "<h1> ".$_GET['searchpage']." (nalezeno $pocet_zaznamu podniků)</h1>";
                      
                    // Stránkování záznamů 
                    define ("ROWS", 30);
                      if (isset($_GET["celkem"]))  {
                        $celkem=$_GET["celkem"];
                      }
                      else  {
                        $celkem=$pocet_zaznamu;  
                      }
                      if ($celkem>ROWS) {
                        echo "<div class='strankovani-wrap'>";
                          if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; 
                            $limit1 = $od-1;
                            $limit2 = ROWS;
                            echo "<div class='strankovani-text'>Výpis: ".$od."-";
                            echo (($od+ROWS-1)<=$celkem)?($od+ROWS-1):$celkem;
                            echo " z celkem $celkem položek</div>";
      
                            //začátek - vytvoř odkaz pouze pokud nejsme na začátku
                            if ($od==1) echo "<div class='strankovani-zacatek'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=1\" title='První stránka'><div class='strankovani-zacatek-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_zacatek_on.jpg'></a></div>";
                            
                            //zpět - vytvoř odkaz pouze pokud nejsme v prvních ROWS
                            if ($od<ROWS) echo "<div class='strankovani-predchozi'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=".($od-ROWS)."\" title='Předchozí stránka'><div class='strankovani-predchozi-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_predchozi_on.jpg'></a></div>";
    
                            //další - vytvoř, pouze pokud nejsme v posledních ROWS
                            if ($od+ROWS>$celkem) echo "<div class='strankovani-nasledujici'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."&celkem=$celkem&amp;od=".($od+ROWS)."\" title='Další stránka'><div class='strankovani-nasledujici-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_nasledujici_on.jpg'></a></div>";
    
                            //poslední - to je posledních (zbytek po dělení ROWS) záznamů
                            if ($od>$celkem-ROWS) echo "<div class='strankovani-konec'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."\" title='Poslední stránka'><div class='strankovani-konec-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_konec_on.jpg'></a></div>";
                            echo "</div>";
                        }
                 }               
            
                  // Zobrazení vlastního obsahu vyhledávání
                  $dotazsearchpage->execute();
                  $resultsearch = $dotazsearchpage->get_result();
                  
                  while ($row = mysqli_fetch_array($resultsearch))  {  
                    require ROOT_DIRECTORY."/program/inc/default/templates/search_results.php";  
                  }  
Nahlásit jako SPAM
IP: 78.102.116.–
mb20
Duch
1. 3. 2016   #6
-
0
-

Co mě trochu mrzí je, že jsem musel použít 2x tej samý dotaz jen načíst do rozdílné proměnné kvůli načtení počtu záznamů... Kdyby někoho napadlo, jak to udělat i bez toho... budu rád. Mě to nenapadlo, pač execute() je závislé na proměnné limit1 a limit2 a naopak num_rows je závislé na execute... chjo. No, hlavně, že to běhá.

Nahlásit jako SPAM
IP: 78.102.116.–
KIIV+42
God of flame
2. 3. 2016   #7
-
0
-

Ten dotaz na pocitani nemusi tahat zadne data, kouzlo je v "SELECT COUNT(*) " a pocet mas jako jednu hodnotu. Posilani dat je daleko narocnejsi nez jen ziskat pocet radku

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
2532 příspěvků
2. 3. 2016   #8
-
0
-

Mozna by to slo napsat do jednoho, ale taky pouzivam dva dotazy. Jenze pouzivam prvni dotaz
"SELECT COUNT (*) FROM ... WHERE ..."
Pokud mas nastavene indexy, tak si pocet radku spocita podle toho, co vytahne s indexu na WHERE a do datove casti uz nechodi.

 

Nahlásit jako SPAM
IP: 2001:718:2601:26c:e1a9:6e...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 60 hostů

Podobná vlákna

Přepsání na využití mysqli — založil dvorak-a

Ako to zapísať v MySQLi — založil Martin

MySqli update problém — založil Marek

MySQLi a prepared statements — založil Kuboslav

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý