Portál AbcLinuxu, 10. listopadu 2025 02:05
mysql_query($sql) OR die("Chyba!");
nevím co je dobře
$mysql_query = mysql_query($sql);
if(!$mysql_query) {
# chyba
}
nebo
$mysql_query = mysql_query(($sql),0);
if($mysql_query ==0) {
# chyba
}
nebo
$mysql_query = mysql_query(($sql),0);
if($mysql_query === false) {
# chyba
}
poradíte?
Děkuji
mysql_query() musíš vědět sám. Pokud máš současně vždy jen jedno spojení s databází, nemusíš druhý parametr uvádět.
if (!$resource = mysql_query($sql)) {
#chyba
}
if(!$result=mysql_query($sql)) throw new Exception("Chyba!");
Return Values For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error. For other type of SQL statements, INSERT, UPDATE, DELETE, DROP, etc, mysql_query() returns TRUE on success or FALSE on error.Takže správně je:
$result = mysql_query($query, $connection);
if ($result === FALSE) {
// Chyba
} else {
// Uspech
}
Pak je otázkou, zda je chyba vážná nebo ne. Pokud děláš select, tak tam asi budeš chtít pomocí error_log() zaznamenat detaily o chybě. Pokud to je insert/update, tak jsi třeba jen narazil duplicitou na unikátní klíč a 'chyba' je vlastně v pořádku.
Ale asi nejlepší je použít nějakou nadstavbu, třeba dibi.
FALSE (0,'', NULL…) to vrátit nemůže, buď je to resultset, nebo TRUE nebo FALSE.mysqli_fetch.
try {
$dotaz = $pdo->prepare($sql);
$dotaz->execute();
$r = $dotaz->fetchAll();
/** uděláme něco s výsledkem */
} catch (PDOException $e) {
/** uděláme něco s chybou */
}
A před execute() ještě nastavíš parametry dotazu (nebudeš je vkládat do textu SQL):
$dotaz->bindParam($parametr, $jehoHodnota);
$parametr je buď pořadí (od 1) nebo název parametru – do SQL dáš třeba
SELECT * FROM tabulka WHERE id = :nazevParametrunebo tam dáš jen otazník a odkážeš se na parametr podle jeho pořadí.
$q = dibi::select('t.id, t.name, t.address')
->from('`table` t');
if ($show_last_month_only) {
$q->where('t.mtime > NOW() - INTERVAL 1 MONTH');
}
if ($city != '') {
$q->leftJoin('`address` a')->on('a.id = t.address');
$q->where('a.city = %s', $city);
}
if ($count > 0) {
$q->limit($count, $offset);
}
Jakpak by to asi vypadalo, kdyby se lepily kousky stringů dohromady? A jak by se takový slepenec rozšiřoval o další možnosti filtrování?
Ale když vidím, jak tazatel používá funkce typu mysql_query(), tak mi přijde nevhodné přeskočit tolik vrstev a radit rovnou tyhle vysokoúrovňové věci (jednak nejsou vždy tím nejlepším řešením a jednak je lepší, když si tím člověk projde postupně a nepřeskakuje).
Jakpak by to asi vypadalo, kdyby se lepily kousky stringů dohromady? A jak by se takový slepenec rozšiřoval o další možnosti filtrování?1) Tyhle dynamické (strukturou) dotazy jsou celkem výjimečná věc – ve většině aplikace si vystačíš s SQL, které je vždy stejné a liší se jen parametry (a ty dynamické budeš potřebovat jen v nějakém vyhledávání resp. filtru, kde uživatel zadává různé podmínky). 2) SQL se dá poslepovat z kousků textu, kdy ale lepšíš jen (bezpečné) názvy sloupců a otazníky (nebo zástupky typu
:parametr1), ale ne (nebezpečná) data od uživatele – ta tam dostaneš parametrizací dotazu. Pořád je to lepší, než způsob, jakým velká část lidí na webu „programuje“
funkce() or die();
ale nelze napsat:
funkce() or moje_obsluha();
Dal jsem jim na to bugreport, ale odmítli se tím zabývat, takže to asi v dohledné době nepůjde.
Mimochodem v PHP je podobných bastů daleko víc, například nedodělané lambda funkce přes create_function() pro array_map() - ve srovnání s předlohou v Perlu toho umí míň, a jsou naimplementované tak špatně, že je v oficiálním manuálu ani nedoporučují používat.
function foo()
{
print(__METHOD__);
return false;
}
function bar()
{
print(__METHOD__);
return true;
}
foo() or bar();
mi vypise:
foobar
foo() or bar() samozřejmě funguje, nefunguje foo() or throw new \Exception.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.