Kezdőoldal » Számítástechnika » Programozás » Szintaktikailag hibás ez a...

Szintaktikailag hibás ez a sor? (php, mysql)

Figyelt kérdés

$sql = "UPDATE hirek SET hir_text='$text' WHERE hir_id='$id'";



Az id változót egyébként definiálom előtte úgy, hogy:

$_GET["id"];

Echo-zni is tudja a változót, get-ben megkapja az értéket, de mindig Undefined index-et ír ki a program. Az a legfurább, hogy ellenőrzöm, hogy megtörtént-e a módosítás így:


if ($conn->query($sql) === TRUE) {

echo "Record updated successfully";

} else {

echo "Error updating record: " . $conn->error;

}


Mindig azt írja, hogy record updated successfully. Az id-t az adatbázisból kérem le, ha az adatbázisból get-be megkapott id-t kézzel írom be, akkor működik a dolog, tehát az adatbázis sor létezik ilyen id-vel. Mi a fene lehet ez? Rossz ez szintaktikailag?



#php #MySQL #mysql update
2016. okt. 23. 20:44
1 2 3
 1/24 anonim ***** válasza:

A $_GET["id"]-nek az URL-ből lesz értéke. Szóval ezt kell beírnod a böngészőbe:

index.php?id=5


Ja, a $id és a $_GET["id"] NEM UGYANAZ! Kivéve, ha a php.ini-ben a register_globals nincs engedélyezve. De ne is legyen! Szóval

$_GET["id"];

helyett

$id = $_GET["id"];

kell neked.


Amúgy ez a kód csak akkor lesz érdekes, ha mondjuk

index.php?id=5%27+OR+1%3D1%3B+DELETE+FROM+hirek+WHERE+1+--

És máris töröltem az összes híredet. Ezt kivédheted escape-eléssel vagy prepared statement használatával.


Amúgy ha a hir_id INT típusú, akkor a $id-t nem kell aposztrófok közé tenni a lekérdezésben.

2016. okt. 23. 21:00
Hasznos számodra ez a válasz?
 2/24 anonim ***** válasza:

Persze hogy true-t ad vissza, mivel megtette a MySQL amit kértél tőle, mindenhol ahol a hir_id a megadott érték volt, beállította a szöveget. Az már tök mindegy hogy voltak e érintett sorok. Neked ez a függvény kell: [link]

