ugrás a tartalomhoz

Lekérdezés textboxba, és módosítás

SYA85 · 2009. Jan. 19. (H), 17.01
Sziasztok!

A következő a problémám: Van egy oldalam ahol az odalátogató textboxok segítségével megadhatja a nevét;címét;elérhetőségét;stb. és ezeket egy gombnyomásra feltöltheti egy adatbázisba. Viszont szeretnék létrehozni egy másik gombot amely segítségével a textboxokba kiíratom az adatbázis tartalmának egy sorát(egy következő és egy előző gomb segítségével tudnék lépkedni a sorok között),itt szeretném ha módosítom a textbox értékét akkor feltöltve módosuljon az adatbázisban is. Jelenleg a textboxok és a feltöltés van kész:

A textbox table:

<table width="520" height="202" border="1">
<tr>
<td>Vezet&eacute;kn&eacute;v</td>
<td><input type="text" name="vezeteknev"id="textfield"></td>
</tr>
<tr>
<td>Keresztn&eacute;v</td>
<td><input type="text" name="keresztnev" id="textfield"></td>
</tr>
<tr>
<td>Lakhely</td>
<td><input type="text" name="lakhely" id="textfield"></td>
</tr>
<tr>
<td>C&iacute;m</td>
<td><input type="text" name="cim" id="textfield"></td>
</tr>
<tr>
<td>&Iacute;r&aacute;ny&iacute;t&oacute; sz&aacute;m</td>
<td><input type="text" name="irszam" id="textfield"></td>
</tr>
<tr>
<td>Telefon</td>
<td><input type="text" name="telefon" id="textfield"></td>
</tr>
<tr>
<td>E-mail</td>
<td><input type="text" name="email" id="textfield"></td>
</tr>
</table>

<form name="form1" method="post" action= "adatb.php">
<input name="kuld" type="submit" id="kuld" value="Adatok feltöltése az adatbázisba" align="middle">
</form>

adatb.php:

<?php
$vezeteknev = $_POST['vezeteknev'];
$keresztnev = $_POST['keresztnev'];
$lakhely = $_POST['lakheky'];
$cim = $_POST['cim'];
$irszam = $_POST['irszam'];
$telefon = $_POST['telefon'];
$email = $_POST['email'];
$user = '*';
$jelszo = '*';
$kapcsolat = mysql_connect("127.0.0.1", $user, $jelszo );
if (!$kapcsolat) die("Nem sikerült kapcsolódni az adatbázishoz!");
mysql_select_db("pkocsifogado", $kapcsolat) or die("Nem sikerült kiválasztani az adatbázist!");
$parancs="INSERT INTO Vendegek (vezeteknev,keresztnev,lakhely,cim,irszam,telefon,email)
VALUES('$vezeteknev','$keresztnev','$lakhely','$cim','$irszam','$telefon','$email')";
if (mysql_query($parancs))
print "Az adatok sikeresen be lettek szúrva az adatbázisba.";
else
print "Az adatokat nem lehet beszúrni: ".mysql_error();
mysql_close();
?>

Még amatőr vagyok, nem tudom hogyan folytassam, segítségeteket előre is köszönöm.
 
1

Nagyjából jó... sőt

adorjani · 2009. Jan. 21. (Sze), 19.11
Csé Szabi!

Itt van a megoldás számodra:

Van egyszer egy connection.php -d, amivel 'csak' csatlakozol az adatbázishoz:

<?php
$db_host = "localhost";
$db_user = "felh_neved";
$db_password = "jelszavad";
$db_name = "adatb_neve";
mysql_connect($db_host, $db_user, $db_password) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());
mysql_query("SET NAMES latin2"); 
mysql_close;
?>
Van maga az index.php, ami az egész folyamatot magába foglalja:
<?php
// adatbázishoz kapcsolódik
require ('./connection.php');

$id = $_GET["lekerdezesID"];

