Autor Zpráva
Grecky
Profil
Ahoj,

kvůli přechodu z 5,3 php na vyšší php 5,6 mi přestali stránky vyčítat data z databáze, po několika pokusech o nápravu se mi stále nedaří je zprovoznit. Dokázal by mi někdo říci jak upravit zdroják níže, aby zase fungovaly?

Předem díky.

<?
header("Expires: ".GMdate("D,d M Y H:i:s")."GMT");
header ("Cache-Control: no-cache");
header ("Pragma: no-cache");

session_start();

include("phpdata.php");
include ("navigace.php");

$obj = new databaze;
$obj->connect();
$obj->select_db("h_odborydpo_cz");
$set = @mysql_query ("SET NAMES cp1250");
$menu=0;

if ( $logout == "true" )
{
unset($_SESSION["sess_stat"]);
unset($_SESSION["sess_id"]);
unset($_SESSION["sess_fa_jmeno"]);
unset($_SESSION["sess_fa_ulice"]);
unset($_SESSION["sess_fa_mesto"]);
unset($_SESSION["sess_fa_psc"]);
unset($_SESSION["sess_do_jmeno"]);
unset($_SESSION["sess_do_ulice"]);
unset($_SESSION["sess_do_mesto"]);
unset($_SESSION["sess_do_psc"]);
unset($_SESSION["sess_email"]);
unset($_SESSION["sess_telefon"]);
unset($_SESSION["sess_firma"]);
unset($_SESSION["sess_ico"]);
unset($_SESSION["sess_dic"]);
}

if ( $prihlaseni == "true" )
{
$s = MySQL_Query("SELECT * FROM zakaznici WHERE login = '$login' && password = '$password'");
$pocet = MySQL_Num_Rows($s);
if ( $pocet >0 )
{
$data = MySQL_Fetch_Array($s);

$sess_stat = "true";
$sess_id = $data["id"];

session_register("sess_stat");
session_register("sess_id");
session_register("sess_login");
session_register("sess_password");
session_register("sess_fa_jmeno");
session_register("sess_stat");
session_register("sess_fa_jmeno");
session_register("sess_fa_ulice");
session_register("sess_fa_mesto");
session_register("sess_fa_psc");
session_register("sess_do_jmeno");
session_register("sess_do_ulice");
session_register("sess_do_mesto");
session_register("sess_do_psc");
session_register("sess_email");
session_register("sess_telefon");
session_register("sess_firma");
session_register("sess_ico");
session_register("sess_dic");

$sess_stat = "true";
$sess_id = $data["id"];
$sess_login = $data["login"];
$sess_password = $data["password"];
$sess_fa_jmeno = $data["fa_jmeno"];
$sess_fa_ulice = $data["fa_ulice"];
$sess_fa_mesto = $data["fa_mesto"];
$sess_fa_psc = $data["fa_psc"];
$sess_do_jmeno = $data["do_jmeno"];
$sess_do_ulice = $data["do_ulice"];
$sess_do_mesto = $data["do_mesto"];
$sess_do_psc = $data["do_psc"];
$sess_email = $data["email"];
$sess_telefon = $data["telefon"];
$sess_firma = $data["firma"];
$sess_ico = $data["ico"];
$sess_dic = $data["dic"];
}
else
{
$error = "Chybně zadané jméno nebo heslo!";
}
}

if($_SESSION["sess_stat"] == "true") $user = htmlspecialchars($_SESSION["sess_login"]);
else $user = "";


$sql = MySQL_Query("SELECT * FROM barvy WHERE id = '1'");
$barva = MySQL_Fetch_Array($sql);

?>
lionel messi
Profil
Grecky:

Napríklad funkcia session_register je od PHP 5.4.0 odstránená, takže ju po prechode nemôžeš použiť (už v PHP 5.3.0 bola označená ako zastaraná). Ak vieš, že isté funkcie sú zastaralé, je vhodné sa im vyhýbať - znížiš tak riziko, že ti zo dňa na deň prestane fungovať kód.

Namiesto
session_register("sess_stat");

použi
$_SESSION["sess_stat"] = $sess_stat;

a analogicky zvyšok (po nastavení session pristupuj k $_SESSION["sess_do_ulice"], nie k $sess_do_ulice).

Navyše používaš mysql_* funkcie. Tie síce ešte fungujú, tiež sú však označené ako zastarané a Jan Tvrdík tu kdesi odkazoval na manuál, kde sa písalo, že PHP 8 ich už nebude obsahovať. Prečítaj si trebárs o mysqli.Používať len tak operátor @ na potlačenie chýb tiež nie je najlepší nápad a zamyslel by som sa nad nutnosťou používať tzv. short_open_tag (<? namiesto <?php). Je to závislé na konfigurácii servera a teoreticky môže byť jedného dňa takisto označené ako zastarané/odstránené (a tuším to koliduje s XML tagom).
Tomášeek
Profil
lionel messi:
mysql_* funkcie. Tie síce ešte fungujú, tiež sú však označené ako zastarané a Jan Tvrdík tu kdesi odkazoval na manuál, kde sa písalo, že PHP 8
Nikoliv, jsou odstraněné v PHP7. Čili nefungují.

