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 |
#2 · Zasláno: 30. 12. 2015, 14:12:07
mysql_connect. Vidíš tam ten velký warning hned na začátku?
|
||
RastyAmateur Profil |
#3 · Zasláno: 30. 12. 2015, 14:12:55
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 |
#5 · Zasláno: 30. 12. 2015, 14:23:45
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 |
#6 · Zasláno: 30. 12. 2015, 14:38:26
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 |
#7 · Zasláno: 30. 12. 2015, 14:42:09
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 |
#11 · Zasláno: 31. 12. 2015, 15:34:18
juriad:
Děkuji za radu - to je ta přesná trefa, co jsem potřeboval. A nyní vzhůru do práce ... |
||
tiso Profil |
#12 · Zasláno: 31. 12. 2015, 15:55:25
LubošNJ: ušetri si prácu a použi github.com/dshafik/php7-mysql-shim
|
||
LubošNJ Profil |
#13 · Zasláno: 1. 1. 2016, 13:55:11
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 |
#14 · Zasláno: 1. 1. 2016, 13:58:29
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 ...) |
||
Časová prodleva: 9 let
|
0