//Ez fut le, ha mentesz
if (isset($_POST['submit1'])) {

//Leellenőrzi, hogy maradt-e mező üresen
if (!$_POST['cucc1'] | !$_POST['cucc2'] ) {
die('<font color=red>Nem töltöttél ki minden mezőt ! Csak akkor menthetsz, ha mindet kitöltötted !</font>');
}
print $_POST['id'];
if ($_POST['id']>0)
{
// ha van id, akkor valszeg módosítás történik, ezért update
$update = "UPDATE cuccok SET cucc1='".$_POST['cucc1']."',  cucc2='".$_POST['cucc2']."' WHERE id='".$_POST['id']."' ";
$doit = mysql_query($update);
}
else
{
// ha nincs id, simán beilleszti az adatbázisba
$insert = "INSERT INTO cuccok (cucc1, cucc2) VALUES ('".$_POST['cucc1']."', '".$_POST['cucc2']."')";
$doit = mysql_query($insert);
}

?>

<!-- Ha kész a művelet -->
<h1><font color="Orange">Elmentve!</font></h1>
<input type="button" onclick="self.location='index.php'" value="Vissza" />
<?php
}
elseif ($id) {

$select1 = "SELECT * FROM cuccok where id=$id";
$doit = mysql_query($select1);
$max = mysql_query("SELECT max(id) FROM cuccok");
while ($maxa = mysql_fetch_array($max, MYSQL_BOTH)) {
  $max_id = $maxa['max(id)'];
  }
?>

<!-- Ha kész a művelet -->
<h1><font color="orange">Kiolvasás</font></h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table border="0">
<?php
while ($row = mysql_fetch_array($doit, MYSQL_BOTH)) {
$id_plusz = $id+1;
$id_minusz = $id-1;
    echo "<input type='hidden' name='id' value=".$id."/>";
    echo "<tr><td><b>Cucc A:</b></td>";
    echo "<td><input type='text' name='cucc1' maxlength='40' value=".$row['cucc1']."></td></tr>";
    echo "<tr><td><b>Cucc B:</b></td>";
    echo "<td ><input type='text' name='cucc2' maxlength='40' value=".$row['cucc2']."></td><td></td></tr> ";
    echo "<tr><td colspan='3'>";
    //A visszaléptetés gomb csak akkor jelenik meg, ha nem az első elemnél járunk
if ($id>1)
{
    echo "<input type='button' name='vissza' value='Előző' onclick=self.location='index.php?lekerdezesID=$id_minusz'> ";
}
// ez mindig megjelenik
    echo "<input type='submit' name='submit1' value='Módosít'> ";

    //Az előre léptetés gomb csak akkor jelenik meg, ha nem az utolsó elemnél járunk
if ($id<$max_id)
{
    echo "<input type='button' name='elore' value='Következő' onclick=self.location='index.php?lekerdezesID=$id_plusz'>";
}
    echo "</td></tr>";

}

mysql_free_result($doit);
echo "</table></form>";
echo "<input type='button' onclick=self.location='index.php' value='Vissza' />";
}
else
{
?>

<!-- űrlap -->
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<br>
<font color="red">Új adatok felviteléhez töltsd ki a mezőket, és kattints a mentés gombra!<br /> Már meglévő adatokat pedig Kiolvasás gombbal láthatsz</font><br>
<table border="0">
<br>
<tr><td><b>Cucc A:</b></td><td>
<input type="text" name="cucc1" maxlength="30">
</td></tr>
<tr><td><b>Cucc B:</b></td><td>
<input type="text" name="cucc2" maxlength="30">
</td></tr>
<tr><td colspan="1" align="left"><input type="submit" name="submit1" value="Mentés"></td><td><input type="button" name="submit2" value="Kiolvasás" onclick="self.location='index.php?lekerdezesID=1'"></td></tr> </table>

</form>
<br>

<?php 
} 
?>
És van az adatbázisod, amely tartalma jelen esetben a következő volt:

-- 
-- Adatbázis: `szabi`
-- 

-- --------------------------------------------------------

-- 
-- Tábla szerkezet: `cuccok`
-- 

CREATE TABLE `cuccok` (
  `id` int(100) NOT NULL auto_increment,
  `cucc1` varchar(100) collate latin2_hungarian_ci NOT NULL,
  `cucc2` varchar(100) collate latin2_hungarian_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin2 COLLATE=latin2_hungarian_ci AUTO_INCREMENT=20 ;

-- 
-- Tábla adatok: `cuccok`
-- 

INSERT INTO `cuccok` VALUES (1, 'első221', 'első222');
INSERT INTO `cuccok` VALUES (2, 'második cucc A', 'második cucc B');
INSERT INTO `cuccok` VALUES (3, 'harmadik cucc A', 'harmadik cucc B');
Próbáld ki, és bővítsd kényed kedved szerint! Aztán ötöst kapni Pénteknél! ;)

Üdv,
aurelius
:)
2

SQLInjection

