Javítottam, de így is hibát ír:
Problem with Query: INSERT INTO category_parent (did,parent) VALUES(\'1\',\'34\')
De a categories táblába továbbra is bekerülnek az adatok.
Szerk: aposztróf nélkül is ugyanaz a hiba.
[ Szerkesztve ]
Javítottam, de így is hibát ír:
Problem with Query: INSERT INTO category_parent (did,parent) VALUES(\'1\',\'34\')
De a categories táblába továbbra is bekerülnek az adatok.
Szerk: aposztróf nélkül is ugyanaz a hiba.
[ Szerkesztve ]
1) Vsz numerikusmezőket nem kell aposztrofolni.
$DB->Query("INSERT INTO category_parent(did,parent) VALUES($result,$category)");
2) Tessék prepared statementeket használni!
AE
[ Szerkesztve ]
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
$result = mysql_query("SELECT id FROM categories WHERE name='$name'");
$DB->Query("INSERT INTO category_parent(did,parent) VALUES('$result','$category')");
mysql_query() :
"For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a (I)resource(/I) on success, or FALSE on error."
Te ezt az erőforrásazonosítót adod át közvetlenül.
Próbáld így:
$result = mysql_query("SELECT id FROM categories WHERE name='$name'");
$row = mysql_fetch_object($result);
$DB->Query('INSERT INTO category_parent(did,parent) VALUES('.$row->id.',"'.$category.'")');
Bár eleve a mysql_query()-jellegű függvényhívások meg a query-konkatenálások kerülendőek. Szerencsére már a hivatalos honlapon is írják.
========
(#10152) ArchElf : ez jó, még nem láttam, qrva beteg.
Egyébként a MySQL-nek semmi problémája nincs egy idézőjelbe rakott inttel INSERT-nél, lazán elfogadja, tehát nem az lesz a baj.
[ Szerkesztve ]
Sk8erPeter
Már megontam szajkózni - most csináltam
AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
Hatásos hivatkozási alap lesz a későbbiekre.
Amúgy szerkesztettem a hsz.-t az aposztrófról, lásd a hsz. végét.
"Egyébként a MySQL-nek semmi problémája nincs egy idézőjelbe rakott inttel INSERT-nél, lazán elfogadja, tehát nem az lesz a baj."
De még kiegészíteném:
nemcsak az idézőjelbe, de az aposztrófba rakott INT-tel sincs semmi baja.
[ Szerkesztve ]
Sk8erPeter
Ok, csak tipp volt... Persze már rájöttem, hogy a resource id nem tetszett neki
Ha össze vannak kötve a táblák (bár miért lennének), akkor lehet, hogy a foreign key constraint fogja meg...
AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
Azt írtad, hogy a második queryvel van a baj. A második query a $result = mysql_query('SELECT...'). De ezek szerint akkor a harmadikkal van gond.
Szóval elsőre a probléma, hogy a mysql_query('SELECT ...') nem egy értéket, hanem egy ún. "mysql resource"-t ad vissza, amiből még ki kell hámozni magát a mezőértéket, mysql_fetch... kinézetű függvény használatával.
De ha jól értem, akkor a mysql_query-t már lecserélted $DB->Query -re. A harmadik query most így elsőre jónak tűnik. Én is az aposztrófokra tippeltem volna, hogy az okoz galibát, de ezek szerint mégsem. Sajnos a "Problem with Query" hibaüzenet nem túl beszédes.
x gon' give it to ya
Kiváló példa, adott is az sql injection.
A $category változóban lévő "--" karaktersorozat miatt az értelmező a query további részét kommentnek veszi, így az inserted hibás.
Ezért kell vagy önmagában escapelni a megfelelő karaktert, vagy a javasolt pdo megoldást használni.
Plusz, továbbá, amint látom a $result változód ráadásul még üres is és mivel még aposztróf között sincs így ezzel egy újabb szintaktikai hibához értünk.
- http://pazsitz.hu -
Sql injectionről írni egyelőre szerintem felesleges, alapvető dolgokat kéne tisztába tenni. $DB-ben valami adatbáziskezelő objektum van, viszont két query közt sima mysql_query-t próbál használni. Ez félig copy-paste vagy átvett kód lehet. Nehéz lesz így tanácsot adni, mivel ráadásul a kód részben ismeretlen számunkra.
[ Szerkesztve ]
x gon' give it to ya
Igen, ez egy minták alapján alakítgatott kód. Próbálok egy használható alkalmazást összerakni és tudom, hogy ez egy hozzáértő számára gányolt kód.
A $DB változóhoz tartozó kód:
$config = array();
$config['host'] = '127.0.0.1';
$config['user'] = 'root';
$config['pass'] = '';
$config['table'] = 'onlab';
class DB
{
/**
* @desc Creates the MySQLi object for usage.
*
* @param $db required connection params.
*/
public function __construct($db) {
$this->mysqli = new mysqli($db['host'], $db['user'], $db['pass'], $db['table']);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
}
/**
* @desc Simple preparation to clean the SQL/Setup Result Object.
*
* @param SQL statement
* @return
*/
public function Query($SQL)
{
$this->SQL = $this->mysqli->real_escape_string($SQL);
$this->Result = $this->mysqli->query($SQL);
if ($this->Result == true)
return true;
else
die('Problem with Query: ' . $this->SQL);
}
/**
* @desc Get the results
*
* @param $field Select a single field, or leave blank to select all.
* @return
*/
public function Get($field = NULL)
{
if ($field == NULL)
{
$data = array();
while ($row = $this->Result->fetch_array(MYSQLI_BOTH))
{
$data[] = $row;
}
}
else
{
$row = $this->Result->fetch_array(MYSQLI_BOTH);
$data = $row[$field];
}
/** Make sure to close the Result Set */
$this->Result->close();
return $data;
}
/**
* @desc Automatically close the connection when finished with this object.
*/
public function __destruct()
{
$this->mysqli->close();
}
}
$DB = new DB($config);
Ez a class DB a mysqli nevű modult használja az adatbázis műveletekhez, így ezzel párhuzamosan nem tudod használni a sima mysql_ kezdetűeket. Nem tudod ezt a class DB-t egyszerűen kihajítani? Hemzseg a hibáktól. Ehhez képest egy sima, osztályt nem használó spagettikód is jobb megoldás.
[ Szerkesztve ]
x gon' give it to ya
Talán ha a
$result = mysql_query("SELECT id FROM categories WHERE name='$name'");
sort erre cserélnéd, esetleg működne.
$DB->Query("SELECT id FROM categories WHERE name='$name'");
$result = $DB->Get("id");
[ Szerkesztve ]
x gon' give it to ya
Tökéletesen működik, köszönöm.
Valami ilyesmi megteszi a $DB helyett:
$con = mysql_connect("127.0.0.1","root","","onlab");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
? :)
[ Szerkesztve ]
Igen, csak itt is fennáll az a helyzet, hogyha használsz egy módszert, akkor a programban következetesen végig azt érdemes használni. Ha mysql_connect, akkor nem a $DB-t használod, hanem mindenhol mysql_query-t, pl.
x gon' give it to ya
Bár asszem már ezt priviben megbeszéltük (már keverem a dolgokat, de mintha épp veled beszéltem volna erről), de az ilyen tákolt wrapperosztályok adatbázis-kapcsolódáshoz, query-khez már csak azért is feleslegesek, mert lényegében indokolatlanul felfedezed a spanyolviaszt, becsomagolod az alapvető műveleteket egy saját osztályba, de úgy, hogy pl. a MySQLi vagy PDO neked már eleve objektumorientált kezelhetőséget kínál, plusz kezeli azt az elképesztő sok hibalehetőséget (vagy legalább azok nagy részét), amikre Te csak hosszú évek kínszenvedései alapján jönnél rá (nem kevés ideje javítják ezeket az osztályokat is a PHP-ben).
Ahogy már javasolta fordfairlane is, én is azt tanácsolnám, hogy egyszerűen dobd ki ezt az osztályt, és térj át a PDO-ra vagy akár egy komoly ORM-re, és következetesen használd.
Sk8erPeter
<?php
if( isset( $_COOKIE['user'] ) )
{
var_dump($_COOKIE);
}
else
{
header("location:../index.html");
}
?>
Na most, ezzel az a baj, hogy ha belépek akkoris visszadob az index.html-re, de a jó benne az, hogy kívülről sem lehet megnyitni. Mit csinálok rosszul?
https://heureka-kreativ.hu
(#10168) Sk8erPeter válasza trisztan94 (#10167) üzenetére
Beállítod valahol egyáltalán a $_COOKIE['user']-t?
Egyébként értelmesebb lenne akkor már $_SESSION-t használni (session_start()-tal).
Sk8erPeter
(#10169) trisztan94 válasza Sk8erPeter (#10168) üzenetére
Igen, a Connect.php-ban, a login_successful.php-ban hivatkozok is rá, és működik, szóval nem nagyon értem miért nem jó :S A lényeg az, hogy ha van cookie akkor marad a fooldal.php-n, ha nincs akkor visszaléptet az index.html-re, ahol a bejelentkezés van
https://heureka-kreativ.hu
Amint írtad, az adott oldal alapvetően bejelentkezés alapú.
Ebből kifolyólag az adott belépési módon kellene az adott html-t is "levédeni".
mod:
Közben látom született új hsz.
Ha máshol, azaz a bejelentkezés is ezen az alapon működik, akkor passz.
Alapvetően a bejelntkezéshez is le lehet rakni-vizsgálni ugyanúgy egy user kulcsot cska akkor az a $_SESSION tömb lesz.
[ Szerkesztve ]
- http://pazsitz.hu -
a belépési mód _post, és session alapú, de sessionnal fogalmam sincs hogy kéne megcsinálni, szóval maradt a cookie
https://heureka-kreativ.hu
Jó, rájöttem. A lehető legegyszerűbbre nem gondoltam
if( $_COOKIE["user"] == null)
{
header("location:../index.html");
}
?>
https://heureka-kreativ.hu
sessionnal mondjuk létrehozol egy sütit user néven, és beállítod az értékének a felhasználó nevet.
"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."
Tehát ha jól értem, akkor ennyi elég az általam használt osztály helyett:
$host = '127.0.0.1';
$user = 'root';
$pass = '';
$dbname = 'onlab';
$DB = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
Kipróbáltam, működik, de nem tudom, hogy erre gondoltatok-e.
Csak ez a PDO létezik.
"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."
Oké, nekem ez teljesen új dolog.
Megnéztem a dokumentációt és az adatbázis műveleteimet remélhetőleg sikerült szabályosra cserélni.
Itt egy kis tutorial: [link], továbbá javaslom, hogy csinálj belőle egy osztályt, mondjuk egyke tervezési mintával és akkor többet már nem lesz szükséged arra, hogy megírd. Kiindulási alapnak ez elég.
Mindjárt jön kutyi és kikapok, hogy miket linkelgetek
"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."
Hát mégsem működik. Ez a kódom most, kívülről nem lehet megnyitni, de az a baj, hogy bejelentkezésnél is ezt dobja ki...
Checklogin.php:
$myusername=$_POST['user'];
$mypassword=$_POST['password'];
setcookie(user, $myusername, time()+3600);
fooldal.html
if ($_COOKIE["user"] != null)
{
if($_COOKIE["user"] != "felh1")
{
header("location:../php/not_logged_in.php");
}
else if($_COOKIE["user"] != "felh2")
{
header("location:../php/not_logged_in.php");
}
else if($_COOKIE["user"] != "felh3")
{
header("location:../php/not_logged_in.php");
}
}
else
{
header("location:../php/not_logged_in.php");
}
Igazából 3 admin van jelenleg az oldalon, az egyik én vagyok. Nekik szeretném először biztosítani a belépést, majd egy külön adatbázisban a felhasználókét.
https://heureka-kreativ.hu
"Mindjárt jön kutyi és kikapok, hogy miket linkelgetek"
Miről beszélsz? Miért szólnék be azért, hogy belinkelsz egy tutorialt? Magyarázatot követelek.
Inkább Athlon64+ fogja letépni a fejedet a Singleton-minta javasolásáért.
(#10174) papa019 : igen, erre gondoltam.
Sk8erPeter
Nem értem miért baj a Singleton. Én szeretem alkalmazni. Régebben mindig Sebességszabi is kikapott a linkelésért
[ Szerkesztve ]
"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."
Szia,
Én így csináltam meg .
a lap tetejére:
if(!$session->is_logged_in()){
redirect_to("../sign_in.php");
session.php :
private $logged_in=false;
class Session {
function __construct() {
session_start();
$this->check_message();
$this->check_login();
if($this->logged_in) {
ha be van jelentkezve
} else {
ha nincs
}
}
public function is_logged_in() {
return $this->logged_in;
}
}
private function check_login() {
if(isset($_SESSION['user_id'])) {
$this->user_id = $_SESSION['user_id'];
$this->logged_in = true;
} else {
unset($this->user_id);
$this->logged_in = false;
}
}
$session = new Session();
$message = $session->message();
Asszem nem hagytam ki semmit.
Szerk: de persze, hogy kihagytam
function redirect_to( $location = NULL ) {
if ($location != NULL) {
header("Location: {$location}");
exit;
}
}
[ Szerkesztve ]
(#10182) Peter Kiss válasza trisztan94 (#10172) üzenetére
Ez biztosan nem jó, legalább egy E_NOTICE-t dob rá a PHP, hiszen az index (user) nem feltétlenül található meg a tömbben.
setcookie(user, $myusername, time()+3600);
Szintén hibaforrás, szerintem nincs user nevű konstansod (E_NOTICE szintén), tedd idézőjelek közé ("user").
Kapcsold be a PHP hibák megjelenítését!
Olvass vissza, #9911 környékén kezdődött a vita a Singletonokról.
Linkek esetén meg legfeljebb akkor szóltam be, ha a linken található tutorial gány megoldásokat mutatott be, nem szoktam ok nélkül pampogni, mindig megmagyarázom, ha valami baj van a linkelt cuccal. Legközelebb az indoklást is olvasd el, hátha átjön.
[ Szerkesztve ]
Sk8erPeter
Nem baj a singleton, csak nincs igazán értelme egy php-s adatbázis osztálynál, fölöslegesen bonyolítja a kódot.
Működik
Köszönöm szépen!
https://heureka-kreativ.hu
(#10186) trisztan94 válasza Peter Kiss (#10182) üzenetére
Hát, én CODA-t használok macen, nem hiszem, hogy azon belehet
https://heureka-kreativ.hu
Hogyhogy nincs értelme?
x gon' give it to ya
Jól van, csak kötözködni akartam
"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."
(#10189) Sk8erPeter válasza trisztan94 (#10186) üzenetére
Ha a PHP telepítve van, és működik, akkor ahhoz tartozik egy konfigurációs fájl is (php.ini), ott pedig be lehet állítani, csak meg kell keresni azt az adott fájlt.
Ha nagyon nincs kedved vele tökölni, akkor a fájlod elejére beteheted ezt:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL | E_STRICT);
=======
(#10188) mobal: neszóljábe!
Sk8erPeter
Költői kérdés: lassan reinstall lesz. Wamp vagy Xampp? (Csak ez a két opció!)
"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."
ezen meg egy kicsit javitani kellene szerintem. a $logged_in valtozonak az osztalyon belul lenne a helye, raadasul a zarojelezes se stimmel, valamint nem kavarnam ossze a session kezelest es a user autentikaciot egy osztalyon belul.
en egy egyszerubb session kezelo osztalyt ilyen funkciokkal tudnek elkepzelni: start, set, get, unset, destroy (utobbi ketto mehetne egy helyre - pl.: egy default ertekkel rendelkezo parameterrel)
az autentikaciot tartalmazo osztaly meg a "session wrapper" osztaly segitsegevel manipulalna a $_SESSION tombot
mod: ja meg ugye erdemes lenne a camelCase nevkonvenciot kovetni
[ Szerkesztve ]
some men just wanna watch the world burn...
Költői kérdésekre nincs válasz. Ez nagyon is gyakorlati kérdés. Én eddig XAMPP-t használtam Windows alatt, de mostanában gondolokodom a WAMP-on, a XAMPP-ot már régóta nem frissítették.
x gon' give it to ya
LAMP. Tessék kitörni végre a windows bűvköréből. A szervereken amúgy is általában linux van, szóval próbáld meg a teszt- és fejlesztői környezetet a leginkább összehangolni az élessel.
Nem kötekedésből, de nálunk kb 50 szerverből csak egy linux van (az is kényszerből).
AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
És ez mennyire általános? Csak tisztázásképpen, nekem elég kicsiny tapasztalatom van, szóval kíváncsi vagyok a véleményedre.
Az erősen cégcsoportfüggő. Az előző munkahelyemen meg csak kényszerből voltak windows-os szervereink. Gyakorlatilag csak a login, levelezpőszerver és néhány fejlesztett alkalmazás szervere volt windows - a többi solaris volt és linux (összesen kb 100-150 szerver).
Ez a dolog - nagy cégeknél - nem rendszergazdai döntés eredménye. Ez a vállalatvezetők hitkérdése.
AE
[ Szerkesztve ]
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
a $logged_in természetesen az osztályon belül van, csak nem egyszerre copyztam és így sikerült kutyafuttában. A zárójelezés is copy hiba.
egyelőre ez tökéletesen működik, persze, percről percre változik. A camelCase-t használom, de csak html-ben, nekem php-ben úgy összefolynak a dolgok.
Akkor is harmadik opció : IIS+kattintgatós Web Platform Installer+MySQL+FastCGI PHP.
Totál felesleges Windows-ra rákényszeríteni az Apache-ot: lassabb, mint az IIS (ezen a platformon).
===
(#10196) ArchElf :
"Ez a vállalatvezetők hitkérdése."
Meg gondolom anyagi kérdés is - ha valahol nincs pénz Windows-os liszenszekre, vagy másra szánják azt a pénzt inkább, akkor maradnak a Linuxnál.
===
(#10193) Siriusb : a Windows-fika témája lejárt lemez.
Sk8erPeter
Solaris sem olcsó (főleg, hogy egy sun clustert bérelt a cég a régi MF helyébe). Ja és Oracle volt szinte az összes adatbázis. Nem pénzkérdés volt, hanem hitkérdés - ahogy itt is.
AE
Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]
"ja meg ugye erdemes lenne a camelCase nevkonvenciot kovetni"
Na, jó is, hogy nyitottad a témát, már akartam ebben a témában veletek eszmecserét folytatni.
A PHP beépített függvényei sem mindig konzekvensek, sokszor kevertek a névkonvenciók, de azért a legtöbb "globális" függvény neve következetesen underscore-ral ellátott, míg az objektumorientált kód (lásd PDO, DateTime class, stb.) metódusai a camelCase-konvenciót követik. Aztán a .NET-es konvenciókhoz hasonlóan lehet látni egy-két kódban Pascal case-t is, de ez a ritkább eset, már amennyire legalábbis én eddig észrevettem.
Én általában inkább követem az eredeti szokásokat, tehát osztályon belüli metódusoknak én is camelCase-neveket adok, globális függvényeknek pedig underscore-ral ellátottat, de néha a mai napig belekavarodom, és van, hogy keverem a kettőt, aztán utólag persze javíthatom következetes névre. Bár általában törekszem az objektum-orientált kódra, van, amikor ezt mellőznöm kell, pl. a Drupal használatánál, ami egyelőre erősen procedurális (okok itt olvashatók, amúgy is érdekes cikk), és itt is az underscore használata a jellemző a függvényeknél.
Nálatok mi a bevett szokás?
Maradtok annál, hogy OOP-s jellegű kódolásnál camelCase, procedurális kódolásnál underscore, vagy következetesen ragaszkodtok az egyik konvencióhoz?
Sk8erPeter