Súgó - Keresés - Tagok - Naptár
Teljes változat: SQL kérdésem van
PC WORLD Segélyvonal > WEBSAROK > Webszerkesztés, programozás > Adatbázisok
Oldalak: 1, 2, 3, 4, 5, 6, 7, 8, 9
google
Ebben vajon mi a hiba? blink.gif
Reménykedem benne, hogy valaki más megtalálja, mert én lassan feladom. roll.gif

KÓD
<?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>&nbsp;<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. roll.gif
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:
KÓD
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.
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. blink.gif sad.gif
É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.
arpsoft
Igen, az a legjobb megoldás, csak hát nem néz ki túl jól.
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. smile.gif
Ajnász
KÓD
if(isset($_POST['kuld'])) {... }
arpsoft
Ez nem szál el, ha nincs a _POST tömbnek 'kuld' nevű eleme?
google
Próbáltam már... sad.gif
Ajnász
IDÉZET(arpsoft @ 2005. Jun 14., Tue 17:46)
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="".
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 :

KÓD
if (array_key_exists("kuld",$_POST) and isset($_POST('kuld')){...}
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ő.
arpsoft
Ez oké, de én most egy kicsit elvonatkoztattam a konkrét esettől.
google
Már megint egy probléma, amin már órák óta nem bírok túllépni. weep.gif
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:
KÓD
<?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? annoyed.gif
arpsoft
IDÉZET(google @ 2005. Jun 18., Sat 20:35)

KÓD
$nev = "$HTTP_POST_vARS['nev']";
$jelszo = "$HTTP_POST_VARS['jelszo']";
 


Ezt inkább így kéne:

KÓD
$nev = $HTTP_POST_vARS['nev'];
$jelszo = $HTTP_POST_VARS['jelszo'];
google
Köszönöm, de nem ez a fő hibaforrás. weep.gif
Továbbra sem történik semmi, vagy legalábbis nem ad vissza semmit. sad.gif
Ajnász
A $login mit akar jelölni?
google
A login a submit gomb neve.
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:
KÓD
if(isset($_POST['login'])) {...}


Azt még megkérdezném, hogy hanyas php-verziót használsz.
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.
ole.gif
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)
question.gif sad.gif
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.
google
blush.gif
A lekérdezett cuccot hogyan teszem változóba?
blush.gif
arpsoft
Most nem azért, de a Te kódod volt az előbb:

IDÉZET
KÓD
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.
ocsi
IDÉZET

-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)
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...
arpsoft
A register globals nem véletlenül van alapból kikapcsolva. Biztonsági rés!
Éppen ezért nem szokták a szolgáltatók bekapcsolni.

Erre ma már nem érdemes építeni egy php oldal tervezésénél.
vtcorp
Bocseszka de nem oldastam végig a témát (csak ez elejét)
de az a problémám hogy nem tudom hogy kell a mysql telepítésénél a dolgokat beállítani
google
Muszáj külön telepíteni a MYSQL-t? Szerintem sokkal többre mész, ha pl. az Easyphp -val telepíted.
apacs
Szerintem is. ani_wink.gif Ha valamiért az Easyphp nem tetszene akkr pedig ajánlom az Appserv-et.
google
Azon tűnődöm, hogy hogyan kérdezhetném le egy tábla tartalmát az azonosító szerint visszafelé, de úgy, hogy hátulról csak az ötödiktől induljon el.
Azaz az első kiírandó rekord a 20-as legyen, a következő a 19-es, 18-as, és így tovább (amennyiben ugye pl. 25 rekord van benne).
atzs
Accessben kipróbáltam, megy, tehát a kód:

KÓD
SELECT alap.alp_lelet_sorszám, alap.kontroll
FROM alap
WHERE alap.alp_lelet_sorszám<(SELECT MAX(alap.alp_lelet_sorszám) FROM alap)-100
ORDER BY alap.alp_lelet_sorszám DESC
google
Ezt a max-ot nem ismertem blush.gif , és teljesen logikusnak tűnik, mégsem megy, mert nem talál ennek megfelelő bejegyzést, pedig van, az teljesen egyértelmű. sad.gif
atzs
Egyrészt van néhány összegzőfüggvény: COUNT, MAX, MIN, SUM, AVG

Azt érdemes róluk tudni, hogy egy SELECT utasításben nem lehet oszlopnévvel keverni őket, pl.
SELECT tabla.mezo1, max(tabla.mezo2)
garantáltan hibát ad.

Másrészt lehet használni beágyazott lekérdezéseket, mint ahogy a WHERE után tettem. Ezeket zárójelbe kell tenni, ha minden igaz.
google
Köszönöm a segítséget, de sajnos nem értem, miért nem megy.
Itt a kódom:

KÓD
$query2 = "SELECT * FROM hirek WHERE<(SELECT MAX(azon) FROM hirek)-4 ORDER BY azon DESC";
$result2 = mysql_query($query2,$kapcsolat);


Erre semmit nem listáz ki, mintha nem volna max(azon)-4 - ami egyébként jelen pillanatban 2.
Athos
@google
SELECT * FROM hirek WHERE ???<(SELECT MAX(azon) FROM hirek)-4 ORDER BY azon DESC

Mihez hasonlítod a beágyazott SELECT által visszaadott értéket? A kérdőjelek helyére kell valami. Gondolok a HIREK tábla AZON mezője. ani_wink.gif

@atzs
A példádnál maradva. Akkor lehetséges, ha GROUP BY-t alkalmazol a tabla.mezo1-re. ani_wink.gif
google
... mad.gif blush.gif Már megint baromi figyelmetlen vagyok.
Ezen sürgősen változtatnom kell.

