Szintaktikailag hibás ez a sor? (php, mysql)
$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?
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
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.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
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
"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.
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
"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.
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!
Nem, mégse működik. Csak véletlenül bent hagytam ezt, hogy:
$id = 44;
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz2.png)
![*](http://static.gyakorikerdesek.hu/p/vsz0.png)
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...";
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!