Grecky:
Upgrade z jedné prehistorické verze na druhou prehistorickou. Proč proboha?
lionel messi
Profil
Tomášeek:
Nikoliv, jsou odstraněné v PHP7. Čili nefungují.

Ďakujem za opravu. Mimochodom, Jan Tvrdík v predmetnom článku správne spomína PHP 7.
Grecky
Profil
Tomášeek:
Jde o to, že to je odborový web s hromadou článku a vyjádření a náš předseda trvá na jeho zachování a dostupnosti i když jsem vytvořil nový. Chápu, že je to úplně zbytečné a že za nějaký čas bude problém obdobný, ale domnívám se, že tou dobou na jeho zachování nikdo nebude trvat. Avšak teď ho musím zprovoznit a nechci ho přepisovat celý od píky, když nebude absolutně nijak využíván. Kór když je to buch ví jak upravený eshop... Jde mi pouze o to, aby fungoval do doby než naděje jeho soudný den. Díky za rady vyzkouším a snad se mi to konečně podaří.
Tomášeek
Profil
Grecky:
Mě to je celkem jedno. Jen, že podpora (aktualizace) PHP 5.6 byla ukončena v roce 2018 a od té doby je tedy potenciálně nebezpečná. Nemluvě o hostinzích, sllušný hosting ji za chvíli nebude mít ani v nabídce.

Pokud chceš provozovat archaismy, pak nechápu, proč řešíš upgrade na PHP 5.6 a nenecháš to na PHP 5.3. Vyjde to IMHO nastejno. No nic, pokud chceš upgradovat, hodně štěstí.
Davex
Profil
Grecky:
Pozor také na to, že v PHP 5.6 je výchozí kódování UTF-8 a některé funkce, jako třeba htmlspecialchars bez specifikovaného kódování, nemusí s daty v kódování Windows 1250 pracovat správně (například vrací prázdný řetězec).
Grecky
Profil
Davex:
To je specifikované v dalších souborech se, kterými to pracuje s tím by neměl byt problém. Přepsal jsem vše dle výše uvedeného, ale ještě jsem zjistil problém v datovém souboru s příkazy mysql. Většina šla nahradit mysqli, ale zbyly mi tři funkce, se kterými si nevím rady. Pak už by to snad mělo opět fungovat...
function tables_db($db)
    {
        $this->list_tb  = mysql_list_tables($db);
        return $this->list_tb;    
    }

function list_table()    
    {
        $this->pocet = mysqli_num_rows($this->list_tb);
        for ($i = 0; $i < $this->pocet; $i++):
            $this->tb_names[$i] = mysql_tablename($this->list_tb, $i);
        endfor;    
        return $this->tb_names;
    }

function get_num_rows()
    {
     return $this->num_rows = mysql_num_rows($this->result);     
    }
lionel messi
Profil
Grecky:
Většina šla nahradit mysqli

Aj mysql_num_rows sa dá bez problémov nahradiť mysqli_num_rows. :-)

Ku zvyšku: Názvy tabuliek v databáze si do poľa vieš naskladať pomocou mysqli_query a SQL príkazu SHOW TABLES FROM databaza, ten ti vráti riadky s názvami tabuliek. S výsledkom môžeš pracovať ako s akýmkoľvek iným výsledkom SQL pomocou funkcií ako mysqli_fetch_assoc či mysqli_fetch_all.
Grecky
Profil
lionel messi:
Děkuji, teoreticky chápu co se mi snažíš říct, ale prakticky to neumím napsat, aby to fungovalo... :-/
lionel messi
Profil
Grecky:
Nejako takto:

function tables_db($db, $conn) //spojenie k Mysqli predáme funkcii ako parameter
{
  $query = "SHOW TABLES FROM $db"; //vytvoríme SQL príkaz
  $this->list_tb = mysqli_query($conn, $query); //vykonáme SQL príkaz, return nepotrebujeme, výsledok sa nám uloží do $this->list_tb
}

function list_table()
{
  while ($row = mysqli_fetch_row($this->list_tb)):
    $this->tb_names[] = $row[0];
  endwhile;
  //znovu nepotrebujeme return, po zavolaní funkcie môžeme pristupovať k $this->tb_names a v tomto poli budeme mať všetky tabuľky, ale keď chceš, môžeš ho tam dať
}

function get_num_rows()
    {
     return $this->num_rows = mysqli_num_rows($this->result);     
    }

PS: Čo ťa vedie k miešaniu procedurálneho a objektového kódu?
Tomášeek
Profil
lionel messi:
$this->list_tb = mysqli_query($conn);
Tohle fungovat nebude :-)
Grecky
Profil
Tomášeek:
Bohužel máš pravdu ��
lionel messi
Profil
Tomášeek:
lionel messi:
$this->list_tb = mysqli_query($conn);
Tohle fungovat nebude :-)

Ďakujem za upozornenie, doplnil som druhý parameter.
Tomášeek
Profil
Grecky:
Bohužel máš pravdu ��
A napadlo tě otevřít dokumentaci a podívat se, proč to nebude fungovat? Škoda, že to lionel messi opravil, nápovědu jsi měl...

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