From 3de11faaac8bea3861f7b4771d08046f309adb6f Mon Sep 17 00:00:00 2001 From: Fabian Schieder Date: Mon, 6 Apr 2026 21:03:01 +0200 Subject: [PATCH 01/10] Add offer management functionality and new offerAdder page --- account.php | 3 + info/DB_Design.mwb | Bin 20483 -> 20505 bytes info/MySQL_Dump_Workbench.sql | 350 ++++++++++++++++++++++++++++++++++ offerAdder.php | 121 ++++++++++++ 4 files changed, 474 insertions(+) create mode 100644 info/MySQL_Dump_Workbench.sql create mode 100644 offerAdder.php diff --git a/account.php b/account.php index eabe441..e783206 100644 --- a/account.php +++ b/account.php @@ -231,6 +231,9 @@ include 'header.php'; Produkt hinzufügen + + Angebot hinzufügen + Benutzerverwaltung diff --git a/info/DB_Design.mwb b/info/DB_Design.mwb index f598298a780de0a34f2bed5940d99ce7172b43a9..071d5e89c1ae42d137b20dee5fc4c32b6e294cff 100644 GIT binary patch delta 19880 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 delta 19769 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
    +mTAysS zjkA)vU7pmxwapWCQ=lS+rh`zNy6h=zY`kDQi=n8hJHmM8Zoto^0V(~O?^fb@gq!CnLwtxCMLeo%Ll0y&%r;nk@ z(gOqvoqfX))IT`M`w(FIFa9P}w;EqMWa-U2`ktk5X{V`ZxVFL(mj@l+Ijk!9)5*~@7+3_;k}HA;676F&gy0SU{@gryqgYI$O)^t8 zxev%l{&PTZYXSZ-u`i`@M?%5(vOMlwR1%m-@DTAxtgzs);h2PogpU20{iA~--&dgf z;z;8;@9H~DY=vS=7`$DrqB_5pWv?n#RbL8{NG`SWD5NuzZym=xJ-kz5N`Iv2NX2*( z{LYW8@9ClkVl_NgqbPY9)z6bHJCWvhAr{Pw5f8|9fZYI&)81Mh$CUH++pNdG%E4~7 z@dSS*GHW>(*)UgHX2jh4$?deZI1m_Efo5|4b|W|UES$|pS=;#JJ0~}%wxiM|p%&50$eK`2?CI*V1Oqe4f6#Y5POI8q zMU#6{5fi-?Q%x~M%_vI$eIF2G>$vNzf2$*YEaBZH;|gP7@;UHCv5X&i&i8-+;;rrTO!rx{>zv&u1keInmb0jN-iH3%_A>qe^rXYsNin3yPj3ZmKvW|rZ z@!K4_`*+B{(bT?QELr_|O3S2A0lVpe0w$V4IJSh1OIJj$$U<$?|GMFw0<}y3WT@gS)dH;v?5<*CQhOmRFbX^G1uCZ{LkHkQ+;a`6k8J{J3$D*|dON#MUF(vt zRMpYs#2CY2>LV3js*Kqc0(&Fm3sStmGiPvc23&Xs~T(ryy%fLa5_n;-lnj0 z``C*+B5kZ)GMaUSC3?k^_==xZYR!d9H zSk&v3(~3kY0155YJMC);?TkopbQ6-SwA3^-=F5v(3>0HgQe$ehzL(@)Mgri>rE>01 zuS8F>#m-n#XUW#m_XVs-Ig-}35RlW(Dm!afPAKF!n43u-6i#w_)c#)S9*%(8ot#1` ziGx7TB2jrjMFg>Di*d^MUe6(oZGKFOHhG_aoQZ%{1-;$xzTX=%vun7N?UemVm603H zh>cf)y7w7{m^mO;ny8LF%@e?@=Fg}X-(TaKN2+Fe4|IZp-sT!ZxaCdN%L-Vo^JNWk zdJ~kf;uebLq!BfI!kTp0llAr+_xUVRe0TlFl{F76AqYa znaDi5r@tQ=n|zW>?4*m9{IG5?Y-oQDB2aEISc7*TaA{-c7lq3#s00qzg;Brov{< zB?ZFO_td!(N@#In8R!TE8o<|`5z9Y`gU4>JB(MZ&q^0UmEItnBM0~4<(6Tr22?ppl zW0yMa*(zoZ>OMx_FDVu4 zZ1;B8apfEF3^U5k{yq7h!fH`yJe{sFrkctO>0maX0gKpo!{iZ?D1_`Rakvn}`=CW_ zu%ONv0oLeZ*QtT~B(w>LxR9k4BTf|9(?i|>Msg=|ig808%v{S%HSs}E+60L(YHpx3 zI=Lc`_+Vh+o~a9G9+RXM)@{5;Y}g2cVw90<^h?0{x;haH%JcZ@oe{xVq7I9&KvMxK zRSwJD1`J?h`6hob=zv`1oc`CsO`|Pb!lh#s(&Cl;|HtLax2&Dz*4K~x!g`+BQoRH`{l7LACm zna$)t2PVh$kAPC0fLU=I6plj8=f?4PZjmtUBdX@eAr?5u@9;wa(?J#sVr&u$i;a?Q zcH4&WdT0s%SXHTagQLGKsAh>om~Vyn!^PA$)rbhNz^4(v?NBBkTIdC8&Kvl@DTr-? z3qT)6!y;LPl^&=yl#$4c6v{04lZ84;qyT%EAbcNpg!n}tq3F1i^xp`?f5QU8MLhon z4lFVvIa1_M_a|8k#e~Br-hf}TCTmH6*axg%(x^dB8~~XJNgRW%ny*6bkLJ)#B2ryT zSd;6ySzBPozV=5jM#F~==vG&f2^~g*I1ex_LUs?V-Xksa*1MV=fL8(=bY~2vIq+8& z=%D{63(~HfloMnknb(O-O71tTT{cC|?a=;~phIFV&zjqfTiuBH=P2-7plTvUy^?Dz z3IFzQ2%n+AK;t4w1_?(9cc1|Ld%^y+FMNvm@avCl`VX3}HiiTyf@x(2D=!2kTeBem z0~*F1B(?R4F#lJywl2wT#&skF;KGU?5{euynEN~PzN>QS`k3qgSoa4lo+hyqqwvgD z$I-CdYyD1acCyT^T7ZJA7!DJoLdIN&90M!@UW{y1`si~-_>d5K{w{@1k4Wz1)0Y=? z1Bp~%xW*#noee$V6u}9EG*Jgp0%AboQkaogDxpC|i4BXz5@>P`{P_QNjvNTDs7}}8 z;Pbyo>iwbxepJ9aY>$?`z>`;cq&VG*IG>78pA?8kfr&mWhGFLd5JX%8h-vPUoX5*6 zBlm4+^UA)tFK}lQDk+ZDQ-()R=|C?WdcVBG#8U$W`or+-m;{t$U3(qQ--POQz)OAr zLY#^lyTrv?oS1WkkBkSLWd_I1)ynvlC46WcM<0koop2Or=9SkSk&r^#5b!NPOOmt9 zvwq~ZI#D~Wf_pV1kd#clMS+6I9p#cpvBJn-^*YNv*R3bD2|v_(8Ky^zF0S*cciQ;H z#aHyydnJJXuoqbxyK3j}Ol={|X}t6^=J7YZ@$I_W?>=i|9xVx4oLP*Y%Ru?j{C)zM zSfSm6LSCh}4c)G}sLrPAMb5?Y`*s4(I$*zJ-m05&1- zV=l*?o#z$J-%%>((#i-ircfayCE~=KU`oS4H97P|+1>qm-Pfv_FLiJtw^RM?hkXa4 z?Y?33cFIbmpNrY|S4*BRMe=7_O&{06`E5H@iLQyc?J4N_Om9bsL7krkZ_=K6CP%k~ zFKOuS`Ap!BI#(VgPnvX(_Xp>LN8&qe{%h^7?1Jpu+Ppo?Nv>uWKP05g-nnx#bhyfZ zv_rW|NDhtP>}Q1H-MG>uAAd}g;Hjnm$(ZKz?wO_c!zP*@&F^k(&6vixv~G-NLKd3s z(z{9D&fw)K2ym|Bd%eh%s7hCaXWwkfALcwXOxPkJ=0pX z-t*POm-Bt$;n`~LH%){xNhQLlB|Iq`Xj&tTB%PJ1vgG6zuSp%us(g3U!P?Ri@V=d{ zbIFLd9M{6iaHAs$6hp?U7!@Lq9Y$kmAA$}zKE%PU#18A?BT6a6zpRS-QnLT1?Dz6> zqnXG*BZsipP;nrC4I9KkDBy2ze)+`ttNG^_+}p+JR+1%Ne;l4>`t3-`UQHZmOi@`6 zR&JrZ5!hf%IlJDsCxhD&Lc-VxAir*NuQo%!0QSt77L~dd-i6Vh=kxw=n%Zx{jn!K} zxb}A!Z@+y-Cq8V_>l8Z=P5yFTYsl|Rg}h{_*e{e z|BIoQ5DA9s0qp~RC~>|Qe1D?p0EWc#)T9z7jz&_1;YU6?;&P0b(~fFouc~0>EU~sv zn;uM?D>dM%$DP&|DihvN->?Faq7!^Hbe`q=90!mdV9x{e1^A9(0e5?&ZX9&~_%!nG zP2N5;+?`a8G zcK1!XVBPxkhK2f~11MF%oo&cSd3soWC^QiJGII=Vn#UCkLIJd=o>EuP9}(LECrNLZ&9QG$q>D&B`g5ljFwO z((TP)Z+y`srbpK$Y|q;CZN@DT&+k!&uT^V%-t<#StGhr<4X7npAr@S|^q9;@)H?lh z@cgNuT4OP{vO4o}-Z-}tY39pJP~dj58>36hr`XN@=7rG?5BJKxH`mRks#)rj^=4Yl z|I%fxwRe{A#hhONkBRrO4{PaWT>fqJHOj(+vtx;gD))N1o=qz|$)NT1d~(YmkCD6s?5Ow1k{it|X`Unc?~YTS^!! zY3lpr#w%!$ZQz{n^;L7c=b{?)XGrlPag>1I=!Ulp2l!>i`|+;Pyvjv&y4x?a`gUTk z|1#qH`P?m9`*=)C=*i>wgy+bk+U2j;4)j@-D3{4L z(vdBfcY;V!LWQV)lO1NQIIyF{#!!8CEAqz?PFD2zdzow@)%|_n{@u%;KbP^Q>3g2?LZS#K{RkicxHCQnuuWR|&9;Svi-NzS~VOCvz&s;2HW*tpn9?rSNHBc{rKZi zds|=m?y+`Dm`@a%_T$gDq7k&1KibohCay+&5qx7#hnLwxo{l?5Lr!L|B#~7GQ_XgU!sW&- zU{v6sW^iv5G+opinER*EdMQA`4t-(-5(EKi1eSb-7y3X_nt*xU!0$OhjLy+Te&UpYzSR104ptu+eq)i63-9Sf>a2HS!&Mfnh zx@Q_0Rt&)e#^j8|nA-BVmwuU!N=l?-lT=Cps z3T_7up4T}u9F3YO8B+KaMxuaTn3$#$ktdvqg{X)PPUGSreZ;xgf{5Lfp%5P>AxtO-FY@cV zz@J2(?gQwQdCb96l$>G6ljig;;W&oC_&XKhH!AscE7v9ap=KQkpU^R^4bN|pyMX-Pn94l#-L*raa!>^MOSb^ z;&ru$YoIzdL~*LIy5%lbJv|A9kzVX-dXncLWqOb)Ipm~3(1L%kinI)MAv&`S9La)V z&{Rw+gRQA?*eWtxv_rtc)2k={4{n&kGm>OmAv_u};W@F_-x%{hn$<(o0SP>b50}AU zW2Usi(i~G8XnFUv)?4#r5l(eI$#p_lKvPa0`ff{px`lZ+?GWq`>?Z*B|Jucl|7ctf zK7=E$f~e@|;@O|56GI7rAvDD_UZp~uIv#zR&L;IN4uc^?poi4!u{!2|vg|xf2q<&3p~(=7o~)m5FdS$3W}d4GHp8elHn+QV2+^r4uq? zHu79`{8Vv91&b^b86u@537x1=6f@@b{D97wL_JTCqbe_fRX_^FK*&Tp>$Bi`Te%A7 z)5YYtjA|(sj*x_q^k9%A3DwR~310fb!l?G(sLDXC&74@D6zeEyn~R$#bOcZ6dW}el zD5{*cptWIDONfInSWtU^m;|OMEo>ztB5fOyA}O<>C0MQk2v>FeL{>mEPm#u8lgnGq zoN6Z+@ z5RMRz9tw^!H8DG`A@Z8hopT0Hxd+ayB);I0O&tYC(%w9%!?L1&qY>sZ^Z<=y(6K;J z0zyLo5oB2n+GtRJ$`i#)uxjkKa=Yi_`5bSJ5R4x7q^>v@!mF5KHkAS!Sz@DLL2;6( zbe8*wl|_#MeWHp{NghBs&+7GI1S5z5muO6dgKMH4qR$=Zv#Lk=Ex+JsJU^UGR=JrK z{mnya+u!_$RdBrgp`*U$Z%1X)znZ_o(|AfE+*$klf!Wv3uOw(12a^zh?G>+@`MemOdQGx_iO&Ni6l#q{FIGsV{b;^)cH;zNB{ z(f0KW3X4YHG}s;>Ci>NhHxgk-C%y|OE|^osZ~~Hl#@Z!{IxsRh$ca1ds4PLNf2>a2 z+M)SyuGx-!IN8jH3%0QfXX;V8@Pk=d&%1HojT$M@}#Tb=_YpHmCw1nK!fjM)@&9HnqRSNldGhhBgrS(qScq1`RbmO~l zfl}t$LCA#pz9I1%G zd2os4KFvJ%wPfdRE;XAp^gsu`3kPn0k|tDS3p&(GO-2b=Z>m2hR#2Cj3z%m(nADV^ zU1{nTX@*QbF8^IM#dhMo8?~oJ@4cH!O<$nXC1AWpMpa&@)@4DGCeTcxNtxqmIHrkj z?MlH9VsD{@tTxxrG+ z;n45FRrzdQsVN_q`>y(l`K!|WZfJNDDNl6cyKv(y>#C)94313U3hREgo&Q$Ld3PJZakLos4QQ@iS#@% zC!#|lJ{Te{%&;V{q}lu&T&PEX=fdAytD5h`i#O6#MlZgTY!q(2D5M({b+Nn}XTew! zK@wwCkb!3*u|jh=$KgZEMlqWgXd3(Iy!gCZHT2t<3peDcm20Y@XQJAwq5rZ|=1>0I zRLK2mf>L_@+w~h=bNIpYZ^JKM`|C@aE~Vjr9Y?dp^?UvEr==yOQzkfn0?H=|f++`< zl$BP8VS-U1rQ6fDHv;18DZL7$nmCTzM0cv8F)( zs<#>wc@T;ITUW%hW|I4BbaHssO#gW;i;W~n*Rt41A8##-T{ljD)=V&D&8Kcq!M@&8 zH>syw%VMLdp0zA?-A4F-S+lIiwJbKu#97N?*WD_+?>N?d7nxRVan^U-k+pT)f16D& zFRuOeN&WjTDBg|=-ABa9`VZ}BmlSG#dGO*^7IhCHCu=_LS2AwzluOwa7vGeLZ`6=z zZN41azU;qW|0h>(dwhD`K5rFg{yqtp7e}MT*sqTLHhtxHeeaKdb$`*9b-(c6)9G0m z*wb6DXny(V*AMP|^H#AP<@Z+Q1^_xS;^0pXm{^k7e)ogk^IUP4MR33n}dOtsG%*E&= zd=sqxA#%7sqPt;h8N!i*!7^xCuUQHuECC%@9xLba$s5MJxhpB{h^QlTNRFSZ7f}1l z`Q&^&pa1sy@^pOrM!avO{X8En1L4Md__lp#atoh3UW}f9z8#%>f3557xZ5!9@NzaQ zzv%0S8-m@69TEI(JL2$izL=iH(PGqWKWN(;t9~ENK7L~+XUiX&?rNVKp3JNb+Z(T4 zN0PBxg%XDHvUW}F+Nl@^Qo>Xfys_e!UY$Su@*jV=^U z#^P5iza*b;c9wPbw=QPWs{rg}d6BLt6 ze*0S2M~7Nlt-rpJo3?MA#+w~@N3)a3xt}f;OJXXX{&MrY`kOD7!K8Z1c{^ifbV~w8u%l`*ZO9KQH000000Q#tYT$k;V z0t5g600aO400aO40Bmn#Yce-CGEhqc1QY-V0ssgA`lx=hrA>ta4$iB7To5k{3NB3m z0GTzDI8QJL`lx
    '; + echo '

    Zugriff verweigert

    '; + echo '

    Du hast keine Berechtigung, Angebote hinzuzufügen.

    '; + echo '
    '; + include 'footer.php'; + exit; +} + +$db = db_get_connection(); +$message = ''; +$messageType = ''; + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'add_offer') { + $productID = (int)$_POST['product_id']; + $shopID = (int)$_POST['shop_id']; + $price = (float)$_POST['price']; + $shippingCost = isset($_POST['shipping_cost']) && $_POST['shipping_cost'] !== '' ? (float)$_POST['shipping_cost'] : 0.00; + $inStock = isset($_POST['in_stock']) ? 1 : 0; + $offerURL = trim($_POST['offer_url']); + + if ($productID > 0 && $shopID > 0 && $price >= 0) { + $stmt = $db->prepare("INSERT INTO offers (productID, shopID, price, shippingCost, inStock, offerURL) VALUES (?, ?, ?, ?, ?, ?)"); + if ($stmt->execute([$productID, $shopID, $price, $shippingCost, $inStock, $offerURL])) { + $message = 'Angebot erfolgreich hinzugefügt!'; + $messageType = 'success'; + } else { + $message = 'Fehler beim Hinzufügen des Angebots.'; + $messageType = 'error'; + } + } else { + $message = 'Bitte alle Pflichtfelder korrekt ausfüllen.'; + $messageType = 'error'; + } +} + +// Get all products for dropdown +$productsStmt = $db->query("SELECT productID, model FROM products ORDER BY model ASC"); +$products = $productsStmt->fetchAll(PDO::FETCH_ASSOC); + +// Get all shops for dropdown +$shopsStmt = $db->query("SELECT shopID, name FROM shops ORDER BY name ASC"); +$shops = $shopsStmt->fetchAll(PDO::FETCH_ASSOC); + +include 'header.php'; +?> +
    +
    +

    Angebot hinzufügen

    + + +
    + +
    + + +
    + + +
    + + +
    + +
    + + +
    + +
    +
    + + +
    + +
    + + +
    +
    + +
    + + +
    + +
    + + +
    + + +
    +
    +
    + From fe4aee5c25727a57ad774c49572ec120455f9f1b Mon Sep 17 00:00:00 2001 From: Fabian Schieder Date: Mon, 6 Apr 2026 21:04:46 +0200 Subject: [PATCH 02/10] Refactor offerAdder to use mysqli for database connections and queries --- offerAdder.php | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/offerAdder.php b/offerAdder.php index 62838ad..d5be3a1 100644 --- a/offerAdder.php +++ b/offerAdder.php @@ -18,7 +18,7 @@ if (empty($_SESSION['user_id']) || empty($_SESSION['user_roles']) || !in_array(' exit; } -$db = db_get_connection(); +$conn = db_connect(); $message = ''; $messageType = ''; @@ -31,14 +31,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' $offerURL = trim($_POST['offer_url']); if ($productID > 0 && $shopID > 0 && $price >= 0) { - $stmt = $db->prepare("INSERT INTO offers (productID, shopID, price, shippingCost, inStock, offerURL) VALUES (?, ?, ?, ?, ?, ?)"); - if ($stmt->execute([$productID, $shopID, $price, $shippingCost, $inStock, $offerURL])) { + $stmt = $conn->prepare("INSERT INTO offers (productID, shopID, price, shippingCost, inStock, offerURL) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->bind_param("iiddiss", $productID, $shopID, $price, $shippingCost, $inStock, $offerURL); + if ($stmt->execute()) { $message = 'Angebot erfolgreich hinzugefügt!'; $messageType = 'success'; } else { $message = 'Fehler beim Hinzufügen des Angebots.'; $messageType = 'error'; } + $stmt->close(); } else { $message = 'Bitte alle Pflichtfelder korrekt ausfüllen.'; $messageType = 'error'; @@ -46,12 +48,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' } // Get all products for dropdown -$productsStmt = $db->query("SELECT productID, model FROM products ORDER BY model ASC"); -$products = $productsStmt->fetchAll(PDO::FETCH_ASSOC); +$productsResult = $conn->query("SELECT productID, model FROM products ORDER BY model ASC"); +$products = []; +if ($productsResult) { + while ($row = $productsResult->fetch_assoc()) { + $products[] = $row; + } +} // Get all shops for dropdown -$shopsStmt = $db->query("SELECT shopID, name FROM shops ORDER BY name ASC"); -$shops = $shopsStmt->fetchAll(PDO::FETCH_ASSOC); +$shopsResult = $conn->query("SELECT shopID, name FROM shops ORDER BY name ASC"); +$shops = []; +if ($shopsResult) { + while ($row = $shopsResult->fetch_assoc()) { + $shops[] = $row; + } +} include 'header.php'; ?> From d4c58547d08a1ee026b0fa0977c404a7617ce3b2 Mon Sep 17 00:00:00 2001 From: Fabian Schieder Date: Mon, 6 Apr 2026 21:06:10 +0200 Subject: [PATCH 03/10] Fix parameter binding in offerAdder for database insertion --- offerAdder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/offerAdder.php b/offerAdder.php index d5be3a1..805e9e1 100644 --- a/offerAdder.php +++ b/offerAdder.php @@ -32,7 +32,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' if ($productID > 0 && $shopID > 0 && $price >= 0) { $stmt = $conn->prepare("INSERT INTO offers (productID, shopID, price, shippingCost, inStock, offerURL) VALUES (?, ?, ?, ?, ?, ?)"); - $stmt->bind_param("iiddiss", $productID, $shopID, $price, $shippingCost, $inStock, $offerURL); + $stmt->bind_param("iiddis", $productID, $shopID, $price, $shippingCost, $inStock, $offerURL); if ($stmt->execute()) { $message = 'Angebot erfolgreich hinzugefügt!'; $messageType = 'success'; From b907ce3d818617114491054f53341c97e70dfe55 Mon Sep 17 00:00:00 2001 From: Fabian Schieder Date: Mon, 6 Apr 2026 21:08:03 +0200 Subject: [PATCH 04/10] Refactor offerAdder layout for improved UI and accessibility --- offerAdder.php | 123 +++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 59 deletions(-) diff --git a/offerAdder.php b/offerAdder.php index 805e9e1..c961c74 100644 --- a/offerAdder.php +++ b/offerAdder.php @@ -67,67 +67,72 @@ if ($shopsResult) { include 'header.php'; ?> -
    -
    -

    Angebot hinzufügen

    - - -
    - -
    - +
    +
    +
    +
    +

    Angebot hinzufügen

    +
    -
    - - -
    - - -
    - -
    - - -
    - -
    -
    - - + +

    + +

    + + + + + +
    + +
    - -
    - - + +
    + +
    -
    - -
    - - -
    - -
    - - -
    - - - -
    + +
    +
    + + +
    +
    + + +
    +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + +
    +
    From b967e060c80c43acebba50232ceb0b66582be6d3 Mon Sep 17 00:00:00 2001 From: Fabian Schieder Date: Mon, 6 Apr 2026 21:10:05 +0200 Subject: [PATCH 05/10] Add offer deletion functionality and display existing offers in offerAdder --- offerAdder.php | 112 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 94 insertions(+), 18 deletions(-) diff --git a/offerAdder.php b/offerAdder.php index c961c74..5e6d002 100644 --- a/offerAdder.php +++ b/offerAdder.php @@ -22,28 +22,44 @@ $conn = db_connect(); $message = ''; $messageType = ''; -if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'add_offer') { - $productID = (int)$_POST['product_id']; - $shopID = (int)$_POST['shop_id']; - $price = (float)$_POST['price']; - $shippingCost = isset($_POST['shipping_cost']) && $_POST['shipping_cost'] !== '' ? (float)$_POST['shipping_cost'] : 0.00; - $inStock = isset($_POST['in_stock']) ? 1 : 0; - $offerURL = trim($_POST['offer_url']); +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { + if ($_POST['action'] === 'add_offer') { + $productID = (int)$_POST['product_id']; + $shopID = (int)$_POST['shop_id']; + $price = (float)$_POST['price']; + $shippingCost = isset($_POST['shipping_cost']) && $_POST['shipping_cost'] !== '' ? (float)$_POST['shipping_cost'] : 0.00; + $inStock = isset($_POST['in_stock']) ? 1 : 0; + $offerURL = trim($_POST['offer_url']); - if ($productID > 0 && $shopID > 0 && $price >= 0) { - $stmt = $conn->prepare("INSERT INTO offers (productID, shopID, price, shippingCost, inStock, offerURL) VALUES (?, ?, ?, ?, ?, ?)"); - $stmt->bind_param("iiddis", $productID, $shopID, $price, $shippingCost, $inStock, $offerURL); - if ($stmt->execute()) { - $message = 'Angebot erfolgreich hinzugefügt!'; - $messageType = 'success'; + if ($productID > 0 && $shopID > 0 && $price >= 0) { + $stmt = $conn->prepare("INSERT INTO offers (productID, shopID, price, shippingCost, inStock, offerURL) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->bind_param("iiddis", $productID, $shopID, $price, $shippingCost, $inStock, $offerURL); + if ($stmt->execute()) { + $message = 'Angebot erfolgreich hinzugefügt!'; + $messageType = 'success'; + } else { + $message = 'Fehler beim Hinzufügen des Angebots.'; + $messageType = 'error'; + } + $stmt->close(); } else { - $message = 'Fehler beim Hinzufügen des Angebots.'; + $message = 'Bitte alle Pflichtfelder korrekt ausfüllen.'; $messageType = 'error'; } - $stmt->close(); - } else { - $message = 'Bitte alle Pflichtfelder korrekt ausfüllen.'; - $messageType = 'error'; + } elseif ($_POST['action'] === 'delete_offer') { + $offerID = (int)$_POST['offer_id']; + if ($offerID > 0) { + $stmt = $conn->prepare("DELETE FROM offers WHERE offerID = ?"); + $stmt->bind_param("i", $offerID); + if ($stmt->execute()) { + $message = 'Angebot erfolgreich gelöscht!'; + $messageType = 'success'; + } else { + $message = 'Fehler beim Löschen des Angebots.'; + $messageType = 'error'; + } + $stmt->close(); + } } } @@ -65,6 +81,21 @@ if ($shopsResult) { } } +// Get existing offers to manage +$offersResult = $conn->query(" + SELECT o.offerID, p.model AS productName, s.name AS shopName, o.price + FROM offers o + JOIN products p ON o.productID = p.productID + JOIN shops s ON o.shopID = s.shopID + ORDER BY o.offerID DESC +"); +$existingOffers = []; +if ($offersResult) { + while ($row = $offersResult->fetch_assoc()) { + $existingOffers[] = $row; + } +} + include 'header.php'; ?>
    @@ -133,6 +164,51 @@ include 'header.php';
    + +
    +
    +

    Bestehende Angebote verwalten

    +
    + + 0): ?> +
    + + + + + + + + + + + + + + + + + + + +
    ProduktShopPreisAktion
    +
    + + + +
    +
    +
    + +

    Keine Angebote vorhanden.

    + +
    + From b3410a378f10b4be41bbbef7795bb0a955dca158 Mon Sep 17 00:00:00 2001 From: Fabian Schieder Date: Mon, 6 Apr 2026 21:13:30 +0200 Subject: [PATCH 06/10] Add shop management functionality with shopAdder page --- account.php | 3 + offerAdder.php | 36 ++++++- shopAdder.php | 248 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+), 5 deletions(-) create mode 100644 shopAdder.php diff --git a/account.php b/account.php index e783206..7310020 100644 --- a/account.php +++ b/account.php @@ -234,6 +234,9 @@ include 'header.php'; + diff --git a/offerAdder.php b/offerAdder.php index 5e6d002..092cd7f 100644 --- a/offerAdder.php +++ b/offerAdder.php @@ -81,14 +81,23 @@ if ($shopsResult) { } } -// Get existing offers to manage -$offersResult = $conn->query(" +$filterProductID = isset($_GET['filter_product_id']) ? (int)$_GET['filter_product_id'] : 0; + +$offersQuery = " SELECT o.offerID, p.model AS productName, s.name AS shopName, o.price FROM offers o JOIN products p ON o.productID = p.productID JOIN shops s ON o.shopID = s.shopID - ORDER BY o.offerID DESC -"); +"; + +if ($filterProductID > 0) { + $offersQuery .= " WHERE o.productID = " . $filterProductID; +} + +$offersQuery .= " ORDER BY o.offerID DESC"; + +// Get existing offers to manage +$offersResult = $conn->query($offersQuery); $existingOffers = []; if ($offersResult) { while ($row = $offersResult->fetch_assoc()) { @@ -170,6 +179,23 @@ include 'header.php';

    Bestehende Angebote verwalten

    +
    +
    + + +
    + 0): ?> + Filter zurücksetzen + +
    + 0): ?>
    @@ -188,7 +214,7 @@ include 'header.php';
    -
    + + +
    + + +
    +
    +

    Bestehende Shops verwalten

    +
    + + 0): ?> +
    + + + + + + + + + + + + + + + + + + + + + +
    LogoNameWebsiteAngeboteAktion
    + + Logo + + Kein Logo + + + + Link ↗ + + + + + + + 0): ?> + + +
    + + + +
    + +
    +
    + +

    Keine Shops vorhanden.

    + +
    + + + From 21fdb8bf6c74f214cd86a7c3f2ca7d73d2b8cf1e Mon Sep 17 00:00:00 2001 From: Fabian Schieder Date: Mon, 6 Apr 2026 21:27:54 +0200 Subject: [PATCH 07/10] Update management terminology in account, productAdder, offerAdder, and shopAdder pages --- account.php | 6 ++-- offerAdder.php | 2 +- productAdder.php | 71 +++++++++++++++++++++++++++++++++++++++++++++++- shopAdder.php | 2 +- 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/account.php b/account.php index 7310020..5eab9cf 100644 --- a/account.php +++ b/account.php @@ -229,13 +229,13 @@ include 'header.php'; if (!empty($_SESSION['user_roles']) && in_array('ADMIN', $_SESSION['user_roles'], true)): ?>