Autor | Zpráva | ||
---|---|---|---|
TomasRe Profil |
#1 · Zasláno: 11. 1. 2015, 20:41:18
Dobrý den,
můžete prosím někdo poradit, kde mám chybu. S databázemi jsem úplný začátečník. Mám kód: $vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id"); while ($zaznam = mysql_fetch_array($vysledek)): echo "<form action=\"\">"; echo "prezdivka: <input name=\"nova_prezdivka\" value=\"".$zaznam["prezdivka"]."\"> <a href=\"".$zmena."\">změnit</a> <a href=\"".$smazat."\">smazat</a><br>"; echo "email: <input name=\"email\" value=\"".$zaznam["email"]."\"><br>"; echo "</form><br>"; endwhile; $zmena=mysql_query("UPDATE `uzivatele` SET `prezdivka` = $nova_prezdivka WHERE id = ".(int) $_GET['id'], $spojeni); $smazat=mysql_query("DELETE FROM `uzivatele` WHERE id = ".(int) $_GET['id'], $spojeni); Tlačítko změnit by mělo změnit pouze přezdívku, ale tlačítko smazat by mělo smazat celý řádek z tabulky databáze (celého uživatele). Děkuju moc.. |
||
lionel messi Profil |
TomasRe:
1. Nepoužívaj pri spracovaní dát z formulára $nova_prezdivka , ale $_GET['novaprezdivka'] (register_globals je predvolene vypnuté a zapínať túto direktívu nie je dobrý nápad z hľadiska bezpečnosti).
2. Uvedenú premennú vkladáš do dotazu bez ošetrenia voči SQL Injection, čo ak si niekto vyberie prezývku McDonald's, prípadne ešte horšie ' OR 1=1 ?
3. Správne by úprava prezývky mala byť takto: $zmena=mysql_query("UPDATE `uzivatele` SET `prezdivka` = '". mysql_real_escape_string($_GET['nova_prezdivka']) ."' WHERE id = ".(int) $_GET['id'], $spojeni); |
||
TomasRe Profil |
#3 · Zasláno: 11. 1. 2015, 21:09:35
lionel messi:
Bohužel to hlásí stále stejnou chybu: Warning: mysql_query() expects parameter 2 to be resource, null given in /data/web/virtuals/89668/virtual/www/pages/test.php on line 19 |
||
lionel messi Profil |
#4 · Zasláno: 11. 1. 2015, 21:19:20
TomasRe:
„on line 19“ V kóde [#1] riadok 19 ani nemáš. Skús si v dotazoch vypísať chyby: $zmena=mysql_query("UPDATE `uzivatele` SET `prezdivka` = $nova_prezdivka WHERE id = ".(int) $_GET['id'], $spojeni) or die(mysql_error()); (obdobne o riadok nižšie v druhom dotaze) a daj vedieť, čo to vypísalo. |
||
TomasRe Profil |
#5 · Zasláno: 11. 1. 2015, 21:28:21
lionel messi:
Vypisuje to tu chybu, kterou jsem psal - Warning: mysql_query() expects parameter 2..... Při vložení mysql_error to vypíše Query was empty |
||
mimochodec Profil |
#6 · Zasláno: 11. 1. 2015, 21:30:16
lionel messi:
„SET `prezdivka` = $nova_prezdivka“ Nechybí tam apostrofy? |
||
TomasRe Profil |
#7 · Zasláno: 11. 1. 2015, 21:34:19
mimochodec:
To je beze změny :-( |
||
lionel messi Profil |
mimochodec:
> lionel messi: > „SET `prezdivka` = $nova_prezdivka“ > > Nechybí tam apostrofy? Chýbajú, upozorňoval som na to už v [#2]. |
||
TomasRe Profil |
#9 · Zasláno: 11. 1. 2015, 22:19:29
lionel messi:
To bohužel stále vůbec neřeší chybu - stále beze změny. |
||
mimochodec Profil |
#10 · Zasláno: 11. 1. 2015, 22:20:58
TomasRe:
Slož si ten dotaz do nějaké proměnné, tzn. $q= "UPDATE .... a pak si ho vypiš echem, ať vidíš, co do té databáze posíláš. Co ti to vypíše, ukaž tady.
|
||
TomasRe Profil |
#11 · Zasláno: 11. 1. 2015, 22:34:52
mimochodec:
Nevypíše bohužel vůbec nic. Ještě mě napadlo - co by mělo být v proměnné $spojeni? |
||
mimochodec Profil |
#12 · Zasláno: 11. 1. 2015, 23:02:47
TomasRe:
„Nevypíše bohužel vůbec nic.“ Tak děláš něco špatně. Po $q= "UPDATE ...." ti echo $q; ten dotaz musí vypsat.
|
||
TomasRe Profil |
#13 · Zasláno: 11. 1. 2015, 23:05:07
mimochodec:
To je dost možné. V tomhle opravdu moc neumím... psal jsem $q= "UPDATE `uzivatele` SET `prezdivka` = $nova_prezdivka WHERE id = ".(int) $_GET['id']; |
||
mimochodec Profil |
#14 · Zasláno: 11. 1. 2015, 23:13:35
TomasRe:
„To je dost možné. V tomhle opravdu moc neumím“ Takže vidím dvě věci. Jednak ti tam chybí ty apostrofy, o kterých ti tady od 20:51 meldujeme. A za druhé to, že se ti ten dotaz nevypíše, znamená, že ta část programu vůbec neproběhne. Projdi si všechny podmínky a zjisti si, co se opravdu děje a kudy program běží. Ten druhý parametr mysql_query nepoužívám, tak přesně neporadím. Každopádně někde nad tímhle musíš mít nějaké připojení k databázi. Já na začátku každého index.php includuju soubor, kde mám mj. define("SQL_HOST","xx"); define("SQL_DBNAME","xx"); define("SQL_USERNAME","xx"); define("SQL_PASSWORD","xx"); mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD); mysql_select_db(SQL_DBNAME); mysql_query("SET character_set_results=utf8"); mysql_query("SET character_set_connection=utf8"); mysql_query("SET character_set_client=utf8"); mysql_query("SET names='utf8';"); Když potom někde použiju mysql_query, žádné připojení nezadávám. |
||
TomasRe Profil |
#15 · Zasláno: 11. 1. 2015, 23:21:12
mimochodec:
Apostrofy jsem tam dal již před tím, jen jsem to teď špatně napsal... Na začátku mám vložení souboru s připojením. To proběhne v pořádku - vypíše data. Jinak tam žádné jiné podmínky nejsou. Tohle je celý kód: <? $vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id"); while ($zaznam = mysql_fetch_array($vysledek)): echo "<form action=\"\">"; echo "prezdivka: <input name=\"nova_prezdivka\" value=\"".$zaznam["prezdivka"]."\"> <a href=\"".$zmena."\">změnit</a> <a href=\"".$smazat."\">smazat</a><br>"; echo "email: <input name=\"email\" value=\"".$zaznam["email"]."\"><br>"; echo "heslo: <input name=\"heslo\" value=\"".$zaznam["heslo"]."\"><br>"; echo "</form><br>"; endwhile; $zmena=mysql_query("UPDATE `uzivatele` „SET `prezdivka` = $nova_prezdivka“ WHERE id = ".(int) $_GET['id'], $uzivatele); $smazat=mysql_query("DELETE FROM `uzivatele` WHERE id = ".(int) $_GET['id'], $spojeni); ?> |
||
Alphard Profil |
TomasRe [#3]:
Ta chyba mluví o 2. parametru, což je odkaz konkrétní připojení k databázi, který vrátí funkce mysql_connect(). Ve vašem případě bude lepší ten parametr zcela vynechat, pak se použije poslední sestavené spojení (tak jako na řádku 2). PS: kdybyste použil třeba dibi, pracovalo by se s databází líp. |
||
mimochodec Profil |
TomasRe:
Vidím, že ty uvozovky moc nezvládáš. V php ti ušetří dost práce, když budeš používat apostrof, tzn. echo "email: <input name='email' value='".$zaznam["email"]."'><br>"; V dotazu pro ten update to je dost krkolomnost. Použij toto: $q = "UPDATE uzivatele SET prezdivka = '".$nova_prezdivka."' WHERE id = ".(int)$_GET['id']; $zmena=mysql_query($q); Kromě toho doufám, že to tam máš takhle seskládáno jen pro ten účel, abys to ukázal tady. Pokud ne, uniká mi smysl toho, že chceš zároveň vypsat formulář pro editaci, zároveň data updatovat (přičemž ještě nejsou odeslána) a zároveň toho člověka mažeš. K tomu druhému kódu: samozřejmě si můžeš to $q = odpustit a ten příkaz dát rovnou do mysql_query() . Takhle to dělám právě z toho důvodu, abych si ten dotaz mohl jednoduše a rychle vypsat v případě, že něco skřípe.
|
||
TomasRe Profil |
#18 · Zasláno: 11. 1. 2015, 23:39:10
mimochodec:
upravil jsem to a už to chybu nehlásí. Upravil jsem i uvozovky na apostrofy (děkuju za radu), je to opravdu přehlednější. Ale tlačítka nereagují. Respektive se stránka zaktualizuje a zůstane beze změny. Smysl by měl být, že by to takto byla vytvořena jednoduchá administrace, kde by se měnily texty. S možností mazat, upravovat texty. |
||
mimochodec Profil |
TomasRe:
Jak zpracovat data odeslaná z formuláře: Možnosti PHP » Zpracování formulářů Důrazně doporučuji to, co tam je zmíněno jako "Modernější přístup". (otázka směrem nahoru: nemohl by někdo postrčit Yuhůa k tomu, aby tu stránku updatoval?) |
||
TomasRe Profil |
#20 · Zasláno: 11. 1. 2015, 23:54:25
mimochodec:
Tak to asi bude fungovat, ale to pak bude jedna stranka pro smazání, jedna pro úpravu a jedna pro přidání... |
||
Alphard Profil |
#21 · Zasláno: 11. 1. 2015, 23:56:55
mimochodec:
„nemohl by někdo postrčit Yuhůa k tomu, aby tu stránku updatoval?“ Jestli pravidelně čteš diskusi, víš, že takové snahy (i s nabídkou pomoci diskutujících) jsou nejen u PHP článků, ale kvůli časovému vytížení to není tak snadné. Věci týkající se PHP na původním jpw snad někdy nahradí modernější pehapko, konkrétně formuláře na Základní kurz 12: Předání dat na server. Máš-li návrhy k obsahu pehapka, vyjádři se v patřičných sekcích, nebo něco napiš :-), tam je změna mnohem jednodušší, spravuje to Joker a přístup ke článkům mám třeba i já. [#17]: Tady se jaksi vypařilo escapování $nova_prezdivka .
TomasRe: „ale to pak bude jedna stranka pro smazání, jedna pro úpravu a jedna pro přidání...“ Ano. Samozřejmě může být víc akcí v jednom souboru, ale je třeba podmínkou odlišit, jaká se má zrovna provést. |
||
mimochodec Profil |
#22 · Zasláno: 12. 1. 2015, 00:00:51
Alphard:
„Tady se jaksi vypařilo escapování $nova_prezdivka.“ Pořád jsem se jaksi zdráhal přijmout to, že escapování není někde nad tím kódem, stejně jako načtení hodnoty z GETu. Ale vypadá to tak. Za konkrétní odkaz pehapko dík. Není to poprvé, co jsem chtěl odkázat na nějaký příklad a nevěděl jsem kam. |
||
TomasRe Profil |
#23 · Zasláno: 12. 1. 2015, 10:01:20
Vyřešeno. Kdyby někdo hledal:
<?php $vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id"); while ($zaznam = mysql_fetch_array($vysledek)): echo "<form action='testa' method='post'>"; echo "<input type='hidden' name='id' value='".$zaznam["id"]."'>"; echo "prezdivka: <input name='prezdivka' value='".$zaznam["prezdivka"]."'><br>"; echo "email: <input name='email' value='".$zaznam["email"]."'><br>"; echo "<input type='submit' name='tlacitko' value='Upravit'>"; echo "<input type='submit' name='tlacitko2' value='Smazat'>"; echo "</form><br>"; endwhile; ?> <?php // UPRAVIT ZÁZNAM if(isset($_GET["id"])) { $id=$_GET["id"]; if(!$data=mysql_query("SELECT * FROM uzivatele WHERE id=$id")) {echo "Nepodařilo se načíst záznam k editaci";} else { $zaznam=mysql_fetch_array($data); $prezdivka=$zaznam["prezdivka"]; $email=$zaznam["email"]; } } elseif(isset($_POST["tlacitko"])) { $id=$_POST["id"]; $prezdivka=$_POST["prezdivka"]; $email=$_POST["email"]; $kontrola=true; if($_POST["prezdivka"]=="") {echo "<p class=\"diky\">Nezadána přezdívka</p>"; $kontrola=false;} if($_POST["email"]=="") {echo "<p class=\"diky\">Nebyl zadán email</p>"; $kontrola=false;} if($kontrola) { if(!$data=mysql_query("UPDATE uzivatele SET prezdivka='$prezdivka', email='$email', WHERE id=$id")) {echo "<p class=\"diky\">Změna dat nebyla uložena, opakujte prosím později.</p>";} else {echo "<p class=\"diky\">Změny byly uloženy.</p>";} } } // SMAZÁNÍ ZÁZNAMU if(isset($_POST["tlacitko2"])) { $id=$_POST["id"]; $kontrola=true; if($kontrola) { if(!$data=mysql_query("DELETE FROM uzivatele WHERE id=$id")) {echo "<p class=\"diky\">Změna dat nebyla uložena, opakujte prosím později.</p>";} else {echo "<p class=\"diky\">Změny byly uloženy.</p>";} } } ?> <h1>Výpis uživatelů</h1> <?php $vysledek = mysql_query("SELECT * FROM uzivatele ORDER BY id"); while ($zaznam = mysql_fetch_array($vysledek)): echo "<p>"; echo $zaznam["prezdivka"].'<br>'; echo $zaznam["email"].'<br>'; echo "</p>"; endwhile; ?> |
||
Časová prodleva: 9 let
|
0