Autor Zpráva
Grinch
Profil *
Dobrý den. Mám takový dotaz. Řekněme, že mám 2 servery. Na obou mám stejný soubor (stejný kód). Na jednom serveru se mi dokument odešle klientovi správně, ale na druhém se odešle jen část dokumentu. Čas dokumentů, která je za PHP scriptem je úplně ignorován. Ne, že by byl skrytý nebo něco, ale když si zobrazíme v Chromu zdroj stránky, je zbytek stránky za scriptem prostě useknutý. Ani script se nezobrazuje. Kde by mohla být chyba? Ve scriptu rozhodně není, protože na prvním serveru funguje, ale na druhým ne. Takže pokud se někdo někdy s podobným problémem setkal, nevíte, kde by mohla být chyba? Děkuji a přeji příjemné prožití vánočních svátků.
Sitole
Profil
Grinch:
Řekl bych že chyba bude právě někde ve skriptu. Skripty mohou být totožné, ale například hlášení, ignorování chyb a tak podobně mohou být na obou serverech rozdílné. Například když na jednom hostingu zapomenu ukončit řádek, vyhazuje to chybu a nic dál se nenačte. Na druhém to chybu sice vyhodí ale skript pokračuje. Často se stává že hlavně na produktových serverech jsou chyby vypnuty úplně. Což je mimochodem správné řešení, protože předpokládáme že se jedná o funkční aplikaci. Bez chybové hlášky případný hacker netuší co se podělalo a neví kde je případná slabina.
Keeehi
Profil
Taky kromě konfigurace může být rozdíl ve verzích PHP. Proto se to taky může chovat jinak.
Grinch
Profil *
Potřebuju vytvořit stránkování (rozdělit články na různé stránky, aby se rychleji nacitala a nemusel uživatel scrolovat až do pekla). Toho je ten script:
<?php
$db=mysql_connect("localhost","ultratajnyuzivatel","ultratajneheslo");
mysql_select_db('ultratajnadatabaze',$db);
$start=0;
$limit=3;
if(isset($_GET['page']))
{
    $page=$_GET['page'];
    $start=($page-1)*$limit;
}
$query=mysql_query("select * from articles LIMIT $start, $limit");
echo "<div>";
while($query2=mysql_fetch_array($query))
{
    echo "<h1>".$query2['heading']."</h1>";
   echo "<p>".$query2['content']."</p>";
}
echo "</div>";
$rows=mysql_num_rows(mysql_query("select * from articles"));
$total=ceil($rows/$limit);

if($page>1)
{
    echo "<a href='?page=".($page-1)."' class='button'>«</a>";
}
if($page!=$total)
{
    echo "<a href='?page=".($page+1)."' class='button'>»</a>";
}
echo "<ul class='page'>";
        for($i=1;$i<=$total;$i++)
        {
            if($i==$page) { echo "<li class='current'>".$i."</li>"; }
            
            else { echo "<li><a href='?page=".$i."'>".$i."</a></li>"; }
        }
echo "</ul>";
?>
Chybu v něm vážně nevidím, protože na jednom serveru mi to články vypisuje správně, ale na tom, na kterém ho chci mit mi nefunguje. Nechává půlku stránky před scriptem a všechen kód za scriptem i samotný script ignoruje a klientovi neodešle.


Keeehi:
Verze PHP, kde to funguje je 5.6 a na kterém nefunguje je 7.0. Nevěřím tomu, že novější verze PHP by mi znemožnila funkčnost scriptu. A pokud ano, čekal bych hlášku 500. Je zvláštní, že to script i kód za scriptem ignoruje. Takže footer a cokoli za scriptem je ignorováno.


Keeehi:
Možná jsem přišel na chybu.. Při odstranění HTML kódu a ponechání pouhého PHP, server, na kterém mi to nešlo (PHP 7) mi hodil chybu 500. Na PHP check mi to hodilo následující varování: Warning: There are 5 functions in your code that have been deprecated in the current version of PHP :
mysql_connect()
mysql_fetch_array()
mysql_num_rows()
mysql_query()
mysql_select_db()
Hádám, že tyto hodnoty v novém PHP neplatí. Jakými hodnotami bych je měl nahradit? Děkuji. :)


Grinch:
Dobře.. hodnoty jsem pozměnil pro verzi PHP 7.0 ale nevypisuje mi články. :/ Ani čísla pro stránkování (čísla jsou vidět ve zdroji stránky v prohlížeči, ale články ne)
<?php
$db=mysqli_connect("localhost","ultratajnyuzivatel","ultratajneheslo");
mysqli_select_db('ultratajnadatabaze',$db);
$start=0;
$limit=3;
if(isset($_GET['page']))
{
    $page=$_GET['page'];
    $start=($page-1)*$limit;
}
$query=mysqli_query("select * from articles LIMIT $start, $limit");
echo "<div>";
while($query2=mysqli_fetch_array($query))
{
    echo "<h1>".$query2['heading']."</h1>";
   echo "<p>".$query2['content']."</p>";
}
echo "</div>";
$rows=mysqli_num_rows(mysqli_query("select * from articles"));
$total=ceil($rows/$limit);

