Sziasztok!
Ezt a hibaüzenetet kaptam egy lekérdezéskor:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 'username')' at line 2
A hibát ez a két sor okozza:
$sql = "select felh_nev from felhasznalok where felh_nev=\'$nev\' ";
$eredmeny = mysql_query($sql, $ossz) or die (mysql_error());
Kipróbáltam többféle módon a szintaxist, aposztrófokkal, idézőjelekkel (ilyenkor adta ezt a hibát), és azok nélkül is, akkor egy másik hibaüzenet jött.
phpMyAdmin-ban kiadva ezt a lekérdezést, működött, PHP kódban nem jó.
Találkozott már valaki hasonló hibával? Mi okozhatja, hogyan lehet elhárítani?
Válaszaitokat előre is köszönöm.
- 2733 megtekintés
Hozzászólások
echo $sql;
esetleg oszt akkor latnad is a kverid...
- A hozzászóláshoz be kell jelentkezni
felh_nev=\'$nev\' helyett felh_nev='$nev'
de tényleg echo $sql;
- A hozzászóláshoz be kell jelentkezni
Kipróbáltam \ nélkül is, pont úgy, ahogy írtátok, akkor se jó, ugyanaz a hiba. A hibaüzenetben lévő ) karakter zavar, mivel az sehol sem szerepel a stringben.
print "$sql"; paranccsal kiírattam az előállított stringet, megfelelt a select tankönyvi példájának.
- A hozzászóláshoz be kell jelentkezni
bekopiznád ide? írd át kicsit ha személyes adat
- A hozzászóláshoz be kell jelentkezni
Eredmény az "echo $sql"-re:
select felh_nev from felhasznalok where felh_nev='admin'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 'admin')' at line 2
Látszólag jó a lekérdezés, és mégis hibát ad...
- A hozzászóláshoz be kell jelentkezni
a táblában jó adattípus van megadva a felh_nev -re?
- A hozzászóláshoz be kell jelentkezni
az asszem nem syntax error lenne, de rég láttam már ilyet :)
Lacus: phpmyadminba kopizd be ezt a queryt, s ott mit ad?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Ott működik. Sőt, kipróbáltam, mit csinál, ha a végére írom azt a zárójelet, amit a hibaüzenet tartalmaz, és akkor viszont ugyanazt a syntax errort kaptam.
- A hozzászóláshoz be kell jelentkezni
azt a kveri parzer rakja bele.
Ha hardcode-olod, hogy mysql_query("select ..."), akkor lefut?
Esetleg meg a mysql_error-nak add parameterul a $ossz -t.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
varchar(25)
Szerintem ez jó hozzá.
- A hozzászóláshoz be kell jelentkezni
csak a vicc kedvéért: konkatenációval?
"[...]felh_nev=".$nev;
Illetve most olvasom, hogy varchar --> = helyett like?
Ui: De éles tényleg kódban vedd komolyan az XSS-re vonatkozó figyelmeztetéseket.
Ui2: Kerestem egy "iskolapéldát" is:
$sql = "SELECT 'felh_nev' FROM 'felhasznalok' WHERE 'felh_nev' = '$nev'";
//így, mindenféle boszorkányos escape-elés nélkül, "tipikus" mysql-friendly szintakszissal, brrr...
- A hozzászóláshoz be kell jelentkezni
$sql = "SELECT `felh_nev` FROM `felhasznalok` WHERE `felh_nev` = '$nev'";
a mező és táblanevek körül AltGr+7 által előállítható prime nevű idézőjel kell.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Ennél már csak ez szebb:
$sql = "SELECT `felhasznalok.felh_nev` FROM `felhasznalok` WHERE `felhasznalok.felh_nev` = '".$nev."'";
:D
- A hozzászóláshoz be kell jelentkezni
Imho akkor mar:
$sql = 'SELECT `felhasznalok`.`felh_nev` FROM `felhasznalok` WHERE `felhasznalok`.`felh_nev` = "' . mysql_real_escape_string ($nev) . '"';
- A hozzászóláshoz be kell jelentkezni
Contest! Rakjunk bele mindent amit lehet! És akkor már legyen benne egy mysql_query-ben hogy egyből a visszatérési értéket adja.
- A hozzászóláshoz be kell jelentkezni
Én a resultot is tudom. $nev.
- A hozzászóláshoz be kell jelentkezni
Rosszul tudod. A $nev tartalmaz egy űrlapból POST-tal kapott adatot trimmelve (a legutóbb benne is felejtettem, de nem baj, úgyse szigbiz dolog...).
- A hozzászóláshoz be kell jelentkezni
Ühüm. Hát igen, változóknak szokott lenni értéke. Csak azt nem értem annak mi értelme hogy lekérdezem annak a júzernek a nevét akinek a neve Béla.
- A hozzászóláshoz be kell jelentkezni
Neked nem kell értened, hogy miért nem akarja publikálni az adatbázis struktúráját.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
No persze ha ne adj' Isten user lenne a tábla oszlopának neve akkor teljességgel érthető lenne a gebasz.
- A hozzászóláshoz be kell jelentkezni
A célom az, hogy egy adott usernévről megállapítsam, létezik-e már a táblában, mert akkor nem felel meg (két azonos usernevet nem regisztrálhatunk).
- A hozzászóláshoz be kell jelentkezni
Vannak fenntartott nevek. Próbáld a táblanév.oszlop formát.
- A hozzászóláshoz be kell jelentkezni
Hint: constraint, uniq, meg némi hibakezelés. A klienstől kapott stringet persze ettől függetlenül rendbe kell szedni.
- A hozzászóláshoz be kell jelentkezni
Azért a trim() nem a világ, illene a bejött stringből néhány dolgot még kihajítani -- biztos, ami biztos alapon...
- A hozzászóláshoz be kell jelentkezni
SOHA SOHA SOHA nem csinálunk olyat, hogy kívülről jövő adatot beleteszünk egy query stringjébe! Hiába mondod te most azt, h 100%, hogy nincs benne XSS, egy hét múlva már meg is feledkezel erről az előfeltételről, és máris ott a baj.
$sql = "select felh_nev from felhasznalok where felh_nev='".mysql_real_escape_string($nev)."'";
És ezt echozd ki, fényt derít az esetleges rejtett unicode karakterekre is.
--
The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni
Hogyúgyvan...
- A hozzászóláshoz be kell jelentkezni
Meg filter_input.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Kipróbáltam, amit írtál, íme az eredmény:
select felh_nev from felhasznalok where felh_nev='admin'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 'admin')' at line 2
Tuti, hogy jó ötlet, köszönöm, benne is hagyom, de a problémám megmaradt.
- A hozzászóláshoz be kell jelentkezni
Egy "s
elect * from felhasznalok" queryre mit mond? Van egyáltalán felh_nev oszlop?
- A hozzászóláshoz be kell jelentkezni
Igen, van ilyen oszlop, varchar(25) típusú.
Sejtem, hogy az idézőjelekkel van a gond, de nélkülük nem adatnak, hanem mezőnek értelmezi $nev értékét, velük pedig a fenti hibát produkálja.
- A hozzászóláshoz be kell jelentkezni
$sql="S
ELECT felh_nev FROM felhasznalok WHERE felh_nev='".$nev."'";
Így se?
Ja és idézőjelek közé rakd a queryt ne aposztrófok közé.
- A hozzászóláshoz be kell jelentkezni
Így sem jó. Nézzetek rá a hibaüzenetre, miért teszi a záró aposztróf után be azt a zárójelet is, amit én sehol nem tettem a stringbe? Az echo sem mutat zárójelet.
- A hozzászóláshoz be kell jelentkezni
a lekérdezés feldolgozó teszi bele, hogy teljes zárójelezésben tudja értelmezni. Nincs azzal ott baj.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
(hülyeség, töröltem...)
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Hiba uzenetben miert van username amikor keresben nem latok ilyet ?
Mellesleg felh_nev -et lehet `` jelek koze tolni.
- A hozzászóláshoz be kell jelentkezni
Mer' titkos! "Neked nem kell értened, hogy miért nem akarja publikálni az adatbázis struktúráját."
- A hozzászóláshoz be kell jelentkezni
Es, ha valami spec szot hasznla benne idezo jelek nelkul az siman lehet gond.
- A hozzászóláshoz be kell jelentkezni
Az 'username' a $nev változó egy lehetséges értéke.
Azt is próbáltam korábban, se vele, se nélküle nem volt jó.
- A hozzászóláshoz be kell jelentkezni
as ) -jel az honnan van ?
- A hozzászóláshoz be kell jelentkezni
Ezt én is szeretném tudni. Az összeállított $sql stringben nincs benne, az biztos, de az SQL hibaüzenet már jelzi. Valahol a kettő között bekerül, csak hol és miért?
- A hozzászóláshoz be kell jelentkezni
Nem lényeg, csak debug infó. Rendben vannak az idézőjelek? Nincs három aposztróf véletlenül a sorban kettő helyett?
- A hozzászóláshoz be kell jelentkezni
A lekérdezés teljesen szabályos, phpMyAdmin-ban le is futott, csak PHP kódban akadékoskodik. Nincs felesleges aposztróf sehol.
- A hozzászóláshoz be kell jelentkezni
És véletlenül sem aposztrófokkal van lezárva a query. Szóval nem
$sql='select felh_nev from felhasznalok where felh_nev='$nev'';
hanem
$sql="select felh_nev from felhasznalok where felh_nev='$nev'";
?
- A hozzászóláshoz be kell jelentkezni
Lehet hogy hülyeség, de én is szívtam már ilyesmivel, én az SQL "utasításokat" nagybetűvel írnám, illetve az SQL kérést ;-vel zárnám, egy próbát megér szerintem:
$sql = "SELECT felh_nev FROM felhasznalok WHERE felh_nev = '" . mysql_real_escape_string($nev) . "';";
- A hozzászóláshoz be kell jelentkezni
Próba megvolt, eredmény nem változott. Azért köszi.
- A hozzászóláshoz be kell jelentkezni
kezd érdekes lenni a dolog...
megy a többi lekérdezés a PHP állományodban?
esetleg ha máshogy kérdeznéd le hogy van-e ilyen user, pl:
$sql = "SELECT COUNT(*) AS vanilyen FROM felhasznalok WHERE felh_nev = '" . mysql_real_escape_string($nev) . "';";
(aztán ha van ilyen felh_nev a táblában akkor vanilyen <> 0, különben 0)
- A hozzászóláshoz be kell jelentkezni
Oké.
Kezdjük elölről.
Ez lefut PHP-ből hívva?
SELECT felh_nev FROM felhasznalok WHERE 1=1 LIMIT 1
Aztán ez?
SELECT felh_nev FROM felhasznalok WHERE felh_nev = felh_nev
SELECT felh_nev FROM felhasznalok WHERE felh_nev LIKE "blabla"
Ezt mindet szimpla idézőjelbe tedd.
Változót meg így adj át majd bele:
$sql = 'SELECT x FROM tbl WHERE z = ' . $sanitized_int . ' AND str = "' . $sanitized_str . '"'; (ez itt a végén szimpla-dupla-szimpla kombó)
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Az első jól futott le, a következő kettőnél már ugyanazt a hibát adta. Nem is próbáltam tovább, mert erre nem tudok épeszű magyarázatot:
SELECT felh_nev FROM felhasznalok WHERE felh_nev LIKE "blabla"
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 'admin')' at line 2
Ennek a lekérdezésnek a közelébe se került a $nev változó, így nem értem, az admin-t honnan vette...
- A hozzászóláshoz be kell jelentkezni
Meggyozodesem, hogy fogalmad nincs mi tortenik, talan nem azon php file-ban kellene probalkoznod.
- A hozzászóláshoz be kell jelentkezni
Légy szíves, magyarázd el, mi történik, mert lehet, hogy tényleg fogalmam sincs róla. Mivel próbálkozzak PHP helyett, utcasöpréssel? :P
Nem azért írtam a fórumba, hogy beszólásokat kapjak, hanem hogy segítséget.
- A hozzászóláshoz be kell jelentkezni
Persze lehet, hogy hulyen fogalmaztam, de ettol meg _ha nem tudod_ hogyan kerul oda a lekerdezesbe valami akkor talan annyira szarra kavartad a dolgot, hogy egy szuz php alkalmazassal tesztelned a query-t amit javasolnak.
Szimplan ennyi volt a javaslatom. Az utcasepres is alternativa, ha abban erzed magad jobbnak, akkor tedd, de en ezt nem javasoltam...
- A hozzászóláshoz be kell jelentkezni
Rá kéne keresni hogy hol van admin a php-kban. Abban is amit include-olva van.
Meg megnézni hogy van-e joga a db júzernek a select-hez azon a táblán.
- A hozzászóláshoz be kell jelentkezni
Sztem keverednek a link_identifier-ek nalad.
Kezdj egy blank php file-t, abban probald ki.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Ezt utanam tudod csinalni ?
(mysql -u user_nevem -p)
use test;
create table felhasznalok (felh_nev varchar(20));
sql.php
<?php
$ossz=mysql_connect("localhost", "user_nevem", "password") or die(mysql_error());
echo "Connected to MySQL<br />";
mysql_select_db("test") or die(mysql_error());
$nev="username";
$sql = "select felh_nev from felhasznalok where felh_nev='$nev'";
echo "<br />".$sql."<br />";
$eredmeny = mysql_query($sql, $ossz) or die (mysql_error());
echo "OK";
?>
Eredmeny:
Connected to MySQL
select felh_nev from felhasznalok where felh_nev='username'
OK
- A hozzászóláshoz be kell jelentkezni
+1
illet még annyi, hogy a "use test;" sor elé egy "create database test"
- A hozzászóláshoz be kell jelentkezni
Amely adatbázis defaulte létezik amúgy.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Most megnéztem a 3 etch és 2 wampserver install-t, egyiken se láttam test adatbázist.
- A hozzászóláshoz be kell jelentkezni
Disztrója válogatja.
- A hozzászóláshoz be kell jelentkezni
Nekem eddig az összes install, az összes verziónál, az összes szerveremen létrehozta a test nevű db-t, csak Debiant használok + egyszer wamp-ot feltettem valakihez, de még ott is volt.
Úgyhogy ez most vagy layer8, vagy azóta nem default.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
most leszedtem wamp-ot, töröltem mindent és felraktam a legújabbat, nincs test table. de mindegy
- A hozzászóláshoz be kell jelentkezni
Akkor már nincs, de nem is kár érte.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
A MySQL egy szerveren csücsül, nincs admin jogom hozzá, csak a nekem létrehozott adatbázisban tudok megtenni dolgokat (táblák, lekérdezések stb.).
- A hozzászóláshoz be kell jelentkezni
akkor a neked létrehozott db-ben csináld meg azt, amit turul16 írt. akár phpmyadminban.
create table blah (mezo varchar(16))
aztán a php, értelemszerűen átírva a query-t és a mysql_select_db-t
- A hozzászóláshoz be kell jelentkezni
Talan:
$sql = "select felh_nev from felhasznalok where felh_nev='{$nev}'";
- A hozzászóláshoz be kell jelentkezni
a $nev nem tartalmaz ) vagy " vagy ' jelet?
vagy így:
$sql = "select felh_nev from felhasznalok where felh_nev='$nev';";
mivel az sql-t ; zárjuk majd a php sort is.
" előtt a ; a sql-t utánna a php sort zárja
pch
- A hozzászóláshoz be kell jelentkezni
pontosisd mar legyszi miert is kell az a ";" a lekerdezesbe?
- A hozzászóláshoz be kell jelentkezni
Leirtam vagy az hülyeség?
Nálam minden sql lekérdezés ; van lezárva, majd a php sor is, és sose volt ilyen hibám..
pch
- A hozzászóláshoz be kell jelentkezni
Oke. Ettol meg nem kell.
- A hozzászóláshoz be kell jelentkezni
egyertelmuen layer 8 hiba.
t
- A hozzászóláshoz be kell jelentkezni
Ezt kicsit bővebben fejtsd ki, légy szíves. Szeretnék eljutni a megoldásig.
- A hozzászóláshoz be kell jelentkezni
Aszondja a hiba benned van. Talán mert még nincs tapasztalatod a debuggolásban, már leírták hogy mit csinálj. Vagy visszafelé lebontod a cuccost hogy kiderüljön hol a hiba, vagy építesz egy tesztet ahol csak az van ami kell, db connect, lekérdezés, eredmény. Ennél többet az Atya Úr Isten se tud tenni.
- A hozzászóláshoz be kell jelentkezni
Köszönöm mindenkinek a segítséget, nekiállok az alapoktól, és ha sikerül megoldani, beszámolok itt az eredményről. (Ha nem sikerül, akkor kitalálok valami mást...)
- A hozzászóláshoz be kell jelentkezni
Így kipróbáltad?
$sql = "select felh_nev from felhasznalok where felh_nev='{$nev}'";
- A hozzászóláshoz be kell jelentkezni
Oke.
Kezdj egy teljesen uj file-t.
Ebbe a teljesen uj file-ba illeszd be ezt a kodot:
<?php
# Ezeked modositsd szukseg szerint
$server = YOUR_SERVER;
$user = 'Lacus';
$pass = 'VeryS3cretPass';
# Ezekhez ne nyulj!!!
$dbase = 'mysql';
$conn = mysql_connect($server, $user, $pass);
if(!$conn) {
die('MySQL conn err... ' . mysql_error());
}
mysql_select_db($dbase, $conn);
$ered = mysql_query("SELECT user, host FROM user WHERE user = '" . $user ."' LIMIT 1", $conn);
$sor = mysql_fetch_assoc($ered);
?>
Kedves <?php echo $user ?>, neked a belepes csak a <?php $sor['host'] ?>-rol engedelyezett.
<?php
mysql_free_result($ered);
mysql_close($conn);
?>
Erdekel a vege.
Tudom, hogy nem security vedett a kod, de jelenleg nem ez a legfobb problemank.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Eredmény:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /.../teszt.php on line 17
Kedves ..., neked a belepes csak a -rol engedelyezett.
Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /.../teszt.php on line 21
Ez a kód:
<?php
$server = '...';
$user = '...';
$pass = '...';
# Ezekhez ne nyulj!!!
$dbase = 'mysql';
$conn = mysql_connect($server, $user, $pass);
if(!$conn) {
die('MySQL conn err... ' . mysql_error());
}
mysql_select_db($dbase, $conn);
$ered = mysql_query("SELECT user, host FROM user WHERE user = '" . $user ."' LIMIT 1", $conn);
$sor = mysql_fetch_assoc($ered);
?>
Kedves <?php echo $user ?>, neked a belepes csak a <?php echo $sor['host'] ?>-rol engedelyezett.
<?php
mysql_free_result($ered);
mysql_close($conn);
?>
- A hozzászóláshoz be kell jelentkezni
módosítás:
ezt >>>
mysql_select_db($dbase, $conn);
$ered = mysql_query("SELECT user, host FROM user WHERE user = '" . $user ."' LIMIT 1", $conn);
$sor = mysql_fetch_assoc($ered);
?>
Kedves <?php echo $user ?>, neked a belepes csak a <?php $sor['host'] ?>-rol engedelyezett.
<?php
mysql_free_result($ered);
mysql_close($conn);
?>
<<<
erre >>>
mysql_select_db($dbase, $conn) or die('cannot select db');
$ered = mysql_query("SELECT user, host FROM user WHERE user = '" . $user ."' LIMIT 1", $conn) or die('cannot execute query');
if (1 > (mysql_num_rows($ered)){
die('0 sor jott vissza');}
$sor = mysql_fetch_assoc($ered);
echo "Kedves $user neked a belepes csak a {$sor['host']}-rol engedelyezett.";
mysql_free_result($ered);
mysql_close($conn);
?>
<<<
így mit kapsz eredményként?
- A hozzászóláshoz be kell jelentkezni
Nos, úgy tűnik, megtaláltam a megoldást. Íme:
$sql = sprintf("SELECT felh_nev FROM felhasznalok WHERE felh_nev='%s'",
mysql_real_escape_string(trim($_POST[felh_nev])));
$eredmeny = mysql_query($sql, $ossz);
if (($eredmeny != false) && (mysql_num_rows($eredmeny) != false)) {
$_SESSION[uzenet] = "Már létezik ez a felhasználónév.";
header("Location: reg.php");
exit;
} else {
unset($_SESSION[uzenet]);
$_SESSION[felh_nev] = trim($_POST[felh_nev]);
header("Location: reg2.php");
exit;
}
Szétszedtem az űrlapot két részre, először csak a felhasználónevet kéri be (reg.php), ellenőrzi (ez a kód), és ha még nem létezik, akkor kéri be a többi szükséges adatot (reg2.php).
Köszönöm minden hozzászólónak az ötleteket, sok hasznos dolgot tanultam belőlük.
- A hozzászóláshoz be kell jelentkezni
egy mysql_escape_string() függvényt is engedj rá a $query -re mert ha így alkalmazod nem véfi ki az aposztrófok jelenlétéből létrejöhető hibákat.
-- "Bízzál Istenben és tartsd szárazon a puskaport!" - Cromwell --
-- Sayusi Ando - http://sayusi.hu --
- A hozzászóláshoz be kell jelentkezni