Köszönöm Athos, úgy látszik, szólni kell, ha már magától nem szúrja ki a szememet. censored.gif banghead.gif
atzs
@athos
De akkor már mást csinál. Nem annyi sort ad vissza, ahány sora a táblának van, hanem ahány különböző értéke mezo1-nek, és mezo1 minden értékére külön-külön kiszámítja a hozzájuk tartozó mezo2-k maximumát.

KÓD
SELECT alap.kontroll, max(alap.alp_lelet_sorszám) AS maximumka
FROM alap
GROUP BY alap.kontroll


Ajánlom figyelembe az AS szócskát, amellyel aliasnevet lehet adni az oszlopnak. Ilyenkor e nélkül a gép saját maga nevezi el.

Az előző példámtól viszont azt várná az ember, hogy az első oszlopba szépen kiírogatja mezo1 értékeit egyesével, a második oszlopban pedig minden sorba kiírja a mezo2 oszlop legnagyobb értékét. Na ez az, amit így nem lehet.

(Csak azok kedvéért írtam le, akiknek ez még újdonság. Athos nyilván nem tartozik közéjük. ani_wink.gif )
arpsoft
Sokat jelenthet nagy táblák esetén, ha először megkeresed a max értéket egy lekérdezéssel:

KÓD
select max(id) from éntáblám

Majd ezt felhasználva hívod meg a tényleges lekérdezést:
KÓD
select * from éntáblám where id<sql_eredmény-5 order by id desc


Ennek az az előnye az összetett lekérdezéssel szemben, hogy a belső lekérdezés nem fut le minden egyes rekordra.
Athos
@atzs
Igaz, de én arra írtam, hogy lehet használni több oszlop esetében is mondjuk a MAX függvényt. ani_wink.gif Egyébként ismerem az AS-t. ani_wink.gif

@arpsoft
Ha belső SELECT-tel csinálnám, akkor esetleg az adatbáziskezelő nem optimalizálna, hogy csak egyszer értékeli ki? Szerintem elemezhető, hogy minden egyes esetben ugyanazzal térne vissza, de ebben nem vagyok biztos. roll.gif
Tény, a javaslatod tutira gyorsabb. smile.gif
Kovács Dávid ( Davs )
Hy! Én egy query-t akarok csinálni, ahol több feltétel van. Tehát select * from x where itt hogyan kell elválasztani a feltételeket? Vesszővel?
Ja, és ez csak egy megjegyzés. Új designot csinálok a weboldalamnak, a hírlevelet is átdolgozom, teljesen automatizáslom. Ha valaki le akar jelentkezni, akkor kell a neve, jelszava, mail címe. Ha csak 1 sor lesz az eredmény, akkor helyes, amit írt nem? Tehát akkor egy rekordban van a megadott név, jelszó, cím?
google
A feltételeket az AND-del kötheted össze:

KÓD
SELECT WHERE sor = 'valami' AND sor = 'másvalami'

Ha 1 sor az eredmény, az miért igazolja, hogy helyes? Ezt a megjegyzésedet nem értem.
Kovács Dávid ( Davs )
$nev=$postnev
$email=postemail
$jelszo=jelszo
#Ezek nem így vannak, az összes szabályosan van postolva
$query=mysql_query("select * from tabla where nev='$nev' AND email='$email' AND jelszo='$jelszo') ;
if(mysql_num_rows($query)="1"){
print "helyes" ;
}

Tehát ha az általa beírt adatok mind egy sorban vannak, akkor gondolom övé a mail cím, és tényleg ő akar lejelentkezni.
arpsoft
A feltételeket logikai operátorokkal kell összekapcsolni, azaz:
... WHERE (feltétel1 AND feltétel2) OR feltétel3
Ez kiszűri azokat a rekordokat, ahol VAGY EGYSZERRE teljesül a feltétel1 ÉS a feltétel2, VAGY a feltétel3 teljesül, VAGY mindkettő egyszerre.
google
Karakterkódolási probléma: A szerveren fent levő MYSQL-ben a bekerülő szövegek ékezetei helyett ?-ek jelennek meg. Mi a probléma? A weboldalon ISO-8859-2 a karakterkészlet, a phpMyAdminban Hungarian kódolást adtam meg.

Még egy ehhez kapcsolódó: milyen kódolásban érdemes szövegfájlba menteni az adatbázist? Legutóbb ISO-8859-2-ben próbáltam, de az ő betűből o~ lett, és így tovább. sad.gif
Mezofi
Az én adatbázisomban a cellát latin2_hungarian-nal adom meg. Én is a lapon a ISO-8859-2-t használom. Nálam az adatbázisban az ő betű & # 3 3 7 ; ként jelenik meg. De mikor vissza íródik a képernyőre semmi baja, újra ő betű. biggrin.gif
google
Karakterkódolás megoldva! Nem értem miért, de nekem UTF-8 generalban jó teljesen.
Kovács Gyula (MiniDisc)
hmm.gif ez tényleg érdekes. Pedig más esetben pont ott nem szokott jó lenni. De a lényeg, hogy hibátlanul megy. ani_wink.gif
google
Van egy táblám, amiben van sok rekord. smile.gif
Mindegyikhez tartozik egy kategória, sokhoz ugyanaz. Én ezeket a kategóriákat szeretném összegyűjteni és kiíratni de úgy, hogy mindegyik csak egyszer szerepeljen.
Mezofi
DISTINCT
KÓD
mysql_query("SELECT DISTINCT(oszlop név) FROM tábla név");
smile.gif
google
Há, tényleg! biggrin.gif
Csak átfutottam néhány ilyen utasítást, és ez pont nem volt köztük. blush.gif
Ez a tartalom egy lebutítottváltozata. A teljes változat képekkel kiegészült megtekintéséhez kérünk, kattints ide.