zila · 2009. Jan. 21. (Sze), 19.32
Tudom ez szokvány duma, de a felhasználótól érkező adatokat ellenőrizni kell mindig. A fenti kódban mi történik ha a $_POST['id'] értéke ez: 1234' OR '1'='1 ?

Nos az történik, hogy a cuccok tábla minden rekordja felülíródik (de akár csak egyes rekordokat is felülírhat, pl. ha ez az update egy felhasználói adat módosító kódrészben van, akkor pl. a site admin userid-jának ismeretében annak jelszavát is módosíthatja, sőt a felhasználónevet is akár, elég lehet ha a jelszó mezőt is mainulálja okosan):
if ($_POST['id'] > 0 ) { // true lesz, id számmal kezdődik
...
$update = "UPDATE cuccok SET cucc1='blabla',  cucc2='bla' WHERE id='1234' OR '1'='1' ";  
...
}
Minimum escapelni kell az inputot, de inkább típus szerint is validálni (pl. ha az id szám akkor a felhasználótól érkező adatot is számmá kell konvertálni) és csak ezután odaadni egy query-nek.
3

Igaz

adorjani · 2009. Jan. 21. (Sze), 21.48
Hibakezelésre és biztonságra nem fordítottam most nagy ügyet. Elég, ha először ráérez, hogy hogy áll össze egy ilyen dolog.
Tisztában vagyok azokkal, amiket leírtál. Én az alapokat szerettem volna lefektetni, hogy lehessen tovább fejleszteni, bővítgetni. :)

Üdv
4

hmm

Hodicska Gergely · 2009. Jan. 21. (Sze), 23.08
Tehát a fenti kódot csak úgy a példa kedvéért gépelted be (gondolom ezért csinál tök mást a kód, mint amit a kérdező kérdezett)? De ettől függetlenül ez nyilas szöveg: pont annyi ideig tart tisztességes példa kódot írni, mint egy ilyet.
5

oktatna

adorjani · 2009. Jan. 22. (Cs), 00.56
Tipikus magyar. Mi értelme a hozzászólásodnak ? Még annyi köze sincs a témához, mint az 'elfuserált' (de miért is??) kódomnak.
Ha nem tudsz építő jellegű hozzászólással csatlakozni egy beszélgetéshez, akkor felesleges írosgatnod.
Példamutatás végett mutathatnál egy 'tisztességes példakódot' ;)
lol.

Üdv
6

tipikus?

Hodicska Gergely · 2009. Jan. 22. (Cs), 01.28
Tipikus magyar. Mi értelme a hozzászólásodnak?
Ezt a magyarozást nem igazán értem. Én a reakciód találtam tipikusnak (gimi?), ezért szóltam hozzá. Szvsz egyértelmű, hogy ezt a kódot nem a kérdező számára írtad, hanem egy meglévő kód. Aki tisztában van azzal, amire Zila utalt, az nem ír le ilyen kódot. De ha mégis példa kód, akkor meg nem túl szerencsés egy kedőnek hibáktól hemzsegő példát mutatni, ez alapján nem fog "ráérezni".

Példamutatás végett mutathatnál egy 'tisztességes példakódot' ;)
Szoktam, nap mint nap.
7

Thx

SYA85 · 2009. Jan. 22. (Cs), 01.35
Én köszönöm a kódot, ez egy iskolai vizsgafeladat, tehát a biztonsági rész nem számít. De jól esik látni hogy vannak emberek akik rögtön fölhívják az ember figyelmét, ha valami nem stimmel a hozzászólással kapcsolatban.

Viszont továbbra is szeretnék egy konkretizált kódot, legyen az tisztességes vagy tisztességtelen:)

Üdv!
12

lol

vbence · 2009. Jan. 22. (Cs), 16.22
Én köszönöm a kódot, ez egy iskolai vizsgafeladat, tehát a biztonsági rész nem számít.
8

Kedves Hodicska

adorjani · 2009. Jan. 22. (Cs), 12.18
Működik, vagy nem? Appserv-en nagyon is. Kipróbálás nélkül tényleg nagyon komoly volt ez a megnyilvánulásod. Gratu!
Ha tudni akarod, rászántam azt az 1 órát, és összeraktam a kérdezőnek. Úgyhogy megint ráfáztál. Mivel még én sem tartozok a Pro kategóriába, egy nálam még kisebb szinten lévő kezdő programozónak nem fogok belerakni túl sok mindent, hogy lehetőleg hamar megértse, miről is van szó.
Ennél a beadandónknál annyi a lényeg, h működjön. Zila hozzászólása helytálló, de a te alaptalan pocskondiázásod már jóval kevésbé.
Az általad említett gimi pedig egyetem ötödév. Szívesen várom a kötözködéseidet, de nem garantálom, hogy a továbbiakban válaszra is méltatom.