És elsőnek igaza van, hogyha az id-nél nem használsz intval()-t és a $text-nél quote-t ( [link] akkor ez bizony súlyos SQL Injection sebezhetőség

2016. okt. 23. 21:04
Hasznos számodra ez a válasz?
 3/24 A kérdező kommentje:
Bevezettem változóba az id-t, int típusú, hogyha aposztrófok nélkül írom, akkor szintaktikai hibát ír ki. Lövésem sincs mi lehet a gond, teljesen tanácstalan vagyok.
2016. okt. 23. 21:06
 4/24 A kérdező kommentje:

"Persze hogy true-t ad vissza, mivel megtette a MySQL amit kértél tőle, mindenhol ahol a hir_id a megadott érték volt, beállította a szöveget. Az már tök mindegy hogy voltak e érintett sorok."

Adatbázisból kapom meg az id-t, nem hasraütésszerűen. Ha beállítom így a $id változót, hogy:


$id = 44;

akkor megy a dolog, ha viszont url-ből kapja meg ugyanezt a számot a kód, akkor nem. Az url-ben pedig látszik az id.

2016. okt. 23. 21:11
 5/24 anonim ***** válasza:
Akkor a $id üres. A $id változót azelőtt állítod be ($id = intval($_GET["id"]); ) mielőtt a lekérdezéses kód lefut? Elérhető a $id változó ott ahol használva van? (függvényben a globális változók alapból nem érhetők el, global-t kell használni hozzá)
2016. okt. 23. 21:11
Hasznos számodra ez a válasz?
 6/24 anonim ***** válasza:

"függvényben a globális változók alapból nem érhetők el, global-t kell használni hozzá"

A vessző utáni részt nem fogadnám meg a kérdező helyében, ugyanis a függvénynek mellékhatása lesz, függeni fog a környezetétől.

2016. okt. 23. 21:15
Hasznos számodra ez a válasz?
 7/24 A kérdező kommentje:
Az $id változót lehet egyébként echo-zni, de ezt már leírtam. Ennek ellenére az sql lekérdezés nem látja. Ez konkrétan rejtély.
2016. okt. 23. 21:24
 8/24 A kérdező kommentje:

Ezzel megy:

$id = intval($_GET["id"])


Nem tudom miért... A lényeg, hogy köszi, úgy tűnik működik... Mindenkinek megy a zöld high five!

2016. okt. 23. 21:28
 9/24 A kérdező kommentje:

Nem, mégse működik. Csak véletlenül bent hagytam ezt, hogy:

$id = 44;

2016. okt. 23. 21:30
 10/24 anonim ***** válasza:

Amúgy én a helyedben nem szórakoznék azzal, hogy kézzel írjam meg a lekérdezést. Csinálnék hozzá egy DAO-t (Data Access Object):


class Hir {

.. private $id;

.. private $text;

.. private $mysqli;

.. private $newRecord;


.. public function __construct($mysqli) {

.. .. if (!isset($mysqli) || !($mysqli instanceof mysqli))

.. .. .. throw new Exception("Nem MySQLi példány lett megadva");

.. .. $this->mysqli = $mysqli;

.. .. $this->newRecord = true;

.. .. $this->id = -1;

.. .. $this->text = "";

.. }


.. //Kell néhány getter-setter tag (az id-hoz ne legyen setter!)

.. public function getId() {

.. .. return $this->id;

.. }


.. public function setText($Text) {

.. .. $this->text = $Text;

.. }


.. public function getText() {

.. .. return $this->text;

.. }


.. //ID alapján le kell tudnunk kérdezni egy hírt az adatbázisból

.. public function loadById($id) {

.. .. //Ellenőrzöd, hogy a $id tényleg számot tartalmaz-e

.. .. //Lekérdezed az adatbázisból a mezőt. Ha nem sikerül, vagy false értéket adsz vissza, vagy kivételt dobsz.

.. .. //Eltárolod a lekérdezett értékeket az osztály mezőiben.

.. .. $this->newRecord = false; //Jelezzük, hogy ez már létező adat az adatbázisban

.. }


.. //Ha az összes hírt le kell tudnod kérdezni, azt érdemes static metódusként megírni:

.. public static function getAll() {

.. .. //Visszaadod az összes Hir objektumot tömbként.

.. }


.. //Tudnunk kell elmenteni az adatokat

.. public function save() {

.. .. //Escape-eljük az adatokat és megvizsgáljuk, hogy biztonságosak-e az adatbázisnak

.. .. if ($this->newRecord)

.. .. .. //Update-eljük az adatbázisban a már meglévő rekordot

.. .. else {

.. .. .. //Insert-tel felvisszük az új rekordot

.. .. .. //Ha sikerült a lekérdezés, a $this->id-ban tároljuk az azonosítót, amit az adatbázistól kapott

.. .. .. //valamint $this->newRecord = false;

.. .. }

.. }

}


És ez ilyen egyszerűvé teszi mondjuk egy új hír felvitelét az adatbázisba:

$Hir = new Hir($mysqli);

$Hir->setText("Bréking! Lángoló Note 7-essel fenyegetőztek a bankrablók! Lájkolj, hogy hozzád jöjjön ki a rendőrség!");

if ($Hir->save()) {

.. print "A hírt elmentettük";

}

else {

.. print "Valami nagyon nem jött össze...";

}

2016. okt. 23. 21:39
Hasznos számodra ez a válasz?
1 2 3

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!