Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ZAJDAN 23. 09. 2015, 13:34:02

Název: PHP - SQL pomocí PDO
Přispěvatel: 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
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Vladimír Drgoňa 23. 09. 2015, 14:17:44
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:
Kód: [Vybrat]
$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" );
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 15:22:18
Druhý riadok je určite syntakticky nesprávne, PHP už roky nepoužívam, ale tuším to ide minimálne dvoma spôsobmi:
Kód: [Vybrat]
$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
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Kit 23. 09. 2015, 15:55:03
Ahoj,
lze v syntaxi PHP- PDO používat operátory tímto způsobem?
Kód: [Vybrat]
$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?
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 15:55:38
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:
Kód: [Vybrat]
$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 :)
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Kit 23. 09. 2015, 16:32:16
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í.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 17:41:08
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.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: pepa 23. 09. 2015, 17:43:59
ano mysql neni totiz mssql a jeste takova vec krom limit umi i offset ten mssql uz teda taky ale neni tomu tak dlouho
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Kit 23. 09. 2015, 17:58:02
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?
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 18:23:12
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
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Kit 23. 09. 2015, 18:55:04
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.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 18:57:54
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 :_)
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Rejpal 23. 09. 2015, 19:00:02
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
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 19:09:58
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
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Kit 23. 09. 2015, 19:12:29
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.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 19:18:09
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
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: podlesh 23. 09. 2015, 20:06:34
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.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Kit 23. 09. 2015, 20:43:24
Tak tedy nedestruktivní verze. Nejprve vytvořím tabulku:
Kód: [Vybrat]
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:
Kód: [Vybrat]
INSERT INTO cabinet(customer_id, pin) VALUES (42, '12345678');
Prosté ověření, zda je platný PIN:
Kód: [Vybrat]
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í:
Kód: [Vybrat]
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:
Kód: [Vybrat]
CREATE INDEX cabinet_idx ON cabinet(customer_id, pin);
Pokud bys chtěl obnovit platnost kódů, stačí jen vymazat časová razítka.
Kód: [Vybrat]
UPDATE cabinet SET used=NULL;
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 23. 09. 2015, 22:36:28
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
Název: Re:PHP - SQL pomocí PDO
Přispěvatel: to_je_jedno 24. 09. 2015, 05:51:14
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.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: Kit 24. 09. 2015, 08:14:35
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.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: k 24. 09. 2015, 08:27:13
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.
Název: Re:PHP -SQL pomocí PDO
Přispěvatel: ZAJDAN 24. 09. 2015, 09:23:22
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?
Název: Re:PHP - SQL pomocí PDO
Přispěvatel: NooN 24. 09. 2015, 09:47:07
Vsetko bude fungovat skoro ako u teba, len namiesto horizontalne to bude vertikalne.
Název: Re:PHP - SQL pomocí PDO
Přispěvatel: ZAJDAN 24. 09. 2015, 09:48:47
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
Název: Re:PHP - SQL pomocí PDO
Přispěvatel: ZAJDAN 24. 09. 2015, 09:53:30
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
Název: Re:PHP - SQL pomocí PDO
Přispěvatel: NooN 24. 09. 2015, 09:57:12
Len pre vsetko robit stlpce alebo nove trabulky nie je rozumne.
Název: Re:PHP - SQL pomocí PDO
Přispěvatel: to_je_jedno 24. 09. 2015, 11:13:10
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")
Název: Re:PHP - SQL pomocí PDO
Přispěvatel: ZAJDAN 24. 09. 2015, 11:36:20
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