Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: ZAJDAN 23. 09. 2015, 13:34:02
-
Ahoj,
lze v syntaxi PHP- PDO používat operátory tímto způsobem?
$prepared_get_cabinetNumber = $pdo->prepare( "SELECT cabinetNumber FROM customer WHERE uniq = :uniq" )
$prepared_get_code = $pdo->prepare( "SELECT TOP 1 cabinet_" +$prepared_get_cabinetNumber "FROM code_stack" );
díky
-
Ahoj,
lze v syntaxi PHP- PDO používat operátory tímto způsobem?
$prepared_get_cabinetNumber = $pdo->prepare( "SELECT cabinetNumber FROM customer WHERE uniq = :uniq" )
$prepared_get_code = $pdo->prepare( "SELECT TOP 1 cabinet_" +$prepared_get_cabinetNumber "FROM code_stack" );
díky
Druhý riadok je určite syntakticky nesprávne, PHP už roky nepoužívam, ale tuším to ide minimálne dvoma spôsobmi:
$prepared_get_code = $pdo->prepare( "SELECT TOP 1 cabinet_" . $prepared_get_cabinetNumber . "FROM code_stack" );
$prepared_get_code = $pdo->prepare( "SELECT TOP 1 cabinet_{$prepared_get_cabinetNumber} FROM code_stack" );
-
Druhý riadok je určite syntakticky nesprávne, PHP už roky nepoužívam, ale tuším to ide minimálne dvoma spôsobmi:
$prepared_get_code = $pdo->prepare( "SELECT TOP 1 cabinet_" . $prepared_get_cabinetNumber . "FROM code_stack" );
$prepared_get_code = $pdo->prepare( "SELECT TOP 1 cabinet_{$prepared_get_cabinetNumber} FROM code_stack" );
moc díky....
zrovna to zkouším oběma způsoby, ale nedaří se...do browseru se vrací:
Status Code:500 Internal Server Error
-
Ahoj,
lze v syntaxi PHP- PDO používat operátory tímto způsobem?
$prepared_get_cabinetNumber = $pdo->prepare( "SELECT cabinetNumber FROM customer WHERE uniq = :uniq" )
$prepared_get_code = $pdo->prepare( "SELECT TOP 1 cabinet_" + $prepared_get_cabinetNumber + "FROM code_stack" );
Takhle to určitě nejde, protože metoda prepare() není žádné makro, aby se něco takového dalo slepovat. Proč to nedáš do jednoho uceleného dotazu?
-
tak jsem odhalil prvni pricinu problemu
1) mysql neumi klausuly TOP namisto toho se tam pouziva LIMIT
2) ta dosazena promena v SQL dotazu obsahuje pdo sql, ktery se vlastne jeste nevykonal a proto si myslim, ze je potreba ho nejdrive vykonat a pote i fetchnout do promene a teprve tu dosazovat
nyni to mam tedy takto:
$prepared_get_cabinetNumber = $pdo->prepare( "SELECT cabinetNumber FROM customer WHERE uniq = :uniq" );
$prepared_get_cabinetNumber->bindParam(':uniq', $uniq, PDO::PARAM_STR);
$prepared_get_cabinetNumber->execute();
$result = $prepared_get_cabinetNumber->fetchAll();
$prepared_get_code = $pdo->prepare( "SELECT cabinet_". $result . "FROM code_stack LIMIT 1" );
$prepared_get_code->execute();
ale vrací to:
Connection failed: SQLSTATE[]: Column not found: 1054 Unknown column 'cabinet_ArrayFROM' in 'field list'
coz bude pravdepodobne zpusobene ze fetchAll(); vrací pole
no kurna to jeste budou speky :)
-
no kurna to jeste budou speky :)
Tak si konečně přestaň hrát s kabinety a udělej to stejně, jak to dělají ostatní.
-
tak vyreseno....
$result(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR);
to mi varti element z pole jako string a pak uz se pekne dosazuje:
$prepared_get_code = $pdo->prepare( "SELECT cabinet_". $result . "FROM code_stack LIMIT 1" );
cimz vznikne sql dotaz "SELECT cabinet_1 FROM code_stack LIMIT 1"
proc jsem to nemohl delat jako ostatní? protoze tech cabinetu mam 1000 a ja nevim ktery se mi do promene dostane a nez abych psal 1000 SQL podminek tak si na konec indexu sloupce dosadim promenou.
-
ano mysql neni totiz mssql a jeste takova vec krom limit umi i offset ten mssql uz teda taky ale neni tomu tak dlouho
-
proc jsem to nemohl delat jako ostatní? protoze tech cabinetu mam 1000 a ja nevim ktery se mi do promene dostane a nez abych psal 1000 SQL podminek tak si na konec indexu sloupce dosadim promenou.
Otázka zněla: Proč máš 1000 kabinetů místo jednoho?
-
protože těch cabinetů skutečne 1000 je
jde o skříně, které se pronajímají zákazníkům
ve skutečnosti to vypadá tak, že mi přijde do jedné z proměnéných ID zákazníka (požadavek na změnu kodu)
pomocí ID si z jedné tabulek databáze vytáhnu jakou má přidělenou skříň a výsledek je uložen do proměné
právě do té, kterou jsem tady řešil
a já nemusím psát na každou skříň dotaz/podmínku, ale pomocí proměné dosadím konec indexu sloupce a hrábne to pro kód tak kam je potřeba
každá skříň má speciální elektronický číselný zámek s předdefinovanou bankou kodů a nelze je používat náhodně, ale postupně
1010,1020,1030,1040 ...prvni volny v cestě je 1010..pokud bych vzal ten 1040, tak všechny před ním se deaktivují (by výrobce)
proto v tom SQL dotazu LIMIT 1
v dalším kroku nově přidělený kod insertnu do další tabulky code_used + kdo kdy,etc a nakonec tento kod z tabulky code_stack smaznu...již použitý kod se nesmí použít znovu
-
protože těch cabinetů skutečne 1000 je
Těch 1000 cabinetů přece může být v jedné jediné tabulce. Nevidím důvod k tomu, aby těch tabulek bylo 1000.
-
tabulka code_stack je zasobnikem pro vsechny cabinety
co sloupec v teto tabulce to jedna skrin
kazde prirazeni kodu se v patricnem sloupci vystreli jeden radek ...jako v revolveru :_)
-
To cele je spatne. Prijde dalsi skrin a budes menit kvuli tomu schema db? To je prece nesmysl. Mel bys to udelat jako ostatni a prostudovat si http://www.w3schools.com/sql/sql_foreignkey.asp
-
muj ucel to splnilo...
kazda nova skrin ma svuj zasobnik kodu, ktery se tak i tak musi do tabulky nasadit....takze udelam novy sloupec a nasypu do nej hodnoty..zadna veda
-
tabulka code_stack je zasobnikem pro vsechny cabinety
co sloupec v teto tabulce to jedna skrin
kazde prirazeni kodu se v patricnem sloupci vystreli jeden radek ...jako v revolveru :_)
Totéž se dá daleko elegantněji udělat v jedné tabulce. Jediným UPDATE či DELETE provedeš ověření kódu a zároveň i jeho zneplatnění, aby již nemohl být znovu použit.
-
hosi diky za kazdej lepsi typ....nejsem expert, ale rad si necham poradit pro budouci zlepseni
100 hlav 100 napadu a hold kazdej neni dokonalej
-
Tohle je klasická amatérská/začátečnická chyba, celkem pochopitelné pokud jsi nikdy neslyšel o normálních formách.
Doporučuji si o nich něco přečíst, bohužel neznám nic co by nebylo hodně teoretické - ale třeba se někdo chytne a dá pěkný odkaz.
-
Tak tedy nedestruktivní verze. Nejprve vytvořím tabulku:
CREATE TABLE cabinet(id SERIAL, customer_id INTEGER, pin VARCHAR(8), used DATETIME);
Nyní ji naplním PINy - tohle je přidání jednoho PINu:
INSERT INTO cabinet(customer_id, pin) VALUES (42, '12345678');
Prosté ověření, zda je platný PIN:
SELECT customer_id FROM cabinet WHERE customer_id=:uniq AND pin=:pin AND used IS NULL;
Při úspěchu je počet nalezených záznamů ">0"
Ověření PINu a současně jeho zneplatnění:
UPDATE cabinet SET used=NOW() WHERE customer_id=:uniq AND pin=:pin AND used IS NULL;
Úspěch poznáš podle počtu ovlivněných řádek. "0" neúspěch, ">0" úspěch. Zároveň je záznam označen časovým razítkem použití.
A to je vše. Jedna tabulka - víc nepotřebuješ. Snad jen doplnit index:
CREATE INDEX cabinet_idx ON cabinet(customer_id, pin);
Pokud bys chtěl obnovit platnost kódů, stačí jen vymazat časová razítka.
UPDATE cabinet SET used=NULL;
-
Kite moc diky za prikladovy vyklad.
ja se ale obavam ze to do jedne tabulky nepujde nacpat.
jedna zvlastni tabulka musi byt jako zasobnik preddefinovanych pinu/kodu
co sloupec to skrin, co radek to pin/kod
cabinet_1 | cabinet_2 | cabinet_3
00000001 00000022 00000112
00000021 00000012 00003455
00000661 00000312 00002344
00002346 00000002 00002222
kdyby to bylo v jedne tabulce, tak co radek to zakaznik a tim padem i kod ktery mu nenalezi
pokud ty piny dam do solo tabulky ve smyslu zasobniku, tak si jen checknu ze zakaznik ID abc ma cabinet_2
sahnu do zasobniku pro cabinet_2 z druhe tabulky a priradim mu pin co je na prvni pozici, smazu ho a zapisu ho do sloupce pin v tabulce kde je zakaznik veden
z tabulky zakazniku, krasne uvidim jeho aktualni prirazeny pin a v tabulce se zasobnikem pinů jiz tento pin nefiguruje
za mesic si zakaznik zasle pozadavek na zmenu pinu, proces se zopakuje...zjisti se ze je to zakaznik s ID abc, nalezi mu cabinet_2, sahne se do zasobniku, priradi se novy pin, updatne se v tabulce se zakaznikem a ze zasobniku smaze
-
Tak presne tohle je ta zacatecnicka chyba a chybejici teoreticke znalosti (toliko probirane v tematech jestli ma cenu titul).
Takto navrzena tabulka je proste z principu spatne.
-
Kite moc diky za prikladovy vyklad.
ja se ale obavam ze to do jedne tabulky nepujde nacpat.
jedna zvlastni tabulka musi byt jako zasobnik preddefinovanych pinu/kodu
co sloupec to skrin, co radek to pin/kod
Vidím, že jsi to stále nepochopil. Nezbývá mi, než nad tebou zlomit hůl a nechat tě svému osudu. Snad ten můj výklad pomohl někomu jinému.
-
tabulka code_stack je zasobnikem pro vsechny cabinety
co sloupec v teto tabulce to jedna skrin
kazde prirazeni kodu se v patricnem sloupci vystreli jeden radek ...jako v revolveru :_)
Sedni si do kouta a čekej až to přejde. Pak si zaplať školení na SQL databáze.
-
Kite moc diky za prikladovy vyklad.
ja se ale obavam ze to do jedne tabulky nepujde nacpat.
jedna zvlastni tabulka musi byt jako zasobnik preddefinovanych pinu/kodu
co sloupec to skrin, co radek to pin/kod
Vidím, že jsi to stále nepochopil. Nezbývá mi, než nad tebou zlomit hůl a nechat tě svému osudu. Snad ten můj výklad pomohl někomu jinému.
vážím si toho, že se snažím mi pomoci než jen plané keci jako někteří zůčastnění
ano jednu zásadní věc jsem z tvého příkladu nepochopil.....odkud se berou přidělované piny?
-
Vsetko bude fungovat skoro ako u teba, len namiesto horizontalne to bude vertikalne.
-
možná nebyla pochopena jedna zásadní věc a to, že ani zákazník ani já ty piny nedefinujeme
skříň obsahuje zámek, který má již výrobcem nadefinovanou sadu pinů, žádné jiné nejdou použít
proto tyto piny musím někam uložit a dle potřeby je automaticky přiřazovat (vždy první ze sady, ne náhodně)
způsob, kterým jsem to provedl já funguje, jen s tím rozdílem, že mám dvě tabulky, ale vážně bych rád získal pohled na věc jak to provést v rámci jedné tabulky
-
Vsetko bude fungovat skoro ako u teba, len namiesto horizontalne to bude vertikalne.
díky, to už mi dává pointu....já jsem prostě zvyklý sql tabulku dělat tak, že vertikálně mám sloupce, horizontálně záznamy
-
Len pre vsetko robit stlpce alebo nove trabulky nie je rozumne.
-
Kazdopadne pokud mas dale v praxi podobne veci resit tak popros zamestnavatele at ti skutecne zaplati nejake skoleni kde dostanes tuhle teorii a zakladni ukazky. Protoze tohle je presne ukazaka samouk (= spatne) vs nekdo kdo si nastudoval teorii (a je jedno jestli ve skole nebo od sveho zkusenejsiho kolegy nebo od google "sql normalizace")
-
nerad sem dávám fejetony, ale nezbývá mi než dodat:
všechno má svůj čas...ne každý je dokonalý ze startu
hned každého peskovat ať se na to vyprdne, sedne si do kouta a nechá toho dokud nebude školenej není dobrej přístup
takto své děti vychovávat nebudu a jedno jestli dělají domácí úkol/zaměstnání a nebo stavějí draka/hobby
díky všem kteří mi tu pomohli nebo měli snahu
co se týče dalšího vzdělávání, určitě se na to podívám