Dobrý den,
zjišťuji zda se mi z databáze podařilo dostat pole řádků => Array/NULL. Tudíž testuji:
if(($result = dotazSQL()) == NULL)
A vychází mi pokaždé 1 - jak je to možné? (echo $result hodí pokaždé "Array")
Děkuji.
Dobrý den,
zjišťuji zda se mi z databáze podařilo dostat pole řádků => Array/NULL. Tudíž testuji:
if(($result = dotazSQL()) == NULL)
A vychází mi pokaždé 1 - jak je to možné? (echo $result hodí pokaždé "Array")
Děkuji.
Vykonává se NULL část if - tak přeci když mám typeof Array, tak to není NULL...
if(!$result = $databaseUAC->select(array
(
"email" => $_POST["email"],
"passwd" => hash("sha256",
$_POST["passwd"], TRUE)
), array("=", "="), array(" AND ")))
{echo $result;
$msg = 5;
$title = "Error";
break;
}
Echo hází Array - jak se tedy může vykonat ta část if? (to s NULL jsem tam hodil ze zoufalství - také nešlo - se závorkami - kdekoliv...)
EDIT:
NULL si házím při neúspěchu sám - vím, že toto NULL není - dal jsem si break u příslušné části třídy... Přímý test NULL vyjde ve prospěch NULL - přičemž pole je skutečně prázdné. A také by mi echo hodilo NULL a ne Array - ne?
#3 Matěj Andrle
Prázdný array() je prázdná kolekce. Kolekce není null, ale může být prázdná.
Zkus testovat sizeOf($array) == 0
Když databáze nenalezne žádný záznam, tak to není chyba.
Špatně jsi to pochopil. NULL jsem dával při neúspěchu... Jinak pouze informuji, že takový uživatel neexistuje... Tento způsob jsem zavrhnul, jelikož mnohem lepší je výjimka. Jde mi jen o logiku - proč ten test hází 1...
Aha - naštěstí existují výjimky... :)
#5 Matěj Andrle
function select(...) {
if (sizeOf($array) == 0)
throw new Exception("Uživatel nenalezen");
return $result;
}
:
:
$result = $databaseUAC->select(array(
"email" => $_POST["email"],
"passwd" => hash("sha256",
$_POST["passwd"], TRUE)
), array("=", "="), array(" AND ")))
Nechápu...
if(!$query->execute($where))
throw new Exception("<h3>Connection with database failed!</h3>");
...
try
{
$result = $databaseAD->select
(
array("author" => $_SESSION["id"]),
array("=")
);
}
catch(Exception $e)
{
$msg = 5;
$title = "Error";
break;
}
PDO...
K mé?
Máš to tam - PDO execute selže - throw...
#13 Matěj Andrle
Asi máš chybné parametry execute(). Když nenajde žádný záznam, hlásí normálně TRUE. Co kdyby sis vypsal chybu, kterou execute() hlásí? Obvykle to bývá chybný počet parametrů.
BTW: K čemu slouží parametry
array("=", "="), array(" AND ")
?
BTW2: Proč tam máš proměnné $databaseUAC a $databaseAD? Kdo vymyslel tak hloupé názvy?
Kdybych to měl špatně, nefungovalo by mi to. Jenže funguje vše - přihlášení, registrace i správa reklam. Funguje i špatné zadání přihlašovacích údajů - to by podle tvé logiky nešlo - jenže jde. Normálně to hodí hlášku, že takové údaje v DB nejsou - mám to správně... Tudíž AD a UAC - nechápu co je špatného na názvech oněch proměnných. $database(tabulka) Dal-li bych jen UAC/AD, hůře bych se v tom orientoval... Vysvětli mi, jak mám dodržet vyhnutí se injekcím a přitom nelepení složitě dotazu... Když musím mít pole "sloupec" => hodnota...
Error!
Email or password was incorrect! Enter the correct login data and resubmit please. If you have forgotten your password, click here.
Jede jak má... (zadal jsem vymyšlený email a heslo)
#17 Matěj Andrle
Když ti to funguje, tak si nestěžuj. Zkratky se v názvech proměnných nemají používat. Netuším, co znamená UAC a AD.
Zkus ten dotaz napsat normálně, třeba takto
$select = $db->prepare("SELECT id FROM user WHERE email=? AND password=?");
$select->execute(array($_POST["email"], hash("sha256", $_POST["passwd"], TRUE)));
$user = $select->fetchColumn();
Jak vidíš, jde to i bez slepování.
Není to zkratka - znovu - je to název tabulky! O funkci myQuery jsem nevěděl - hned se na do podívám - děkuji. Kdo si kurník stěžuje na něco jiného, než na to, že Array není NULL? Nic jiného jsem neměl v plánu řešit - i když alespoň jsi mi ukázal efektivnější možnost vyhnutí se injekce...
EDIT:
ad - je ad - anglické slovo
UAC - User Account Control - určitě by to byl geniálně dlouhý název tabulky...
#20 Matěj Andrle
Název tabulky se přece píše za SELECT. Název metody "myQuery" mi tam zůstal po úpravách, patří tam "prepare". Opravil jsem to. Běžně na to mám vlastní metodu myQuery, kterou jsem se nakonec rozhodl nepoužít. Nyní je to vše ze standardních komponent PHP.
Buď je něco Array nebo NULL. Nikdy současně.
Místo UAC by se mi líbil víc název "user". Názvy tabulek se navíc píší malými písmeny.
Pak nechápeš proč to mám tak složité - OOP. Vytvořil jsem třídu pro všechny databáze a tabulky... Tudíž potřebuji v proměnné identifikovat název tabulky... Proto ani moc nevyužiji tvé funkce - neumožní mi takovou míru obecnosti - abych mohl aplikovat OOP. Tedy mít třídu DatabaseManager jako mám já... Zbavil jsem se potřeby opakovat již napsané SQL stringy - což je lepší - protože mnohdy se mění jen velmi malé části...
EDIT:
Zase nepochopení - mám to malým pojmemované v databázi! Proměnné - Camel case - databaseUac, Ad - by bylo divné - proto to mám celé velkým...
#22 Matěj Andrle
V databázích je přece zvykem používat snake_case.
Takže místo opakování jednořádkového SQL dotazu raději opakuješ pětiřádkové volání metody? Skvělý nápad.
Těch pět řádků je tam jen pro přehlednost... (vše jsou parametry) Nevšiml-li jsi si, tak právě nic neopakuji... "sloupec" => hodnota - to je celé... (oproti neustálému opakování velkých částí SQL stringů) To tvým způsobem by se sobě jednotlivé aspekty rovnaly - u mě ne... Znovu a zas, v databázi to mám pojmenováno dle pravidel pojmenovávání tabulek databáze.
Vytáhl jsi nejdelší, vytáhnu nejkratší:
$databaseAD->update(array("queue" => date("Y-m-d H:i:s")), $_GET["id"]);
$databaseUAC->select(array("email" => $email), array("="), NULL, "COUNT(*)");
$databaseAD->delete($_GET["id"]);
$databaseAD->update(array
(
"title" => htmlentities($_POST["title"]),
"refine" => htmlentities($_POST["refine"]),
"content" => htmlentities($_POST["content"])
), $_GET["id"]);
Parametry nesnížíš!
Ano - uvědomil jsem si svůj omyl... Čas dávno získávám z NOW() SQL - starší verze...
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku