Jump to content
GSForum - Segélyvonal

SQL kérdésem van


google

Recommended Posts

google

Ebben vajon mi a hiba? :pislog:

Reménykedem benne, hogy valaki más megtalálja, mert én lassan feladom. :hááát:

 

<?php
     
     include("connect.php");
     if(isset($kuld))
 {
     $hircim = dbx_escape_string($_POST['hircim']);
     $hirszoveg = dbx_escape_string($_POST['hirszoveg']);
     
             if(!$hircim){
                    echo "A hírnek nincs címe!";
                    exit();
             }
        $result = "INSERT INTO hirek (hircim,datum,hirszoveg) VALUES ('$hircim',NOW(),'$hirszoveg')";
        mysql_query($result,$kapcsolat) or die("Nem sikerült hozzáadni a hírt!");
                      
         echo "<b>Rendben van, a hír bekerült az adatbázisba.</b>";
         mysql_close($kapcsolat);
       }
else
 {
     ?>
     <p>
     <form method="post" action="<?php echo $PHP_SELF ?>">
     A hír címe:<br><input name="hircim" size="40" maxlength="24">
     <br> <br>
     A hír szövege:<br><textarea name="hirszoveg" rows="7" cols="30"></textarea>
     <br>
     <input type="submit" name="kuld" value="Hír hozzáadása">
     </form>
     </p>
     <?php
 }
     
     ?>

 

Az oldal rendesen megjelenik, nem ír ki hibaüzenetet (tehát csatlakozott és rálelt az adatbázisra is), csakhogy semmi nem történik. Olyan, mintha mindig az else-ág futna le, mert az adatok elküldése után ismét üresen jelenik meg a form.

A tábla és a mezõk nevét milliószor ellenõriztem.

Tényleg nem tudom, mi lehet a gond. És másik fájlból már adatot is sikeresen adtam a táblához, tehát még beállítási gond sem lehet. :hááát:

Link to comment
Share on other sites

arpsoft

Pedig az, mégpedig PHP biztonsági beállítás.

 

A saját magába ágyazott form-ok nem hozzák létre a vezérlõ nevével a php változókat. Tehát, ha van egy formod, aminek az action-je üres, azaz maga az oldal lesz az action, és van rajta egy neved nevû input, akkor nem fogja létrehozni a php a $neved változót. Ezért fut le folyton az else ágad, és ezért van a fórumunkon "Kattints ide, ha nem akarsz várni" oldal is. Erre az oldalra ugyanis elküldi php változóként a neved input tartalmát!

 

Ha mindenképpen egy oldalon akarsz dolgozni, akkor javaslom, hogy az isset helyett használd a következõt:

if(array_key_exist('kuld',$HTTP_POST_VARS))

 

Evvel az az egy szépséghiba van, hogy minden frissítésre le fog futni, de legalább lefut.

Link to comment
Share on other sites

google

Sajnos nem jó.

if (array_key_exists stb...) a feltétel, a küldés után pedig eltûnik a form, és az oldal kódja pedig megszakad, mintha szintaktikai hibás volna a php-script. :pislog::(

És nem adja hozzá az adatbázishoz sem.

Lehet, hogy akkor egyszerûen meghívok egy másik oldalt, amivel kiküszöbölhetõ ez a probléma.

Link to comment
Share on other sites

arpsoft

Igen, az a legjobb megoldás, csak hát nem néz ki túl jól.

Link to comment
Share on other sites

google

Nem baj, végül is csak adminisztratív háttér-rendszer lesz.

Csak kettõ helyett egy fájllal megúsztam volna.

Nem baj, köszönöm a segítséget. :)

Link to comment
Share on other sites

Ajnász
if(isset($_POST['kuld'])) {... }

Link to comment
Share on other sites

arpsoft

Ez nem szál el, ha nincs a _POST tömbnek 'kuld' nevû eleme?

Link to comment
Share on other sites

google