Üdv!
9

hozzáállás

Hodicska Gergely · 2009. Jan. 22. (Cs), 12.42
Működik, vagy nem?
Az is a kiírás része, hogy felül lehessen vágni az összes rekordot?

Ha tudni akarod, rászántam azt az 1 órát
De akkor miért tök másról szól, mint amiről a kérdés?

hogy lehetőleg hamar megértse, miről is van szó
Egy mysql_real_escape_string és egy htmlspecialchars valóban teljesen érthetetlenné tette volna a kódot.

Az általad említett gimi pedig egyetem ötödév.
Akkor még szomorúbb.
10

lol

adorjani · 2009. Jan. 22. (Cs), 13.48
Biztos te is ott kezdted programozói pályafutásodat, hogy feltörtél egy oldalt. Gondolkozz már, légy szíves. Kezdőszint. Vágod ? Hogy a ****ba lehet ezt egyszerűbben mondani?!
Először tudni kéne az alapokat, hogy azután foglalkozhassunk a biztonsággal!!! Amíg egy működő lekérdezést nem tud valaki összehozni, minek escape-eljen ???
Ha nem figyeltél volna, ez a cucc soha sem fog nyilvánosan működni. Egy szaros beadandó.
Mindegy, nyilvánvalóan felesleges ez a 'beszélgetés'.
11

Nono

zila · 2009. Jan. 22. (Cs), 14.51
Sajnos ez úgy működik, hogy ha valaki az elején ilyen kódokat farigcsál, akkor az rögzül a legjobban. Ezért amikor az első élesbe kikerülő kódját írja, akkor nagy valószínűséggel elköveti majd ezeket a hibákat. Kezdőnek is lehet jelezni, egy kommenttel, hogy "itt most azért használtam escape-lést, mert ez megvéd pl. az sql injection-től", akkor a kezdő (legalábbis az érelmesebb fajta) előkapja a manualt, elolvassa a mysql_real_escape_string függvény leírását, google-ben rákeres az sql injection kifejezésre és máris tanult valami extrát a "szaros beadandón" kívül. Ráadásul ha ez a szint az egyetem ötöd év, akkor nagyon szomorú vagyok.

teszt kérdésem:
Adott egy függvény, aminek bemenete egy szám, a kimente pedig a szám négyzete. Írd le pszeudó kóddal.
13

kezdőszint

Hodicska Gergely · 2009. Jan. 22. (Cs), 20.10
Biztos te is ott kezdted programozói pályafutásodat, hogy feltörtél egy oldalt.
Nem voltak még sajnos oldalak, csak Benkő Tiborné és Benkő lászló. Amúgy tanulással kezdtem.

Gondolkozz már, légy szíves. Kezdőszint. Vágod ?
Az a szomorú, hogy te ezt nem kezdőszintnek tekinted. A biztonság szerves része a webes programozásnak, bármelyik kezdő könyben alap dolog.

Az nem derült ki, hogy miért szól tök másról a példa, mint a feladat.
14

„Az nem derült ki, hogy miért

Fraki · 2009. Jan. 22. (Cs), 22.22
„Az nem derült ki, hogy miért szól tök másról a példa, mint a feladat.”

Természetesen nem szól tök másról a példa, meg amúgyis, mi az, hogy tök más. Félreértés ne essék, nem is egészen azt csinálja, mint a feladat, meg bugos is, meg ronda is, meg nem is biztonságos, csak ilyen helyzetben van egy határvonal, ami fölött az ember már relevánsabbnak érzi a szívózós attitűdöt a korrekt helyett, és kicsit karakterisztikusabban fogalmaz a kelleténél. (Az ilyen ember egyébként általában szeret vitatkozni, és szeret panaszkodni, hogy nem szeret vitatkozni.)

És természetesen ahol csak arra kell koncentrálni, hogy hogyan tegyünk egy formból adatot egy adatbázisba, példaszinten nem kell foglalkozni a biztonsággal, még egy függvényhívás erejéig sem. Ha egy könyvben már escape-eléssel kezdenek, nem biztos, hogy didaktikailag vagy strukturálisan jónak fogom tartani.

Ezt most inkább neked mondtam, a második bekezdést kicsit neki is.
15

természetesen?

