google
2005. június 13. 21:38
Ebben vajon mi a hiba?
Reménykedem benne, hogy valaki más megtalálja, mert én lassan feladom.
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> <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.
arpsoft
2005. június 14. 8:25
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
2005. június 14. 9:04
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.
É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
2005. június 14. 10:56
Igen, az a legjobb megoldás, csak hát nem néz ki túl jól.
google
2005. június 14. 11:35
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.
Ajnász
2005. június 14. 16:34
KÓD
if(isset($_POST['kuld'])) {... }
arpsoft
2005. június 14. 16:46
Ez nem szál el, ha nincs a _POST tömbnek 'kuld' nevű eleme?
google
2005. június 14. 16:57
Próbáltam már...
Ajnász
2005. június 14. 16:59
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
2005. június 14. 17:26
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
2005. június 14. 18:27
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
2005. június 14. 20:38
Ez oké, de én most egy kicsit elvonatkoztattam a konkrét esettől.
google
2005. június 18. 19:35
Már megint egy probléma, amin már órák óta nem bírok túllépni.
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?
arpsoft
2005. június 19. 10:29
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
2005. június 19. 10:54
Köszönöm, de nem ez a fő hibaforrás.
Továbbra sem történik semmi, vagy legalábbis nem ad vissza semmit.
Ajnász
2005. június 19. 10:58
A $login mit akar jelölni?
google
2005. június 19. 11:01
A login a submit gomb neve.
Ajnász
2005. június 19. 12:06
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
2005. június 19. 12:48
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.
google
2005. június 22. 18:09
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)
arpsoft
2005. június 22. 18:20
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
2005. június 22. 18:24
A lekérdezett cuccot hogyan teszem változóba?
arpsoft
2005. június 22. 18:57
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
2005. június 22. 19:34
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
2005. augusztus 8. 8:03
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
2005. augusztus 8. 17:14
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
2005. augusztus 23. 16:17
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
2005. augusztus 23. 21:18
Muszáj külön telepíteni a MYSQL-t? Szerintem sokkal többre mész, ha pl. az
Easyphp -val telepíted.
apacs
2005. augusztus 23. 22:07
Szerintem is.

Ha valamiért az Easyphp nem tetszene akkr pedig ajánlom az
Appserv-et.
google
2005. szeptember 6. 11:32
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
2005. szeptember 6. 12:30
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
2005. szeptember 6. 12:38
Ezt a max-ot nem ismertem

, és teljesen logikusnak tűnik, mégsem megy, mert nem talál ennek megfelelő bejegyzést, pedig van, az teljesen egyértelmű.
atzs
2005. szeptember 6. 13:23
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
2005. szeptember 6. 14:14
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
2005. szeptember 6. 14:21
@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.

@atzs
A példádnál maradva. Akkor lehetséges, ha GROUP BY-t alkalmazol a tabla.mezo1-re.
google
2005. szeptember 6. 14:27
...

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.
atzs
2005. szeptember 6. 14:41
@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.

)
arpsoft
2005. szeptember 6. 15:33
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
2005. szeptember 6. 16:48
@atzs
Igaz, de én arra írtam, hogy lehet használni több oszlop esetében is mondjuk a MAX függvényt.

Egyébként ismerem az AS-t.

@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.
Tény, a javaslatod tutira gyorsabb.
Kovács Dávid ( Davs )
2005. szeptember 30. 15:55
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
2005. szeptember 30. 16:01
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 )
2005. szeptember 30. 16:06
$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
2005. október 1. 7:45
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
2005. október 4. 8:53
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.
Mezofi
2005. október 4. 15:06
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ű.
google
2005. október 4. 15:27
Karakterkódolás megoldva! Nem értem miért, de nekem UTF-8 generalban jó teljesen.
Kovács Gyula (MiniDisc)
2005. október 4. 15:31

ez tényleg érdekes. Pedig más esetben pont ott nem szokott jó lenni. De a lényeg, hogy hibátlanul megy.
google
2005. október 24. 10:22
Van egy táblám, amiben van sok rekord.
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
2005. október 24. 11:42
DISTINCT
KÓD
mysql_query("SELECT DISTINCT(oszlop név) FROM tábla név");
google
2005. október 24. 12:37
Há, tényleg!
Csak átfutottam néhány ilyen utasítást, és ez pont nem volt köztük.
Ez a tartalom egy lebutítottváltozata. A teljes változat képekkel kiegészült megtekintéséhez kérünk,
kattints ide.