if($page>1)
{
    echo "<a href='?page=".($page-1)."' class='button'>«</a>";
}
if($page!=$total)
{
    echo "<a href='?page=".($page+1)."' class='button'>»</a>";
}
echo "<ul class='page'>";
        for($i=1;$i<=$total;$i++)
        {
            if($i==$page) { echo "<li class='current'>".$i."</li>"; }
            
            else { echo "<li><a href='?page=".$i."'>".$i."</a></li>"; }
        }
echo "</ul>";
?>



Keeehi:
Alespoň se zobrazuje zbytek kódu stránky. Za to děkuju. Nenapadlo by mě, že by chyba byla ve verzi PHP.. nějaká chyba tam ale stále je. Bůh mě nenávidí. xD
Keeehi
Profil
Grinch:
Ano, funkce z rodiny mysql_* byly v PHP7 odstraněny. Proto to nefunguje. Použij mysqli_*. Jsou téměř stejné, rozdíl je hlavně v povinném předání spojení na databázi, které je u starých funkcí povinný není.
Grinch
Profil *
Keeehi:
Script nezobrazuje články, ani čísla stránkování. Hádám, že je chyba při vstupu do databáze, protože nezíská informací kolik je článků, tudíž na kolik stránek je rozdělit. Pokud za URL nedám Sting ?page=1 pro změnu to neukáže vůbec nic. Možná nějaká hodnota nefunguje stejně, jako v PHP 5.6 a nestačí jen přepsat MySQL na MySQLi
Davex
Profil
Grinch:
nestačí jen přepsat MySQL na MySQLi
Ano, nestačí. Je tam několik rozdílů. Například funkce mysqli_select_db má prohozené pořadí parametrů a funkce mysqli_query má o jeden parametr navíc.
Grinch
Profil *
Davex:
Dobře. To s mysqli_select_db napravím, to vím jak. Ale jaký parametr může chtít mysqli_query, když ja ten parametr nemám.. nebo. Jaký to vůbec chce parametr? Nevím, jestli si ho dokážu vycucat z prstu, protože zatím nevím, který to je. I tak díky. Krásný vánoce.


Davex:
Pokud si jsem vědom, mysql_select_db chce pořadí následovně: databáze, server, jméno, heslo. mysqli_select_db server, jméno, heslo, databáze. Pokud ano, tak toto jsem opravil. Ještě bych potřeboval pomoct s tím parametrem navíc u mysqli_query
Davex
Profil
Grinch:
Ještě bych potřeboval pomoct s tím parametrem navíc u mysqli_query
Keeehi psal: „rozdíl je hlavně v povinném předání spojení na databázi“.

Kdybys to takhle nepochopil, tak se tady na diskusi dá ve výpisu skriptu kliknout levým tlačítkem myši na jméno funkce a otevře se dokumentace, kde se často dají takové drobnosti najít.
Grinch
Profil *
Davex:
Ano. Po kliknutí jsem přesměrován na dokumentační stránku PHP, která mi říká, že funkce neexistuje.


Davex:
Dobře, přidal jsem před to server, uživatele, heslo a název databáze a vypadá to, že to funguje. Diky moc všem a krásné prožití vánočních svátků. :)


Zobrazení článků:
<?php
include ('config.php');
$start=0;
$limit=3;
if(isset($_GET['page']))
{
    $page=$_GET['page'];
    $start=($page-1)*$limit;
}
$query=mysqli_query($db,"select * from articles LIMIT $start, $limit");
echo "<div>";
while($query2=mysqli_fetch_array($query))
{
    echo "<h1>".$query2['heading']."</h1>";
   echo "<p>".$query2['content']."</p>";
}
echo "</div>";
?>
Stránkování:
<?php
$rows=mysqli_num_rows(mysqli_query($db,"select * from articles"));
$total=ceil($rows/$limit);
echo "<ul class='w3-pagination'>";

if($page>1)
{
    echo "<li><a href='?page=".($page-1)."' class='w3-hover-black'>«</a></li>";
}
if($page!=$total)
{
    echo "<li><a href='?page=".($page+1)."' class='w3-hover-black'>»</a></li>";
}
        for($i=1;$i<=$total;$i++)
        {
            if($i==$page) { echo "<li class='w3-black'>".$i."</li>"; }
            
            else { echo "<li><a class='w3-hover-black' href='?page=".$i."'>".$i."</a></li>"; }
        }
echo "</ul>";
?>
Obsah config.php
<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'jmeno');
define('DB_PASSWORD', 'heslo');
define('DB_DATABASE', 'databaze');
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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