Hodicska Gergely · 2009. Jan. 22. (Cs), 22.40
És természetesen ahol csak arra kell koncentrálni, hogy hogyan tegyünk egy formból adatot egy adatbázisba, példaszinten nem kell foglalkozni a biztonsággal, még egy függvényhívás erejéig sem.
Az a baj, hogy ezt az escapelést ti extra dolognak tartjátok, miközben nem az, szerves része a DB-be írásnak.
17

Nem tudom, szerintem ez

Fraki · 2009. Jan. 23. (P), 06.01
Nem tudom, szerintem ez nézőpont kérdése. Például exploitnak tekintem-e az sql injectiont vagy normális használatnak (ja, hát a biztonság szerves része a db-be írásnak etc.). És amúgy lehet szerves része, na és. A példák világa egy teljesen más kontextus, mint az éles rendszerek szabályhálózata, ott a tákolás mint olyan nem hiba. Persze vannak, akik szebben tákolnak, és vonalzó nélkül is tudnak szép egyenest húzni, vannak, akik kevésbé. Persze a figyelmet fel lehet hívni... na mindegy.
18

HIBA

Hodicska Gergely · 2009. Jan. 23. (P), 11.44
Nem tudom, szerintem ez nézőpont kérdése. Például exploitnak tekintem-e az sql injectiont vagy normális használatnak (ja, hát a biztonság szerves része a db-be írásnak etc.).
Fura számomra, hogy egy webes fejlesztő ilyet leír. Input: Ebben a mondatban van egy ' jel meg egy " jel is., ennek az eredménye egy MySQL hiba lesz. Nem hackelés, teljesen legitim felhasználás.
19

És megmented magad...

Ustak · 2009. Jan. 23. (P), 15.07
egy csomó debugolástól, még a kezdeteknél (mikor a php-t html -t javascript -et sql-t bátran kevertem egy helyen :-)) cseppentem bele egy pont ilyen ' " hibába, és rengeteget vacakoltam a debugolással, ha valaki akkor erről felvilágosít, nagyon örültem volna neki, hogy nem a saját káromon tanulom meg.
22

Lehet, hogy jobban jártál

Fraki · 2009. Jan. 23. (P), 17.06
Lehet, hogy jobban jártál így.
20

Első nyelv

vbence · 2009. Jan. 23. (P), 15.15
Egy gondolat, amit kerülgetünk, de senki nem említette meg: Programozni nem PHPben kell megtanulni. Ez egy nagyon heterogén rendszer és amúgy meg iszonyű ellenséges környezet. Egyáltalán nem hálás eszköz, valami amit mutogatnék valakinek, hogy "ez a programozás". Persze lehet benne szépen programozni, de még a PHP mauál sem arra tanít.

Ha az alapokat akarjuk megmutatni, használjunk javat vagy neadjisten basicet. Az érthetőség kedvéért semmiképpen se tanítsunk rossz példákal. Ha az ember egy nyelvet tanul meg, fejlesztőként sehova nem fog jutni.
21

Én ilyen furcsa vagyok. Lehet

Fraki · 2009. Jan. 23. (P), 17.04
Én ilyen furcsa vagyok. Lehet legitim, de még mindig nem feltétlen elvárt (jó, textbox esetében már inkább az). És egy példa lehet hiányos, sőt ez inherens jellemzőjük. És ez nem webfejlesztői kérdés (ez is ilyen furcsa mondat).
16

Elég lesz!

SYA85 · 2009. Jan. 23. (P), 00.27
Én segítséget kértem és eddig egy helyről kaptam, ha tud valaki szebbet, jobbat, a számomra megfelelőbbet akkor szívesen veszem, de nem gondolom hogy egymás jellemzése célra vezető, úgy hogy kérlek benneteket hogy ne vitatkozzatok, mert ennek így semmi értelme.

Valóban szomorú hogy ez egyetem 5. év és még ehhez is segítséget kell kérnem, úgy hogy bizton állíthatom hogy közel sem én vagyok a legügyetlenebb ebben a témában.

Viszont ezek az egymást becsmérlő hozzászólások sokkal inkább gimibe valók, mint egyetemre.

Természetesen az aki érdemben segítette a problémám megoldását kérem ne vegye magára.

Köszönöm!
23

THX

SYA85 · 2009. Jan. 24. (Szo), 02.20
Kipróbáltam, müködik, nem az én példámra konkretizált, de a célnak tökkéletesen megfelelő választ kaptam, örök hála Aurélius, majd iszunk rá egyet sárguláson.