Próbáltam már... :(

Link to comment
Share on other sites

Ajnász
Ez nem szál el, ha nincs a _POST tömbnek 'kuld' nevû eleme?

De igen, ez csak a konkrét probléma megoldására alkalmas, mivel a küldõ gomb neve kuld, és post metódust használ a form adatainak elküldésére. Muszáj egy olyan tömbelemre hivatkozni, mely a form egyik mezõjének name attribútumának értéke. Szerintem Google is éppen ezt próbálta volna csinálni, csak éppen a register_globals php.ini beállítás miatt nem jött össze. Annak bekapcsola erõsen ellenjavallott, mivel komoly biztonsági réseket hagy. Ezért vezették be a $_GET és $_POST változókat.

 

Szerk:

@Google

Próbáld meg, hogy az actionnek nem adsz semilyen értéket, tehát action="".

Edited by Ajnász
Link to comment
Share on other sites

arpsoft

A PHP értelmesen kezeli le a feltételeket? Tehát ha mondjuk egy AND kapcsolatból az elsõ rész nem igaz, akkor is kiértékeli a másodikat?

Mert ha nem, akkor ki lehetne egészeni avval az if-et, hogy :

 

if (array_key_exists("kuld",$_POST) and isset($_POST('kuld')){...}

Link to comment
Share on other sites

Ajnász

Bevallom, ennek egy kicsit utána kellett néznem a php-manualban, és a hozzászólásoknál olyasmi van írva, miszerint nem fog kiértékelõdni a második felétel.

Viszont véleményem szerint felesleges mindkét feltételt lefuttatni, mivel ebben az esetben nem fontos, hogy be legyen állítva a tömbelem értéke. Pontosabban, ha létezik a tömbelem, akkor értéke is lesz, mivel az küldõ gombnak mindenképpen van valamilyen "felirata", ami az értékével egyenlõ.

Link to comment
Share on other sites

arpsoft

Ez oké, de én most egy kicsit elvonatkoztattam a konkrét esettõl.

Link to comment
Share on other sites

google

Már megint egy probléma, amin már órák óta nem bírok túllépni. :Sír:

Egy beléptetõscriptrõl van szó.

Értem az egészet, többször átírtam már, stb. de

sehogy sem akar mûködni! Az adatok jók, de azok elküldése után a login.php helyett egy blank fehér oldalt kapok! Az elérési út jó, de az adatokkal nem tud mit kezdeni!

 

És a login.php kódja:

<?php

 session_start();
 include("connect.php");
 if (isset($login))
 {
     if(!$HTTP_POST_VARS['nev'] || !$HTTP_POST_VARS['jelszo'])
     {
     die("Nem írt be felhasználónevet vagy jelszót!");
     }
     $nev = "$HTTP_POST_vARS['nev']";
     $jelszo = "$HTTP_POST_VARS['jelszo']";
     
 $kerd = "SELECT * FROM users WHERE (nev='$nev') AND (jelszo='$jelszo') LIMIT 1";
 $eredm = mysql_query($kerd,$kapcsolat) or die("Lekérdezni sem sikerült!");
 
 if ($obj=mysql_fetch_object($eredm))
     {
     $HTTP_SESSION_VARS['valid_id']=$obj->id;
     $HTTP_SESSION_VARS['valid_user']=$HTTP_POST_VARS['nev'];
     header("location: hirlista.php");
     }
 else
 {
 die("A belépés nem sikerült, a felhasználónév vagy a jelszó nem megfelelõ.");
 }
 }      
?>

 

Egyszerûen nem értem, miért.

Az Easyphp-t használom. Nem lehet localhoston session-t kezelni vele? :S

Link to comment
Share on other sites

arpsoft

$nev = "$HTTP_POST_vARS['nev']";
$jelszo = "$HTTP_POST_VARS['jelszo']";
 

Ezt inkább így kéne:

 

$nev = $HTTP_POST_vARS['nev'];
$jelszo = $HTTP_POST_VARS['jelszo'];

Link to comment
Share on other sites

google

Köszönöm, de nem ez a fõ hibaforrás. :Sír:

Továbbra sem történik semmi, vagy legalábbis nem ad vissza semmit. :(

Link to comment
Share on other sites

Ajnász

A $login mit akar jelölni?

Link to comment
Share on other sites

google

A login a submit gomb neve.

Link to comment
Share on other sites

Ajnász

Akkor valószínûleg ez a gond. A serveren nincs bekapcsolva a register_globals változó (helyesen), ezért a $_POST, $_GET, $HTTP_POST_VARS, $HTTP_GET_VARS elõre definiált változókat kell használni. Esetedben, mivel post metódust használsz a form elküldésére a $_POST vagy $HTTP_POST_VARS változót kell használni, Tehát:

if(isset($_POST['login'])) {...}

 

Azt még megkérdezném, hogy hanyas php-verziót használsz.

Link to comment
Share on other sites

google

4.3.10

 

Egyébként ezzel megoldódott a beléptetés problémája, nagyon köszönöm a segítséget.

:olé:

Link to comment
Share on other sites

google

Sajnos újabb problémával szembesültem. Ez pedig a jelszócserénél alakult ki.

 

Minden OK, a cserét megcsinálja rendben, stb.

Majd elkezdtem vizsgálni a felhasználó-eseteket: pl. nem ír be egy jelszót sem, csak egyet ír be, nem erõsíti meg az új jelszavát, stb.

 

A régi jelszónak azonban bármit beírhat, üresen is hagyhatja. Ezt is ki szeretném szûrni, de az már nem olyan egyszerû.

Gondoltam, talán nem kell belebújni az adatbázisba, megteszi egy session-változó is. Azonban hiába tettem bele, még kiíratni sem tudom, mert nem jelenik meg. Pedig szintaktikailag biztosan rendben van. Session-változó pl. a usernév is.

 

Vagy talán a password-mezõbõl elpostázott stringeket nem lehet session-változóba betenni?

Hogyan tudnám elegánsan és fájdalommentesen összehasonlítani a valós jelszót a felhasználó által a formba beírt régi jelszavával? (ami alapesetben ugye meg kell, hogy egyezzen)

:?::(

Link to comment
Share on other sites

arpsoft

Lekérdezed az adatbázisból, mintha beléptetnéd, és összehasonlítod a post-olt változóval.

Ha rendben van, akkor engeded aváltoztatást, ha nem, akkor die.

Link to comment
Share on other sites

google

:upsz:

A lekérdezett cuccot hogyan teszem változóba?

:upsz:

Link to comment
Share on other sites

arpsoft

Most nem azért, de a Te kódod volt az elõbb:

 

if ($obj=mysql_fetch_object($eredm))
 {
 $HTTP_SESSION_VARS['valid_id']=$obj->id;

 

Van ebbõl valami ötleted már? Mondjuk a $obj->password lehetõség?

Vagy ahogy hívod a jelszó mezõdet.

Link to comment
Share on other sites

ocsi

-kapcsolódás az adatbázishoz

-tábla kiválasztása

-lekérdezed az adott felhasználó jelszavát

$sql_data = mysql_fetch_array(ide_kerül_a_lefuttatott_sql_változója);

$regi_jelszo = $sql_data['jelszo'];

If ($regi_leszo == $_POST[jelszo_regi])

    {

    ha jó a jelszó

    }

else

    {

    ha nem jó a jelszó

    }

szóval lekérdezed a jelszavát, és azt összehasonlítod az elküldöttel..( Kb ugyan az mint Arpsoft megoldása)

Link to comment
Share on other sites

  • 1 month later...
fazy

A php-nek (nekem friss debian alatt) volt 1 olyan baja, hogy be kellett azt állítani, hogy használhasson változókat.

php.ini

register_globals = On

 

És mûködik is...

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...