Try { smth } catch { – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Try { smth } catch { – MySQL – Fórum – Programujte.comTry { smth } catch { – MySQL – Fórum – Programujte.com

 

noro
~ Anonymní uživatel
25 příspěvků
29. 12. 2015   #1
-
0
-

Dobý deň,  prosím Vás kde mám chybu dostávam hlásenie:Parse error: syntax error, unexpected 'catch' (T_CATCH)

function opendatabase(){
$db =mysqli_connect(MYSQLHOST,MYSQLUSER,MYSQLPASS) or die(mysql_error());
try {
    if (!$db){
        $exceptionstring = "Error connecting to database: <br />";
        $exceptionstring .= mysql_errno() . ": " . mysql_error();
        throw new exception ($exceptionstring);
    } else {   
        mysql_select_db("test",$db) or die(mysql_error());
        return $db;
    } catch (Exception $e) {
        echo $e->getmessage();
        die();
    }
}

Nahlásit jako SPAM
IP: 178.41.81.–
ondrej39+1
Věrný člen
29. 12. 2015   #2
-
0
-

#1 noro
Try a catch mají být na stejné úrovni, ty máš catch do try zanořený.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
noro
~ Anonymní uživatel
25 příspěvků
29. 12. 2015   #3
-
0
-

#2 ďakujem, mám dalšie hlasenie

Warning: mysql_select_db() expects parameter 2 to be resource, object given in

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
29. 12. 2015   #4
-
0
-

#1 noro
Doporučuji tento silně zastaralý a dále nepodporovaný kód zahodit. Zapomeň na funkci die(). Nauč se PDO, které je bezpečnější a pohodlnější:

<?php
function opendatabase($host, $user, $password) {
    $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    );
    $dsn = "mysql:host=$host;dbname=test";
    try {
        $db =  new PDO($dsn, $user, $password, $options);
    } catch (Exception $e) {
        throw new Exception("Nepodařilo se připojení k databázi: "
            . $e->getmessage();
    }
    return $db;
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
29. 12. 2015   #5
-
0
-

#4 Kit
Ďakujem popozerám to. Problém je v tom že každý požuvá inakší zápis.

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
29. 12. 2015   #6
-
0
-

#5 noro
Normálně používám jiný (kratší) zápis, ale v daném případě jsem se snažil přizpůsobit tvému zápisu, aby to fungovalo zhruba stejně. Ve zjednodušené podobě to vypadá takto: 

<?php
function opendatabase($host, $user, $password) {
    $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    );
    $dsn = "mysql:host=$host;dbname=test";
    $db =  new PDO($dsn, $user, $password, $options);
    return $db;
}

Jak vidíš, blok try { } catch { } jsem zcela vyhodil jako zbytečný, protože PDO již má vše potřebné. Navíc v této podobě to již nastavuje korektní práci s češtinou v UTF-8 a vyhazování výjimek při všech chybách práce s databází. Všechny detekce návratových kódů z databáze je možné vyhodit a soustředit se na tvorbu aplikace.

Nemám totiž rád "else", nepoužívám ho. Pokud je to možné, vyhýbám se i "if", "while" a "switch". A když už použiji "switch", tak zásadně bez "break".

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
29. 12. 2015   #7
-
+1
-
Zajímavé
Kit +

A až budeš mít chuť to dělat, tak, jak se v OOP jazyce dělat má, zapomeň na standalone metody a databázi si zabal do objektu implementující vlastní databázový interface, kterému již hotový PDO (nebo jiný driver) předáš.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
Kit+15
Guru
29. 12. 2015   #8
-
0
-

#7 ondrej39
Sám jsem si to udělal tak, že si PDO balím do třídy MyPDO (resp. SQLitePDO a PgPDO), která pak slouží jako továrna na objekty třídy PDOStatement. S těmi už pak pracuji bez obalu.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
30. 12. 2015   #9
-
0
-

#8 Kit
A aký program požuváte? Ja používam text editor. S programami som mal problém, veľa veci čo som chcel sa my písane v programoch sa mi nezobrazovalo. A text editore nebol problém. Neviem prečo

Nahlásit jako SPAM
IP: 178.41.81.–
noro
~ Anonymní uživatel
25 příspěvků
30. 12. 2015   #10
-
0
-

#9 noro
A prečo sa píš niekedy mysql a niekedy mysqli?

Nahlásit jako SPAM
IP: 178.41.81.–
ondrej39+1
Věrný člen
30. 12. 2015   #11
-
+1
-
Zajímavé
Kit +

#9 noro
Osobně používám:

Volba prostředí je ale velmi subjektivní. Já jsem bez IDE bezradný, pokud si to ale dobře pamatuji, třeba konkrétně Kit nepoužívá IDE vůbec.

#10 noro
Velmi jednoduše řečeno je MySQLi nové rozhraní sloužící pro komunikaci s MySQL databázi z PHP. Nabízí různé opravy a přidává nějaké vlastnosti (to vše se dá dohledat na internetu). Důležitý je ovšem fakt, že MySQLi je bezpečnější díky prepared příkazům a také to, že původní mysql_* driver je považován za zastaralý a ačkoliv stále funguje, již několik let se hovoří o tom, že budoucí verze PHP ho podporovat vůbec nebudou.

Pokud si máš ale zvolit čistý php driver pro manipulaci databáze, pak je jednoznačně nejlepší volbou stále PDO.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
noro
~ Anonymní uživatel
25 příspěvků
30. 12. 2015   #12
-
0
-


<?php
$host = "localhost";
$user = "user";
$password = "";
$db = "test";

function opendatabase() {
     $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
    );
    $dsn = "mysq:host=localhost;dbname=test";
    $db =  new PDO($dsn, 'user', '', $options);
    return $db;
$db->close();
}
?>

Skúšal som vrchný kód dostal som hlásenie:

-Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in

-PDOException: could not find driver in

Stále tam je nijaký problém potrebujem niečo nainštalovať?

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
30. 12. 2015   #13
-
0
-

#9 noro
Používám textový editor Vim, ale většina ostatních programátorů používá nějaké IDE. Obojí má své pro i proti.

#10 noro
PHP má k databázi MySQL tři ovladače: Zastaralý a zavrhovaný procedurální MySQL, nověji hybridní ovladač MySQLi, se kterým se dá pracovat podobojí a nejnověji plně objektové PDO, které sjednocuje ovládání různých databází typu SQL. Druhý a třetí v sobě obsahuje ochranu před útoky SQL Injection. Třetí se mi jeví jako nejpohodlnější, viz můj příklad.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
30. 12. 2015   #14
-
0
-

#12 noro
Tady vidíš výhodu PDO: Když tomu něco chybí, vyhodí ti to jako výjimku a problém správně pojmenuje. Máš tam v proměnné $dsn překlep - místo slova "mysq" patří "mysql". To slovo označuje druh databáze, "mysq" pochopitelně neexistuje.

K čemu tam máš $db->close(); na konci? To nedělej. Je to zbytečné a v uvedeném případě i nefunkční.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
30. 12. 2015   #15
-
0
-

Aj tak som to mal mám tam ďalšie hlásenie

Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead

Nahlásit jako SPAM
IP: 178.41.81.–
noro
~ Anonymní uživatel
25 příspěvků
30. 12. 2015   #16
-
0
-

A keď tam dám mysqli

-Fatal error: Uncaught exception 'PDOException' with message 'could not find driver'

-PDOException: could not find driver

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
30. 12. 2015   #17
-
0
-

#15 noro
Funkce mysql_real_escape_string() je v PDO nahrazena metodou $db->quote(), která zároveň doplní i potřebné apostrofy kolem výstupního stringu. Je tak chytrá, že to dělá podle typu databáze, ke které je připojena. PostgreSQL tedy escapuje jinak než MySQL.

Sám ji však nepoužívám, protože jsem si oblíbil prepared statements, které se bez toho zcela obejdou.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
30. 12. 2015   #18
-
0
-

#16 noro
Psal jsem, že tam patří "mysql".

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
30. 12. 2015   #19
-
0
-

#16 noro
Do konstruktoru PDO vkládáš ty databáze. Typy databází jsou třeba SqlLite, MS Access, MySQL, PosgtreSQL, Oracle nebo MsSQL. Zde máš seznam databází, které PDO podporuje.

mysql_*, mysqli_* a PDO v PHP ale nejsou typy databází, to jsou drivery, které používáš pro interakci s ní. Do konstruktoru PDO patří typy databází, nikoliv drivery.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
noro
~ Anonymní uživatel
25 příspěvků
30. 12. 2015   #20
-
0
-

Pohlo sa to ďakujem .

Select má vyzerať nijak takto?

$querystr = $conn->prepare("SELECT userid FROM user WHERE name =LOWER(" .  $db->quote( $_GET['sstring']) . ")");

Nahlásit jako SPAM
IP: 178.41.81.–
ondrej39+1
Věrný člen
30. 12. 2015   #21
-
0
-

#20 noro 

$lowerCaseString = strtolower($_GET['sstring']);

$statement = $conn->prepare("SELECT userid  FROM user WHERE name = ?");
$successfullyExecuted = $statement->execute([
    $lowerCaseString,
]);

if ($successfullyExecuted === true) {
    while ($row = $statement->fetch()) {
        // work with the $row variable
    }
}

Nechtěj po databází, aby za tebe prováděla agregační funkce typu LOWER, pokud nemusí.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
noro
~ Anonymní uživatel
25 příspěvků
30. 12. 2015   #22
-
0
-

#21 ondrej39

Ďakujem Si super!!!!  funguje to. A na konci to netreba zatvoriť?

ukončil som to takto:

$lowerCaseString = strtolower($_GET['sstring']);

$querystr = $db->prepare("SELECT user_id  FROM users WHERE user_name = ?");
$successfullyExecuted = $querystr->execute([
    $lowerCaseString,
]);

if ($successfullyExecuted === true) {
    while ($row = $querystr->fetch()) {
    //Then return with an error.
?><span style="color: #FF0000;">Name not found...</span><?php
        // work with the $row variable
    }
}
else {
//At this point we would go to the processing script.
?><span style="color: #FF0000;">Form would now submit...</span><?php
}

Toto Dostávam na konci:

Name not found...Form would now submit... Name not found...Name not found...Form would now submit...

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
30. 12. 2015   #23
-
0
-

#22 noro
K čemu potřebuješ proměnnou $successfullyExecuted ? Prostě to vyhoď.

Databázi otevřenou přes PDO není potřeba zavírat, protože se sama zavře v destruktoru, jakmile $db opustí scope, tedy "zmizí z dohledu".

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
31. 12. 2015   #24
-
0
-

#23 Kit
$successfullyExecuted som robil podľa Ondreja. Dal som to preč ale teraz sa mi zobrazuje len čo je za else:


$db = opendatabase();
$lowerCaseString = strtolower($_GET['sstring']);


$stmt =( $db->prepare("SELECT user_id  FROM users WHERE user_name =$lowerCaseString"));


if ($stmt  === 0){

while ($row =$stmt->fetch())
    //Then return with an error.
?><span style="color: #FF0000;">Name not found...</span><?php
        // work with the $row variable
    
}
else {
//At this point we would go to the processing script.
?><span style="color: #FF0000;">Form would now submit...</span><?php
}
?>

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
31. 12. 2015   #25
-
0
-

#24 noro

Myslel jsem, že odstraníš i patřičný if a else a ponecháš jen ten cyklus while.

<?php
// ...

while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
    echo $row['user_id'] . "<br>";
}
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
31. 12. 2015   #26
-
0
-

#25 Kit

Takt som to našiel aj ja na internete, ale ja som práve if a else chcel použiť ale nikde som to nenašiel len takto:


$db = opendatabase();
//Set up the dynamic query string.
$querystr = "SELECT userid FROM user WHERE name =
LOWER('" . mysql_real_escape_string ( $_GET['sstring']) . "')";
if ($userquery = mysql_query ($querystr)){
if (mysql_num_rows ($userquery) == 0){
//Then return with an error.
?><span style="color: #FF0000;">Name not found...</span><?php
} else {
//At this point we would go to the processing script.
?><span style="color: #FF0000;">Form would now submit...</span><?php
}
} else {
echo mysql_error();
}

Ale pre PDO som nenašiel. Neviem to dokončiť

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
31. 12. 2015   #27
-
0
-

#26 noro
Zkus naznačit účel toho požadovaného ifu. Potřebuješ počet získaných záznamů?

Pokud chceš jen zjistit, jestli jsi našel alespoň jeden záznam, tak v tom mém posledním příkladu místo while jen použiješ if.

Uvědom si, že dotaz SELECT je úspěšný i v případě, když nic nenajde. Prázdný výstup není chybou.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:15ed:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
31. 12. 2015   #28
-
0
-

Má zistiť či je db. Požadované meno alebo neni. Či že jeden záznam.

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
31. 12. 2015   #29
-
0
-

#28 noro
Takže už víš, jak na to. Viz výše.

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.
noro
~ Anonymní uživatel
25 příspěvků
31. 12. 2015   #30
-
0
-

Skúšal som to aj takto. Nepíše to chybu ale ani žiadne hlásenie aj keď je tam správne meno čo je DB

$lowerCaseString = strtolower($_GET['sstring']);
$stmt =( $db->prepare("SELECT user_id  FROM users WHERE user_name =$lowerCaseString"));
while ($row =$stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['user_name'] . $lowerCaseString."<br>";
}

Neni tam nijaká chyba?

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
31. 12. 2015   #31
-
0
-

#30 noro
Však ti tam chybí řádky, které jsme si už vyjasnili a to while jsi za if nezaměnil. A proměnná $lowerCaseString nemá v tom SQL dotazu co pohledávat - místo ní patří otazník.

Projdi si celou diskuzi znovu a udělej to pořádně.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
31. 12. 2015   #32
-
0
-

ďakujem ide to

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
1. 1. 2016   #33
-
0
-

#32 noro
Ještě bys neměl zapomínat na bloky try { } catch () { }, které jsem sice ze svých ukázek vypustil, ale ještě to neznamená, že je nepoužívám. Jen je mám vně takových celků. Záleží na vývojáři, jakou potřebuje jejich granularitu - může stačit i jediný blok try .. catch na celou aplikaci.

Obvykle však mám dvě až tři vrstvy ošetření výjimek, aby se aplikace i v případě chyby chovala "tak nějak rozumně". V žádném případě není nutné ošetření výjimky cpát do bloku (resp. třídy, metody), ve kterém k té výjimce může dojít.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
2. 1. 2016   #34
-
0
-

#33 Kit
Prosím Vás a ako môžem zobraziť celú DB ? Takto sa mi to podarilo poskladať len sa to zobrazuje po jednom.

$query = $db->prepare("SELECT content FROM block  ORDER BY RAND() LIMIT 1");
$query->execute(array(':block'));
 
   $i=0;
   while ($row = $query ->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)){
 
    echo $row[$i] . "\n";$i++;
 }

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
2. 1. 2016   #35
-
0
-

#34 noro
Bohužel tomuto zápisu vůbec nerozumím a ani netuším, co to má dělat.

Víš vůbec, co znamená ta klauzule "LIMIT 1"? Pokud ne, tak proč to tam dáváš?

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:2877:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
noro
~ Anonymní uživatel
25 příspěvků
4. 1. 2016   #36
-
0
-

ďakujem za odpoveď len som to našiel ne jednej stránke.  PDO funkciami nemám skúsenosti ale čo som potreboval našiel som na jednej stránke :http://code.tutsplus.com/…y--net-25338 .Nič lepšie som nenašiel.

Nahlásit jako SPAM
IP: 178.41.81.–
Kit+15
Guru
4. 1. 2016   #37
-
0
-

#36 noro
Ta stránka vypadá velmi dobře. Má jen jednu vadu: Je tam toho moc a je možné, že právě z toho jsi zmaten.

Chybí mi tam použití čtvrtého parametru konstruktoru třídy PDO, ale to chybí snad ve všech návodech (kromě mých). Citelně tam chybí zmínka o způsobu používání znakové sady UTF-8, bez kterého je databáze v našem prostředí nepoužitelná.

Takže zde máš mnou vypilované připojení k MySQL pro české prostředí: 

<?php
$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
);
$dsn = "mysql:host=$host;dbname=$dbname";
$db =  new PDO($dsn, $user, $password, $options);

Můžeš to celé zavřít do try .. catch dle potřeby. Na rozdíl od nich mi to vyhodí výjimku i při chybě otevření databáze, což považuji za užitečné.

Zbytek klidně dělej podle toho návodu.

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.
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, 3 hosté

Podobná vlákna

C# - Try and Catch — založil TonyT

Try catch — založil birkof

Try catch finally — založil damegu

Try-Catch blok vysvětlení — založil Noobster

 

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