Autor Zpráva
LubošNJ
Profil
Už několik let mám nainstalovaný balíček XAMPP pro Windows (nyní pro Windows 10 Home), pomocí kterého si spouštím vlastní programy (pozůstatek z mé
praxe) důležité pro mou domácnost (stavy energií a pod.) či záliby (inventura používaného softwaru, vizitky apod.). Vždy jsem používal poslední verzi
ze stránek Apachefriends.org, naposledy tedy verzi 5.6.15.1.VC11. Server Apache i databázový server MySQL nespouštím jako služby, ale jako samostatné
procesy aktivované z XAMPP Control Panel. Všechno mi v této verzi funguje jak má.

Před pár dny vyšla nová aktualizace tohoto balíčku s identifikací 7.0.0.0.VC14, která obsahuje již PHP verzi 7.0 a namísto databázového serveru MySQL
používá novější MariaDB. Dle informací na stránkách distributora i v diskuzích není nutno dělat jakékoli změny systémových souborů po instalaci tohoto
balíčku (všechno je nastaveno vlastním instalátorem) a také není nutno upravovat PHP skripty v aplikacích (tyto informace jsem nalezl tamtéž). Přesto
se mi po spuštění mé aplikace objevila chybová hláška "Call to undefined function MySQL_Connect ...", která ukazovala přímo na řádek se zápisem
"$dbserver = MySQL_Connect($host,$uzivatel,$heslo);". Položky $host, $uzivatel a $heslo mám samozřejme vyplněny ve stejném skriptu před tímto příkazem.

Hledáním na netu jsem objevil stovky a stovky stejných problémů, avšak s řešením pro starší verze PHP (což by ani tak nevadilo), Téměř všechny problémy
se měly opravit tak, že se v souboru PHP.INI povolí používání souboru extension=php_mysql.dll. Když jsem to aplikoval u sebe a chtěl restartovat
Apache, tak ten se zhroutil a nastartovat vůbec nejde. Když jsem tuto změnu vrátil zpět, tak Apache i MySQL (MariaDB) se spustili, ale ta chybová
hláška při napojení skriptu na databázový server se objevila znovu (logicky).

Má někdo z vás po ruce řešení mého problému, prosím? Nechci dohady a změny serveru apodobně, pouze konkrétní návrhy na nastavení toho softwaru, který
mám nainstalovaný. Určitě to bude nějaká "prkotina", ale zatím nevím jaká. Už se s tím trápím asi čtyři dny. Snad mi pomůže nějaká dobrá duše z netu, ať se nemusím vracet k předchozí verzi.

Předem děkuji.
juriad
Profil
mysql_connect. Vidíš tam ten velký warning hned na začátku?
RastyAmateur
Profil
Dle mého názoru to bude tím, že PHP 7.0 již nepodporuje funkce mysql_ (konkrétně MySQL_Connect()). Najdu článek, který jsem nedavno četl, o přechodu k mysqli*. Vydrž chvilku :)
Lonanek
Profil
Uvedená funkce je v php 5.5.0 deprecated a v php 7.0 byla odstraněna.
Vaši aplikaci musíte upravit pro použití s php7. Předpokládám, že to nebude pouze tato jedna funkce, která se bude muste upravit.

Použijte mysqli_connect() nebo PDO::__construct()
RastyAmateur
Profil
Tak to co jsem chtěl, jsem bohužel nenašel. Je to škoda, bylo to tam dokonale popsané, ale našel jsem Fisirův článek. Tam se dovíš asi vše, popř. se zde zeptáš... :-)
LubošNJ
Profil
RastyAmateur:
Óóó, děkuji. Ten článek je napsán fakt dobře, takže jak to tak vidím, tak mě v nejbližších dnech čeká přeprogramování asi 220 skriptů. Co jsem chtěl, to mám ...
Pozn.: s tím přechodem na Mysqli jsem uvažoval již před rokem, nyní mě to už asi donutí. Ještě jednou děkuji za fakt prospěšnou inspiraci na vyřešení mého problému.
Přeju příjemného Silvestra (bez následků) a všechno nejlepší do nového roku - toto platí pro všechny lidi dobré vůle. HOWGH
Alphard
Profil
Připadám si hloupě, že tady jako čtvrtý píši prakticky totéž, ale tuším, že tohle vlákno bude v příštích letech hodně vyhledávané/odkazované a nelíbí se mi zdejší rady.

Mysql extenze je od PHP 7 zrušena (zůstává v PECL), tudíž je třeba aplikace pracující s touto knihovnou pro novou verzi PHP přepsat. Nejobvyklejší rady, které lze najít, se drží alternativ v nativním PHP, tj. především MySQLi nebo PDO (viz výše). Můj názor je takový, že v PHP neexistuje nativní vrsta pro pohodlnou práci s databází a doporučil bych porozhlédnout se po knihovnách třetích stran.

Asi nejkonzervativnější (ale jinak vynikající řešení) nabízí dibi. Pokud pracujete se staticky drženým připojením, bude přepsání mysql_query('SQL dotaz') na dibi::query('SQL dotaz') zdaleka nejjednodušší cesta, protože nebude nutné všude propagovat referenci na připojení (neříkám, že je to ideální stav, ale mnozí to asi ocení). Pokročilejším uživatelům se budou líbit parametrizované dotazy, fluent rozhraní nebo metody jako insert/update/delete.

