[Megoldva] MySQL syntax error SELECT-nél

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.

Hozzászólások

echo $sql; esetleg oszt akkor latnad is a kverid...

felh_nev=\'$nev\' helyett felh_nev='$nev'
de tényleg echo $sql;

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...

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...

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

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.

(hülyeség, töröltem...)

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.

Hiba uzenetben miert van username amikor keresben nem latok ilyet ?

Mellesleg felh_nev -et lehet `` jelek koze tolni.

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) . "';";

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)

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.

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...

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...

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

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.

Talan:

$sql = "select felh_nev from felhasznalok where felh_nev='{$nev}'";

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

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.

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.

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);
?>

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?

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.

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 --