Pokročilejší knihovny tady už rozebírat nebudu, ale dovolím si zmínit alespoň Nette\Database, která vznikla spojením dibi a NotORM. Její použití už není úplně jednoduché, ale zvládá např. automatické připojování tabulek (i M:N vztahy), což se může hodit.
RastyAmateur
Profil
LubošNJ:
Nebo ještě místo přeprogramovávání můžeš přeinstalovat server na nižší verzi. To jsi ovšem nechtěl. V tuto chvíli by to bylo lehčí řešení...


Jinak také přeji krásného Silvestra a příjemný vstup do roku 2016
LubošNJ
Profil
OK, tak jsem se pustil do přepisování skriptů ze syntaxe MySQL do MySQLi a přišly samozřejmě problémy. Nepoužívám objektové programování, ale
procedurální, takže spousta příkladů na netu je pro mne trochu španělská vesnice. Může mi někdo z vás ochotných našeptávačů prozradit rozdíly v
syntaxi?

Mám např. původní skript pro MySQL (obecně, nikoli skutečné hodnoty):

$host = "localhost";
$uzivatel = "guest";
$heslo = "password";
$databaze = "zamestnanci";
    
$dbserver = @MySQL_Connect($host,$uzivatel,$heslo);    // napojení na server
if(!$dbserver)
  {
  ... chyba spojení s serverem...
  exit;  
  }

$db = @MySQL_Select_DB($databaze, $dbserver);    // napojení na databázi
if(!$db)
  {
  ... chyba spojení s databází ...
  exit;  
  }

$sql = "SELECT IDX, jmeno, prijmeni FROM tabulka ORDER BY prijmeni, jmeno";    // vytvoření dotazu
$dotaz = MySQL_Query($sql, $dbserver);        // provedení dotazu

$radek = 0;
while(@MySQL_Fetch_Row($dotaz))        // načtení věty a zpracování
    {
    $inp_IDX = MySQL_Result($dotaz, $radek, 'IDX');        // načtení konkrétní položky do proměnné
    $inp_jmeno = MySQL_Result($dotaz, $radek, 'jmeno');
    $inp_prijmeni = MySQL_Result($dotaz, $radek, 'prijmeni');

    echo "<BR>".$radek.": ".$inp_prijmeni." ".$inp_jmeno;    // zpracování výsledků dotazu
    $radek++;
    }
@MySQL_Close($dbserver);

Nyní tento příklad potřebuji převést do syntaxe MySQLi. Zatím jsem přišel pouze na toto:

$dbserver = @MySQLi_Connect($host,$uzivatel,$heslo,$databaze);    // napojení na server i databázi
if(!$dbserver)
  {
  ... chyba spojení ...
  exit;  
  }

$sql = MySQLi_prepare($dbserver, "SELECT IDX FROM tabulka ORDER BY prijmeni, jmeno");    // příprava dotazu

... a dále nevím!

poraďte mi, prosím přepsat výše uvedený příklad do MySQLi, mám těch skriptů opravdu hodně, takže vaše pomoc bude pro mne nedocenitelná.
Děkuji.


Moderátor juriad: Neobaluj prosím celý příspěvek mezi značky [pre] a [/pre].
juriad
Profil
Připravené dotazy nemusíš používat. Použij mysqli_query($dbserver, "select ...");
K mysql_fetch_row existuje mysqli_fetch_row (a nepotřebuje žádný parametr navíc).
mysql_result nepoužívej, přistupuj k výsledku fetche jako k poli (to fungovalo i v dříve s mysql_fetch_row).

$vysledek = mysqli_query($dbserver, $sql); 

$radek = 0;
while($row = mysqli_fetch_row($vysledek))        // načtení věty a zpracování
    {
    $inp_IDX = $row['IDX'];        // načtení konkrétní položky do proměnné
    $inp_jmeno = $row['jmeno'];
    $inp_prijmeni = $row['prijmeni'];
 
    echo "<BR>".$radek.": ".$inp_prijmeni." ".$inp_jmeno;    // zpracování výsledků dotazu
    $radek++;
    }
LubošNJ
Profil
juriad:
Děkuji za radu - to je ta přesná trefa, co jsem potřeboval. A nyní vzhůru do práce ...
tiso
Profil
LubošNJ: ušetri si prácu a použi github.com/dshafik/php7-mysql-shim
LubošNJ
Profil
juriad:
(Pouze pro informaci:)
Upravené skripty v jednom programu už fungují, je to OK. Jediný problém mám však s nastavením znakové sady v databázi.
U MySQL a PHP 5 jsem po úspěšném otevření databáze používal příkazy:

MySQL_query("SET character_set_client=utf8");
MySQL_query("SET character_set_connection=utf8");
MySQL_query("SET character_set_results=utf8");

ovšem u MySQLi a PHP 7 mi tyto příkazy nefungují (upravené na MySQLi). Data v databázi mám uložená právě v této znakové sadě, takže se mi pak zobrazují špatně.
V manuálu PHP 7 (php.net/manual/en/book.mysqli.php) jsem to nenašel. Je nějaká jiná finta, prosím? Dík
RastyAmateur
Profil
Asi hledáš mysqli->set_charset(), nebo to není ono?
LubošNJ
Profil
RastyAmateur:
Příkaz mysqli_character_set_name (pro procedurální zápis) pouze zjišťuje nastavení, nikoliv nastavuje sadu. Zkoušel jsem různé varianty příkazu, ale nechytám se.

Mám to - použil jsem
$result = mysqli_query($dbserver,"SET character_set_client=utf8")
$result = mysqli_query($dbserver,"SET character_set_connection=utf8")
$result = mysqli_query($dbserver,"SET character_set_results=utf8")

(... jak jednoduché, a já vymýšlel bůhvíco ...)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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